VHDL电子闹钟设计全过程Word文档下载推荐.docx
- 文档编号:16153674
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:54
- 大小:171.46KB
VHDL电子闹钟设计全过程Word文档下载推荐.docx
《VHDL电子闹钟设计全过程Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《VHDL电子闹钟设计全过程Word文档下载推荐.docx(54页珍藏版)》请在冰豆网上搜索。
INSTD_LOGIC;
----BUTTONINPUT
SEL:
-----BUTTONINPUT
RESET:
---BUTTONINPUT
CLK:
INSTD_LOGIC;
-----CRYSTALINPUT
ALARM_SIG:
OUTSTD_LOGIC;
-----ALARMPULSE
LCD_DATA:
outstd_logic_vector(7downto0);
--LCD8bit数据总线
LCD_RS:
outstd_logic;
--寄存器选择信号1-数据0-指令
LCD_RW:
--读写信号1-读0写
LCD_EN:
outstd_logic--LCD使能信号
);
END;
ARCHITECTUREONEOFALARMER_TOPIS
COMPONENTCLEAR_TOPPORT(
CLK:
-----200HZ
SEL_KEY:
------SELECTEKEY
ADJ_KEY:
------ADJUSTKEY
SEL_OUT:
OUTSTD_LOGIC;
-----SELECTESENDOUTSIGNAL
ADJ_OUT:
OUTSTD_LOGIC------ADJUSTSENDOUTSIGNAL
ENDCOMPONENT;
COMPONENTLCD_DERVER_TOP
PORT(
CLK_TRA:
--译码器时钟
CLK_DER_EN:
---------驱动使能
CLK_DER:
----驱动时钟
CLK_TRA_EN:
------译码器使能
TIMEIN:
INSTRING(1to16);
--时间输入
ALARMIN:
INSTRING(1TO16);
--闹钟时间输入
LCD_DATA:
LCD_RS:
LCD_RW:
LCD_EN:
COMPONENTDIVIDER
PORT(
CLK_20M:
CLK_1MHZ:
CLK_200HZ:
CLK_4HZ:
CLK_1HZ:
OUTSTD_LOGIC
ENDCOMPONENT;
COMPONENTCLOCK
EN_S:
-----时钟使能信号
------1HZ的脉冲信号
RSET:
-----复位信号
SEL_S:
-------选择信号
ADJ_S:
------调整信号
HOUR_OUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
-----小时输出
MINITE_OUT:
-----分钟输出
SECOND_OUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)------秒输出
COMPONENTTRANSLATE
PORT(
CLK_1HZ:
CLK_W:
SELE_S:
TIM_S:
INSTD_LOGIC_VECTOR(7DOWNTO0);
TIM_M:
TIM_H:
ARL_M:
ARL_H:
TIM_OUT:
OUTSTRING(1TO16);
ARL_OUT:
OUTSTRING(1TO16)
);
COMPONENTARL_SET
ADJ:
SEL_S:
CLK_1S:
H_IN:
M_IN:
H_OUT:
M_OUT:
SIG:
SIGNALTR_1MHZ,CLOCK_1HZ,A4HZ,LCD_200HZ:
STD_LOGIC;
-------CLKSIGNAL
SIGNALSEL_SI,ADJ_SI:
STD_LOGIC;
--------ADJUSTTIMEANDALARMERBUTTONINPUT
SIGNALC_S_T,C_M_T,C_H_T,A_M_T,A_H_T:
STD_LOGIC_VECTOR(7DOWNTO0);
------ASKM8BITBUS
SIGNALT_STRING,A_STRING:
STRING(1TO16);
BEGIN
U1:
CLOCKPORTMAP(
EN_S=>
'
1'
-----时钟使能信号
CLK=>
CLOCK_1HZ,------1HZ的脉冲信号
RSET=>
RESET,-----复位信号
SEL_S=>
SEL_SI,-------选择信号
ADJ_S=>
ADJ_SI,------调整信号
HOUR_OUT=>
C_H_T,-----小时输出
MINITE_OUT=>
C_M_T,-----分钟输出
SECOND_OUT=>
C_S_T------秒输出
);
U2:
ARL_SETPORTMAP(
ADJ=>
ADJ_SI,
SEL_SI,
CLK_1S=>
LCD_200HZ,
H_IN=>
C_H_T,
M_IN=>
C_M_T,
H_OUT=>
A_H_T,
M_OUT=>
A_M_T,
SIG=>
ALARM_SIG
U3:
TRANSLATEPORTMAP(
CLK_1HZ=>
A4HZ,
CLK_W=>
TR_1MHZ,
SELE_S=>
SEL_SI,
TIM_S=>
C_S_T,
TIM_M=>
C_M_T,
TIM_H=>
ARL_M=>
A_M_T,
ARL_H=>
TIM_OUT=>
T_STRING,
ARL_OUT=>
A_STRING
U4:
LCD_DERVER_TOPPORTMAP(
CLK_TRA=>
TR_1MHZ,--译码器时钟
CLK_DER_EN=>
---------驱动使能
CLK_DER=>
LCD_200HZ,----驱动时钟
CLK_TRA_EN=>
------译码器使能
TIMEIN=>
T_STRING,--时间输入
ALARMIN=>
A_STRING,--闹钟时间输入
LCD_DATA=>
LCD_DATA,--LCD8bit数据总线
LCD_RS=>
LCD_RS,--寄存器选择信号1-数据0-指令
LCD_RW=>
LCD_RW,--读写信号1-读0写
LCD_EN=>
LCD_EN--LCD使能信号
U5:
CLEAR_TOPPORTMAP(
LCD_200HZ,-----200HZ
SEL_KEY=>
SEL,------SELECTEKEY
ADJ_KEY=>
ADJ,------ADJUSTKEY
SEL_OUT=>
SEL_SI,-----SELECTESENDOUTSIGNAL
ADJ_OUT=>
ADJ_SI------ADJUSTSENDOUTSIGNAL
U6:
DIVIDERPORTMAP(
CLK_20M=>
CLK,
CLK_1MHZ=>
CLK_200HZ=>
CLK_4HZ=>
A4HZ,
CLOCK_1HZ
END;
五、各个模块的功能及其代码
(1)、消除抖动模块
消除抖动有很多的方法,有在某段时间里取第一个上升沿,有某个信号(高电平或者低电平)持续某个时间值以上,有的信号在长按得情况下能输出一个连续平稳脉冲。
总而言之就是不能让一次按键输入产生多次按键输入信号。
这里使用的是在某个信号持续5毫秒以上算一次信号。
代码如下
这里的消抖不能实现两个按键同事按下同时生效
ENTITYCLEAR_TOPIS------防抖模块
ARCHITECTUREONEOFCLEAR_TOPIS
COMPONENTCLEAR_TREMBLEIS
PORT(
KEY:
WOUT:
OUTSTD_LOGIC-----SELECTESENDOUTSIGNAL
CLEAR_TREMBLEPORTMAP(
CLK=>
CLK,
KEY=>
SEL_KEY,
WOUT=>
SEL_OUT
CLEAR_TREMBLEPORTMAP(
ADJ_KEY,
ADJ_OUT
二级文件
ENTITYCLEAR_TREMBLEIS------防抖模块
ARCHITECTUREONEOFCLEAR_TREMBLEIS
SIGNALCOUNT:
INTEGERRANGE0TO50:
=0;
SIGNALW:
WOUT<
=W;
P1:
PROCESS(CLK)
BEGIN
IFKEY='
0'
THEN
W<
='
;
COUNT<
ELSIFCLK'
EVENTANDCLK='
IFCOUNT=50THEN
COUNT<
=COUNT;
ELSIFCOUNT=49THEN
COUNT<
=COUNT+1;
W<
ELSIFCOUNT<
49THEN
ENDIF;
ENDIF;
ENDPROCESS;
(2)分频模块
实现20M脉冲信号输入四种分频输出
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYDIVIDERIS
ARCHITECTUREONEOFDIVIDERIS
SIGNALK1M:
INTEGERRANGE1TO11:
=1;
SIGNALK200HZ:
INTEGERRANGE1TO2501:
SIGNALK4HZ:
INTEGERRANGE1TO126:
SIGNALK1HZ:
INTEGERRANGE1TO3:
SIGNALV1M,V200HZ,V4HZ,V1HZ:
STD_LOGIC:
CLK_1MHZ<
=V1M;
CLK_200HZ<
=V200HZ;
CLK_4HZ<
=V4HZ;
CLK_1HZ<
=V1HZ;
PROCESS(CLK_20M)
BEGIN
IFCLK_20M'
EVENTANDCLK_20M='
IFK1M<
10THEN
K1M<
=K1M+1;
ELSIFK1M>
9THEN
V1M<
=NOTV1M;
ENDIF;
P2:
PROCESS(V1M)
IFV1M'
EVENTANDV1M='
IFK200HZ<
500THEN
K200HZ<
=K200HZ+1;
ELSIFK200HZ>
499THEN
V200HZ<
=NOTV200HZ;
ENDPROCESS;
P3:
PROCESS(V200HZ)
IFV200HZ'
EVENTANDV200HZ='
IFK4HZ<
125THEN
K4HZ<
=K4HZ+1;
ELSIFK4HZ>
124THEN
V4HZ<
=NOTV4HZ;
P4:
PROCESS(V4HZ)
IFV4HZ'
EVENTANDV4HZ='
IFK1HZ<
2THEN
K1HZ<
=K1HZ+1;
ELSIFK1HZ>
1THEN
V1HZ<
=NOTV1HZ;
但在这次项目中200HZ被修改为2000HZ这样的工作频率可以在多个模块使用。
例如时间调整,输出的2000HZ。
Lcd使用的也是2000HZ工作时钟。
(3)时钟计时模块
本人也是初学VHDL在这里饶了很多弯子
<
1>
、先列出VHDL的语法要求
(1)不能在一个进程里写入多个触发信号
(2)不能在触发事件内外对同一个信号赋值
(3)不能在多个进程对同一个信号赋值
(4)进程不能嵌套,并行使用
(5)信号赋值与变量赋值有很大区别
(6)变量的生命长度只在进程结束前
(7)模块输出的信号不能在本模块读取(顶层文件设计时要注意。
)
2>
、VHDL的设计理念
当你写每一代码是都要想到该代码实现什么电路。
例如当你设一个变量时电路会开辟一个存储空间。
当你写入event是要知道产生了一个触发器。
3>
、事件被调整后要返回到计数器,这个是我最初没有注意的。
设计的顶层文件如下
ENTITYCLOCKIS
ENDCLOCK;
ARCHITECTUREONEOFCLOCKIS
COMPONENTCOUNTER_24
PORT(
SEL_S:
ININTEGERRANGE0TO5;
CLK:
RESET:
ADJED:
COUNT24:
CURRENT_24:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);
COMPONENTCOUNTER_60IS
CO_60_CA:
COUNT_60:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)-------60COUNTER
COMPONENTCOUNTER_60_M
INSTD_LOGIC_VECTOR(7DOWNTO0);
-------60COUNTER
CURRENT_60:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)-------CURRENT
COMPONENTMIN_ADJ
SEL_BUTTON:
------SELECTBUTTONTOCHICECWHETHERTOADJUST
ADJ_S:
---------------ADJUSTBUTTON
MIN_TIME:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VHDL 电子 闹钟 设计 全过程