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