VHDL设计方案多功能数字钟.docx
- 文档编号:4711087
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:22
- 大小:563.86KB
VHDL设计方案多功能数字钟.docx
《VHDL设计方案多功能数字钟.docx》由会员分享,可在线阅读,更多相关《VHDL设计方案多功能数字钟.docx(22页珍藏版)》请在冰豆网上搜索。
VHDL设计方案多功能数字钟
EDA期末作业
班级:
020914
(一)选题目的
学习使用QuartusII9.0,巩固已掌握的EDA知识,增强自己的动手实践能力。
(二)设计目标
实现多功能数字钟的设计,主要有以下功能:
①计时,并且可以24小时制和12小时制转换。
②闹钟
③整点报时
④秒表
(三)实现方案
该课题的实现过程大体如下:
先对4MHZ的信号进行分频使其变为1HZ;将该信号加入计数器中(模60和模24/12)实现基本时钟功能;然后在此基础上加入闹钟,秒表,整点报时,24/12小时制转换模块;最后在动态显示电路中实现上述功能。
(四)设计过程、模块仿真及实现结果
一、分频器
分频器的VHDL语言为(4M分频)
libraryieee。
useieee.std_logic_1164.all。
useieee.std_logic_unsigned.all。
entityfenpinqiis
port(
clk_in:
instd_logic。
clk_out:
outstd_logic)。
endfenpinqi。
architecturebehivoroffenpinqiis
signalcou:
std_logic_vector(21downto0)。
begin
process(clk_in)
begin
ifclk_in'eventandclk_in='1'then
cou<=cou+1。
endif。
endprocess。
process(cou)
begin
clk_out<=cou(21)。
endprocess。
endarchitecturebehivor。
完成4Mhz到1hz的转换
仿真结果略。
二、计时器(模60,模24,模12)
模60设计的电路图如下
模24/12计数器如下
合成模块分别如下
仿真波形如下
M60
波形分析:
ql[3..0]从0变到9,qh[3..0]从0变到5,当clk经过60个周期后,co输出一个脉冲。
从而实现模60计数器的功能。
M24/12
模12计数器(sv6=0)
模24计数器(sv6=1)
波形分析:
由于要进行24/12小时制的转换,所以加入开关sv6来控制转换模24和模12计数器。
由波形图可以看出,模24和模12功能均已实现。
计时器总电路为
三、动态显示功能
1、由sv3和sv8来控制转换正常计数器、闹钟、秒表的转换。
当sv3=0、sv8=0时,显示正常计时器;当sv3=0、sv8=1时,显示秒表;当sv3=1时,显示闹钟。
实现此功能的VHDL语言如下:
libraryieee。
useieee.std_logic_1164.all。
useieee.std_logic_unsigned.all。
entitymandis
port(
sv3,sv8:
instd_logic。
sl,sh,ml,mh,hl,hh,ap,d,rsl,rsh,rml,rmh,rhl,rhh,rap,rd,swa,swb,swc,swd:
instd_logic_vector(3downto0)。
asl,ash,aml,amh,ahl,ahh,aap,ad:
outstd_logic_vector(3downto0)
)。
endmand。
architecturearcofmandis
signaltmp:
std_logic_vector(3downto0)。
begin
process(sv3)
begin
if(sv3='0')then
ifsv8='0'then
asl<=sl。
ash<=sh。
aml<=ml。
amh<=mh。
ahl<=hl。
ahh<=hh。
aap<=ap。
ad<=d。
else
asl<=swa。
ash<=swb。
aml<=swc。
amh<=swd。
ahl<="1010"。
ahh<="1010"。
aap<="0000"。
ad<="1010"。
endif。
else
asl<=rsl。
ash<=rsh。
aml<=rml。
amh<=rmh。
ahl<=rhl。
ahh<=rhh。
aap<=rap。
ad<=rd。
if(rap="0010"andrhh="0000"andrhl="0000")then
ahh<="0001"。
ahl<="0010"。
endif。
endif。
endprocess。
endarc。
2、数据选择器VHDL语言描述如下:
libraryieee。
useieee.std_logic_1164.all。
useieee.std_logic_unsigned.all。
entitychsis
port(
clk:
instd_logic。
sl,sh,ml,mh,hl,hh,ap,d:
instd_logic_vector(3downto0)。
data:
outstd_logic_vector(3downto0)。
en:
outstd_logic_vector(7downto0)
)。
endchs。
architecturearcofchsis
signaltt:
std_logic_vector(2downto0)。
signalt:
integerrange0to30000。
begin
process(clk)
begin
if(clk'eventandclk='1')then
t<=t+1。
ift=30000thentt<=tt+1。
casettis
when"000"=>data<=sl。
en<="11111110"。
when"001"=>data<=sh。
en<="11111101"。
when"010"=>data<=ml。
en<="11111011"。
when"011"=>data<=mh。
en<="11110111"。
when"100"=>data<=hl。
en<="11101111"。
when"101"=>data<=hh。
en<="11011111"。
when"110"=>data<=ap+10。
en<="10111111"。
when"111"=>data<=d。
en<="01111111"。
endcase。
endif。
endif。
endprocess。
endarc。
3、译码显示器的VHDL语言如下:
libraryieee。
useieee.std_logic_1164.all。
entityseg7is
port(a:
instd_logic_vector(3downto0)。
f:
outstd_logic_vector(6downto0))。
endseg7。
architecturearcofseg7is
begin
process(a)
begin
caseais
when"0000"=>f<="1000000"。
when"0001"=>f<="1111001"。
when"0010"=>f<="0100100"。
when"0011"=>f<="0110000"。
when"0100"=>f<="0011001"。
when"0101"=>f<="0010010"。
when"0110"=>f<="0000010"。
when"0111"=>f<="1111000"。
when"1000"=>f<="0000000"。
when"1001"=>f<="0010000"。
when"1010"=>f<="0111111"。
when"1011"=>f<="0001000"。
when"1100"=>f<="0001100"。
whenothers=>f<="1000000"。
endcase。
endprocess。
endarc。
合成模块分别为mand、chs、seg7
总电路合成图为
四、校分校时电路
设计电路如下:
电路分析:
为了保证时钟同步性,时钟的选取依然为1hz,所以o[3..0]均为1hz,o[0]为所采取出正常频率,o[1]为校分频率,o[2]为校时频率,o[3]为校天频率(星期)。
电路中的四个D触发器是简易的防颤抖装置,保证o[3..0]的正常输出。
Sv1和sv2是整个电路功能的控制器。
当sv1sv2=00时,计数器正常工作;当sv1sv2=10时,进行校分工作;当sv1sv2=01时,进行校时工作;当sv1sv2=11时,进行校天工作。
在进行这些工作时,秒钟都停止。
合成模块为setclock
仿真波形如下:
五、整点报时功能
VHDL语言:
libraryieee。
useieee.std_logic_1164.all。
useieee.std_logic_unsigned.all。
entitycallis
port(
okhz,tkhz:
instd_logic。
mh,ml,sh,sl:
instd_logic_vector(3downto0)。
y1:
outstd_logic
)。
endcall。
architecturearcofcallis
begin
process(okhz,tkhz,mh,ml,sh,sl)
begin
if(mh="0101"andml="1001"andsh="0101")then
caseslis
when"0010"=>y1<=okhz。
when"0100"=>y1<=okhz。
when"0110"=>y1<=okhz。
when"1000"=>y1<=okhz。
when"1001"=>y1<=tkhz。
whenothers=>y1<='0'。
endcase。
endif。
endprocess。
endarc。
合成模块如下:
其中okhz代表频率为1khz的信号(由4K分频器获得),tkhz代表频率为2khz的信号(由2khz分频器获得)。
仿真结果为:
波形分析:
当分钟为“59”,秒钟的高位是“5”时,秒钟的低位为“2”、“4”、6”、”8”时,输出y1为低频信号;当秒钟的低位为“9”时,输出为高频信号。
从而实现整点报时功能。
六、闹钟功能
电路图如下
电路说明:
由于闹钟只需要设置分钟、小时,所以分钟、始终为正常计数器,采用原来校分校时的方法来设定闹钟时间。
这里用sv3和sv4构成一个2—4译码器来控制校准的对象。
当sv3=0,sv4=0时,停止校准,分钟,时钟保持数字不变;当sv3=1,sv4=0时,校准分钟,时钟不变;
当sv3=0,sv4=1时,校准时钟,分钟不变。
在闹钟功能中,由于用不到秒钟,所以秒钟始终显示“—”(BCD码表示为1010,)故上图中的ringsec模块就是实现秒钟置“—”功能,其VHDL语言为:
libraryieee。
useieee.std_logic_1164.all。
useieee.std_logic_unsigned.all。
entityringsecis
port(
en:
instd_logic。
rsl,rsh:
outstd_logic_vector(3downto0)
)。
endringsec。
architecturearcofringsecis
begin
process(en)
begin
if(en='1')then
rsl<="1010"。
rsh<="1010"。
endif。
endprocess。
endarc。
合成模块如上图所示(ringsec)。
为了实现闹钟功能,我们还要设计一个比较模块,当计时器与闹钟的时钟、分钟都相等的时候给蜂鸣器一个信号,使其发声。
其VHDL语言如下:
libraryieee。
useieee.std_logic_1164.all。
useieee.std_logic_unsigned.all。
entitycmpis
port(
clk:
instd_logic。
ml,mh,hl,hh,o,rml,rmh,rhl,rhh,ro:
instd_logic_vector(3downto0)。
r:
outstd_logic
)。
endcmp。
architecturearcofcmpis
begin
process(clk)
begin
if(ml=rmlandmh=rmhandhl=rhlandhh=rhh)thenr<=clk。
elser<='0'。
endif。
endprocess。
endarc。
合成模块为cmp:
波形为
由波形可见,当计时器与闹钟的时钟、分钟都相等的时候,输出r会有一个信号。
七、秒表功能
设计电路图如下
合成模块为stw:
仿真波形如下:
八、24小时制转12小时制功能
用一个sv6开关来控制24小时制和12小时制。
当sv6=0时为12小时制;当sv6=1时为24小时制。
1、24小时制转12小时制的模块(chg)
libraryieee。
useieee.std_logic_1164.all。
useieee.std_logic_unsigned.all。
entitychgis
port(
sv6:
instd_logic。
hh,hl,ap:
instd_logic_vector(3downto0)。
chh,chl,cap:
outstd_logic_vector(3downto0)
)。
endchg。
architecturearcofchgis
begin
process(sv6,hh,hl,ap)
begin
if(sv6='0')then——原来是24小时制,sv6变为0,需要进行24转12的工作
casehhis
when"0000"=>chh<=hh。
chl<=hl。
cap<="0001"。
——小时高位为0时不需要变化,只需再显示一个“A”,即cap=”0001”
when"0001"=>
ifhl<"0010"thenchh<=hh。
chl<=hl。
cap<="0001"。
elsechh<="0000"。
chl<=hl-2。
cap<="0010"。
endif。
——12以下数字不变,显示“A”,13~19小时高位变0,低位减2,显示“P”
when"0010"=>cap<="0010"。
ifhl<"0010"thenchl<=hl+8。
chh<="0000"。
——20~21点的变化
elsechl<=hl-2。
chh<="0001"。
——22~23点的变化
endif。
whenothers=>null。
endcase。
else——原来是12小时制,sv6变为1,需要进行12转24的工作
ifap="0001"thenchh<=hh。
chl<=hl。
——AM的转换,数字都不变,只是不显示“A”,显示“—”
endif。
ifap="0010"then
ifhl<"1000"thenchh<=hh+1。
chl<=hl+2。
——下午1~8点的转换
elsechl<=hl-8。
chh<=hh+2。
——下午8~11点的转换
endif。
endif。
cap<="0000"。
——换成24小时制后,原来现实A、P的管显示“—”
endif。
endprocess。
endarc。
2、当变化sv6时,还要对原来计时器的电路(包括闹钟中的计时电路)中的小时位进行摸12和摸60的转换。
转换电路如下(newm24):
其中左上角的dmc模块是作为数据选择器74157控制信号发声器(即单脉冲发声器),其内部电路如下所示(dmc)
Newm24模块合成为
Newm24和dmc的仿真结果如下:
Newm24电路说明:
为了能在拨动开关sv6的同时进行模24模12转换,必须在开关拨动的同时使其能产生一个时间长度大于计时器一个周期,不大于其两个周期的单脉冲信号,从而保证在计时器时钟边沿到来时,能将chg所产生的转换信号置数到计数器。
(上图中的chh[3..0]和chl[3..0]为上述VHDL语言所编程序中的输出信号)。
当sv6发生变化时,dmc会产生一个值为0的单脉冲,置数端信号为0,计数器将chh[3..0]、chl[3..0]分别置入计时器时钟的十位和个位;当sv6不变时,数据选择器选择的数均为“0000”,计数器正常计数至11或23时发生置数,正常计数。
合成后的总电路图为
开关对应功能表
Sv1、sv2
Sv1和sv2是整个电路功能的控制器。
当sv1sv2=00时,计数器正常工作;当sv1sv2=10时,进行校分工作;当sv1sv2=01时,进行校时工作;当sv1sv2=11时,进行校天工作
Sv3、sv8
由sv3和sv8来控制转换正常计数器、闹钟、秒表的转换。
当sv3=0、sv8=0时,显示正常计时器;当sv3=0、sv8=1时,显示秒表;当sv3=1时,显示闹钟
Sv5
控制秒表
Sv3、sv4
sv3和sv4构成一个2—4译码器来控制校准的对象。
当sv3=0,sv4=0时,停止校准,分钟,时钟保持数字不变;当sv3=1,sv4=0时,校准分钟,时钟不变;
当sv3=0,sv4=1时,校准时钟,分钟不变
Sv6
当sv6=0时为12小时制;当sv6=1时为24小时制
(五)遇到的困难
各个模块之间的链接修改了很多次,提前没有整体构思好,单个模块设计好以后总是会在模块间的组合上出现接口不对应的情况。
在24/12小时制模块chg的设计中,不同的时间转换考虑的不周全(例如下午1~7点和下午8~11点的变化不一样)
自己对知识的掌握还是不够好,有许多模块设计了很长的时间(无论是构思还是具体编程)。
(六)对课程的建议
EDA课程上完以后,我感觉这门课程实际应用很强。
非常锻炼动手能力,与其他的课程很不一样。
希望学校增加该课的课时。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VHDL 设计方案 多功能 数字