EDA计数器设计Word下载.docx
《EDA计数器设计Word下载.docx》由会员分享,可在线阅读,更多相关《EDA计数器设计Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
instd_logic;
----------------------时钟脉冲
clk1:
---------------------数码管选通时钟脉冲
md1:
----------------------模式选择:
0为计时,1为闹钟
md2:
instd_logic_vector(1downto0);
---10为时校正(定时),01为分校正(定时)
speak:
outstd_logic;
-------------------闹钟0
dout:
outstd_logic_vector(6downto0);
--数码管七段码输出
selout:
outstd_logic_vector(2downto0));
---数码管选通输出
endclock;
architectureoneofclockis
signalsel:
std_logic_vector(2downto0);
--------模6计数信号(数码管选通输入)
signalhou1:
std_logic_vector(3downto0);
-------小时十位
signalhou2:
-------小时个位
signalmin1:
-------分钟十位
signalmin2:
-------分钟个位
signalseth1:
------定时小时十位
signalseth2:
------定时小时个位
signalsetm1:
------定时分钟十位
signalsetm2:
------定时分钟个位
signalsec1:
-------秒十位
signalsec2:
-------秒个位
signalh1:
------输出小时十位
signalh2:
------输出小时个位
signalm1:
------输出分钟十位
signalm2:
------输出分钟个位
signals1:
------输出秒十位
signals2:
------输出秒个位
-------------------------------------------------
begin
----------------------------------------------模6计数(数码管选通)
choice:
process(clk1)
ifclk1'
eventandclk1='
1'
then
ifsel="
101"
sel<
="
000"
;
else
=sel+1;
endif;
endif;
endprocesschoice;
selout<
=sel;
-----------------------------------------------小时十位
h110:
process(clk,hou2,min1,min2,sec1,sec2,md1,md2)
ifclk'
eventandclk='
if(hou1="
0010"
andhou2="
0011"
)and(min1="
0101"
andmin2="
1001"
)and
(sec1="
andsec2="
)then
hou1<
0000"
elsifhou1="
andhou2="
andmd1='
0'
andmd2="
10"
thenhou1<
elsif(hou2="
and(min1="
)and(sec1="
and
sec2="
))or(hou2="
=hou1+1;
endprocessh110;
-----------------------------------------------小时个位
h220:
process(clk,min1,min2,sec1,sec2,md1,md2,hou1)
(sec1="
hou2<
elsifhou2="
sec2="
elsif(hou2="
)or(hou1="
hou2<
elsif((min1="
))or
(md1='
=hou2+1;
endprocessh220;
-----------------------------------------------分钟十位
m110:
process(clk,min2,sec1,sec2,md1,md2)
if(min1="
)then
min1<
elsifmin1="
andmin2="
and(md1='
01"
)then
elsif(min2="
and(sec1="
))or(min2="
and
md1='
=min1+1;
endprocessm110;
----------------------------------------------分钟个位
m220:
process(clk,sec1,sec2,md1,md2)
ifmin2="
min2<
elsifmin2="
elsif(sec1="
)or(md1='
=min2+1;
endprocessm220;
---------------------------------------------秒十位
s110:
process(clk,sec1,sec2)
if(sec1="
sec1<
elsifsec2="
then
=sec1+1;
endprocesss110;
--------------------------------------------秒个位
s220:
process(clk,sec2)
ifsec2="
sec2<
elsesec2<
=sec2+1;
endprocesss220;
-------------------------------------------时间设置小时部分
sethour1:
process(clk,seth2)
ifseth1="
andseth2="
seth1<
elsifseth2="
=seth1+1;
endprocesssethour1;
-------------------------------------------
sethour2:
process(clk,md1,md2,seth1)
if(seth1="
)orseth2="
seth2<
elsifmd1='
eth2<
=seth2+1;
endprocesssethour2;
-------------------------------------------时间设置分钟部分
setmin1:
process(clk,setm1,setm2)
ifsetm1="
andsetm2="
setm1<
elsifsetm2="
=setm1+1;
endprocesssetmin1;
----------------------------------------------
setmin2:
process(clk,md1,md2,setm2)
ifsetm2="
setm2<
=setm2+1;
endprocesssetmin2;
--------------------------------------------闹铃
speaker:
process(clk1,hou1,hou2,min1,min2)
ifseth1=hou1andseth2=hou2andsetm1=min1andsetm2=min2then
if(sec2="
orsec2="
orsec2="
0100"
0110"
1000"
)then
speak<
='
elsespeak<
endprocessspeaker;
-------------------------------------------数码管显示
disp:
process(sel,md1,hou1,hou2,min1,min2,sec1,sec2,seth1,seth2,setm1,setm2)
ifsel="
caseh1is
when"
=>
dout<
0111111"
0001"
0000110"
1011011"
whenothers=>
1000000"
endcase;
elsifsel="
100"
caseh2is
1001111"
1100110"
1101101"
1111101"
0111"
0000111"
1111111"
1101111"
whenothers=>
endcase;
011"
casem1is
elsifsel="
010"
casem2is
elsifsel="
001"
cases1is
cases2is
endif;
ifmd1='
then---------------计时时间显示和设置模式
h1<
=hou1;
h2<
=hou2;
m1<
=min1;
m2<
=min2;
s1<
=sec1;
s2<
=sec2;
else-------------闹铃时间显示和设置模式
=seth1;
=seth2;
=setm1;
=setm2;
1111"
endprocessdisp;
------------------------------------------
end;
三、仿真结果
我们将上述VHDL程序通过Max+PlusII进行编译仿真,仿真结果符合我们设计所预想的功能。
仿真结果见下图。
图1:
正常计时(md1=0,时钟模式)
(所指处,sel值为0,选通数码管秒个位,dout七段码输出sec2,即2)
图2:
分钟校正(md1=0,时钟模式)
(所指处,sel值为3,选通数码管分钟十位,dout七段码输出min1,即3)
图3:
小时校正(md1=0,时钟模式)
(所指处,sel值为4,选通数码管小时个位,dout七段码输出hou2,即8)
图4:
分钟定时(md1=1,闹钟模式)
(所指处,sel值为3,选通数码管分钟十位,dout七段码输出setm1,即2)
图5:
小时定时(md1=1,闹钟模式)
(所指处,sel值为4,选通数码管小时个位,dout七段码输出seth2,即6)
四、结论与收获
在整个设计过程中,通过查阅相关资料,我们一步步建立了对EDA设计的理解。
通过解决在编程、调试以及仿真过程中的种种问题,也加深了我们对软件设计环境的熟悉程度。
通过仿真,我们也感性地认识到了曾经忽视的问题,比如器件间信号传递的时延以及产生毛刺会对电路功能实现的影响。
而最让我们印象深刻的是一点是,在编程当中,虽然某些程序的结构获得的效果以及软件仿真的结果是一致的,但在实际硬件实现是却会有很大的不同。
而这一切,都让我们获益良多。