数显电子钟系统设计.docx
《数显电子钟系统设计.docx》由会员分享,可在线阅读,更多相关《数显电子钟系统设计.docx(16页珍藏版)》请在冰点文库上搜索。
数显电子钟系统设计
数显电子钟系统设计
实验名称:
数显电子钟系统设计
实验目的:
1.学习系统设计方法
2.设计一个电子钟系统
实验步骤:
电子钟框图→按Top_Down方法作功能分割→画出各层的功能模块图(注明port)、画出模块连接关系,并分配I/O管脚→VHDL编码、仿真、综合。
实验要求:
1.能够对S(秒)、MIN(分)、Hr(小时)进行计时,按24小时计时制。
2.要求采用Top_Down的设计方法
系统功能和个模块功能详细描述:
电子钟主要有四个组成部分:
时基分频器,计时器,显示电路,控制电路,实验通过4MHz时钟,分频产生S(秒)时钟,对S(秒)信号计数,并通过LED数码管进行扫描显示。
a)时基分频器:
对基本时钟(4MHZ)进行分频得到S(秒)时钟(1HZ)和扫描时钟(250HZ)。
b)计时器:
主要包括S计时器(60进制)、MIN计时器(60进制)、Hr计时器(24进制)
c)显示电路:
:
用6位扫描数码显示(七段数码管),扫描始终用250Hz。
d)控制电路:
对电子表进行启停和复位,清零的控制。
每个模块的具体实现过程:
1.时基分频模块:
设计思想:
利用N位二进制计数器进行分频,第0位是二分频,第一位是四分频,以次类推。
故要将4MHZ时钟产生1HZ时钟须22位二进制计数器(21downto0)对其进行分频。
最后将13位和21位输出即是250HZ和1HZ时钟。
关键代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYclk_divIS
PORT(clk:
INSTD_LOGIC;
RESET:
inSTD_LOGIC;
clk_250HZ:
OUTSTD_LOGIC;
clk_1HZ:
OUTSTD_LOGIC);
ENDclk_div;
ARCHITECTURErtlOFclk_divIS
SIGNALcount:
STD_LOGIC_VECTOR(21DOWNTO0);
BEGIN
PROCESS(clk,reset)
BEGIN
ifRESET='1'then
count<=(others=>'0');
elsif(clk'eventANDclk='1')THEN
Count<=count+1;
ENDIF;
ENDPROCESS;
clk_250HZ<=count(13);
--clk_250HZ<=count
(1);
clk_1HZ<=count(21);
--clk_1HZ<=count
(2);
ENDrtl;
仿真波形:
心得体会:
对4MHZ进行分频产生1HZ时钟,是对原始时钟的4000000分频,如何对其仿真,速度如何,最后结果能否清楚的显示出来确是一个极大的问题。
最后采用如下方式进行仿真:
--clk_250HZ<=count(13);
clk_250HZ<=count
(1);
--clk_1HZ<=count(21);
clk_1HZ<=count
(2);
将原先分频语句屏蔽,利用count
(1),count
(2)实现四分频和八分频,查看仿真波形(如上图),然后还可以适当增大分频数,看仿真波形是否符合设计要求。
2.计时器模块:
设计思想:
利用60进制计数器产生秒计数器、分计数器、利用24进制计数器产生小时计数器,再利用BDE方式产生计时器。
关键代码:
(以下是24进制计数器代码,60进制雷同)
libraryIEEE;
useIEEE.STD_LOGIC_1164.all;
useIEEE.STD_LOGIC_UNSIGNED.all;
entity\60_COUNT\is
port(
CLK:
inSTD_LOGIC;
RESET:
inSTD_LOGIC;
ENABLE:
inSTD_LOGIC;
FULL:
outSTD_LOGIC;
bcd1_out:
outSTD_LOGIC_VECTOR(3downto0);
bcd10_out:
outSTD_LOGIC_VECTOR(3downto0)
);
end\60_COUNT\;
architectureRTLof\60_COUNT\is
signalbcd1,bcd10:
STD_LOGIC_VECTOR(3downto0);
begin
process(CLK,RESET)
begin
if(RESET='1')then
bcd1<=(others=>'0');
bcd10<=(others=>'0');
elsif(CLK='1'andCLK'event)then
if(ENABLE='1')then
if(bcd1=4)then
if(bcd10=2)then
bcd1<=(others=>'0');
bcd10<=(others=>'0');
FULL<='1';
elsebcd1<=bcd1+1;
endif;
elsif(bcd1=9)then
bcd1<=(others=>'0');
bcd10<=bcd10+1;
elsebcd1<=bcd1+1;
endif;
endif;
endif;
endprocess;
bcd1_out<=bcd1;
bcd10_out<=bcd10;
endRTL;
仿真波形:
BDE方式的电路图:
最终的仿真波形:
心得体会:
如上图所示,bcd1,bcd2为小时计数信号,bcd3,bcd4为分计数信号,bcd5,bcd6为秒计数信号,当计满24小时后产生一个FULL脉冲信号。
利用BDE方式进行VHDL代码的设计确实比输入代码要简便得许多,方便,快捷,效率又高!
3.显示模块:
设计思想:
同时点亮七段显示器的七节LED,将需电流:
10mA×7=70mA,若同时点亮6个七段显示器,则总电流高达:
70mA×6=420mA≈0.5A,如此大电流,不但CPLD&FPGA无法负荷;而且这个功率也过大,散热很成问题。
所以采用扫描电路,每次只显示一个七段显示器,6个段码显示器循环轮流显示。
当帧显示频率>24Hz时,显示将不会闪烁。
比如扫描频率取245Hz,则帧显示频率245/6=40.8Hz>24Hz。
扫描原理如图所示:
利用段选和位选,每次扫描一位。
具体实现:
对6进制计数器输出进行位译码,产生位选信号;对6进制计数器输出进行位选者,再经过7段译码产生段选信号。
(这只是一种实现方法,其实还有更简单的方法,在最后对其说明)。
关键代码:
译码电路代码:
libraryIEEE;
useIEEE.std_logic_1164.all;
entitydecis
port(
data_in:
instd_logic_vector(2downto0);
data_out:
outstd_logic_vector(5downto0)
);
enddec;
architecturertlofdecis
begin
process(data_in)
begin
data_out<=(others=>'0');
casedata_inis
when"000"=>data_out<="000001";
when"001"=>data_out<="000010";
when"010"=>data_out<="000100";
when"011"=>data_out<="001000";
when"100"=>data_out<="010000";
when"101"=>data_out<="100000";
whenothers=>NULL;
endcase;
endprocess;
endrtl;
位选者器代码:
libraryieee;
useieee.std_logic_1164.all;
entityselisport(
a,b,c,d,e,f:
instd_logic_vector(3downto0);
s:
instd_logic_vector(2downto0);
x:
outstd_logic_vector(3downto0));
endsel;
architecturearchmuxofselis
begin
process(a,b,c,d,e,f,s)
begin
ifs="000"then
x<=f;
elsifs="001"then
x<=e;
elsifs="010"then
x<=d;
elsifs="011"then
x<=c;
elsifs="100"then
x<=b;
else
x<=a;
endif;
endprocess;
endarchmux;
7段译码相关代码:
libraryIEEE;
useIEEE.STD_LOGIC_1164.all;
entityledis
port(
hex:
inSTD_LOGIC_VECTOR(3downto0);
led:
outSTD_LOGIC_VECTOR(6downto0));
endled;
architecturertlofledis
begin
withHEXselect
LED<="1111001"when"0001",--1
"0100100"when"0010",--2
"0110000"when"0011",--3
"0011001"when"0100",--4
"0010010"when"0101",--5
"0000010"when"0110",--6
"1111000"when"0111",--7
"0000000"when"1000",--8
"0010000"when"1001",--9
"0001000"when"1010",--A
"0000011"when"1011",--b
"1000110"when"1100",--C
"0100001"when"1101",--d
"0000110"when"1110",--E
"0001110"when"1111",--F
"1000000"whenothers;--0
endrtl;
其中7段译码电路仿真波形为:
同样采用BDE方式实现显示电路:
最后的显示电路的仿真波形为:
心得体会:
1.对于较为复杂的电路,采用编制宏仿真要比手动加激励方便得多。
2.本实验中我并未对位选和译码电路进行仿真,但其结果肯定是正确的。
因为我对7段译码电路进行了仿真,如上所示,它和最后总的显示电路仿真结果相吻合。
(我在编制宏时将7段译码电路和总的显示电路的输入信号赋成相同值,所以看波形时一目了然)。
3.运用BDE方式,方便,且不容易出错。
4.控制模块
设计思想:
利用FSM方式实现控制电路:
CLK时钟信号,reset复位信号和启/停信号start。
FSM设计后结果如下:
其仿真波形如图:
最后数显电子钟系统的BDE设计结果为:
经过FPGAExpress综合过的电路图:
优化结果: