EDA仿真程序设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

EDA仿真程序设计

数字时钟

班级

姓名

学号

一设计思想

设计首先分三部分,首先对原始信号进行分频,输出我们所需要的时钟信号;第二部分是完成计时功能,第三部分是完成在多位数码管上进行显示的功能。

●利用分频程序将原始50MHz的时钟信号分别分为计时所需的1Hz信号和

扫描显示所需的500Hz信号。

●在计时进程中,后利用加法计数器进行计时,利用时钟信号上升沿进行进

位。

●在显示部分主要分为两个阶段,第一是在7段共阴极数码管上分别显示出

0~9这十个数,第二是在8位扫描数码显示中实现位选。这两个进程主要利用的均是case语句。

在进行完程序之后,在QuartusⅡ上进行验证仿真,后链接硬件下载程序进行实现。

二程序流程

三主体程序介绍

1分频器(原始时钟频率clk为50MHz)

⑴计时分频:1Hz的clk1时钟信号

process(clk)

variable cnt1:integer range 0 to 49999999;

begin

if clk'event and clk='1' then

if cnt1=49999999 then cnt1:=0; clk1<='1';

else cnt1:=cnt1+1; clk1<='0';

--利用加法计数器,将周期扩大50M,频率缩小1/50M

⑵显示扫描分频: 500Hz的clk2时钟信号

process(clk)

variable cnt2:integer range 0 to 99999;

begin

if clk'event and clk='1' then

if cnt2=99999 then cnt2:=0; clk2<='1';

else cnt2:=cnt2+1; clk2<='0';

--同理,周期扩大100000倍,频率缩小1/100000

2计时程序

⑴秒计时

个位:process(clk1,rst)

begin

if rst='1' then sec1<="0000";

elsif clk1'event and clk1='1' then

if sec1<"1001" then

sec1<=sec1 + 1 ; s1<='0';

else sec1<="0000";s1<='1';

--利用计数器计时,计时时钟上升沿清零,二者共同作用创造新的计时时钟s1上升沿进位

十位:process(s1,rst)

begin

if rst='1' then sec2<="0000";

elsif s1'event and s1='1' then

if sec2<"0101" then sec2<=sec2 + 1 ;

else sec2<="0000" ;

--计时阶段与个位相同,只不过计时时钟变成了s1

if clk1'event and clk1='1' then

if sec1=9 and sec2=5 then s2<='1';

else s2<='0';

--向分钟进位时只需将59s的情况单独定义即可

⑵分钟计时

与秒计时的程序一致。

⑶小时计时

个位:process(s4,rst)

begin

if rst='1' then hou1<="0000";

elsif s4'event and s4='1' then

if hou1<"1001" then hou1<=hou1 + 1 ;

else hou1<="0000";

--计时程序不变

if hou1=3 and hou2=2 and min1=9 and min2=5 and sec1=9 and sec2=5 then hou1<="0000";s5<='1';

else s5<='0';

--因为受不同的时钟控制且各process是顺行的,故要在process内部对23h59min59s这一清零情况对个位和十位分别定义,否则会出现时钟上升沿无法保持或信号受多个变量控制的情况

十位:process(s5,rst)

begin

if rst='1' then hou2<="0000";

elsif s5'event and s5='1' then

if hou2<2 then hou2<=hou2 + 1 ;

else hou2<="0000";--计时

if hou1=3 and hou2=2 and min1=9 and min2=5 and sec1=9 and sec2=5 then hou2<="0000";--清零

3位选扫描

process(cnt8)

begin

case cnt8 is

when "000"=>bt<="111110";a<=sec1;

when "001"=>bt<="111101";a<=sec2;

when "010"=>bt<="111011";a<=min1;

when "011"=>bt<="110111";a<=min2;

when "100"=>bt<="101111";a<=hou1;

when "101"=>bt<="011111";a<=hou2;

when others=> null;

end case;

end process;

--利用case语句,低电平触发从右到左进行位选

process(clk2)

begin

if clk2'event and clk2='1' then

if cnt8<"101" then cnt8<=cnt8 + 1;

else cnt8<="000";

--从右到左以此循环扫描显示,加快扫描频率使人眼无法分辨就可以达到共同显示的目的

4 7位段选

process (a)

begin

case a is

when "0000"=>sg<="0111111";--0

when "0001"=>sg<="0000110";--1

when "0010"=>sg<="1011011";--2

when "0011"=>sg<="1001111";--3

when "0100"=>sg<="1100110";--4

when "0101"=>sg<="1101101";--5

when "0110"=>sg<="1111101";--6

when "0111"=>sg<="0000111";--7

when "1000"=>sg<="1111111";--8

when "1001"=>sg<="1101111";--9

when others=> null;

--阴极数码管共分7段,通过高电平触发不同段组合成0~9这十个数

四仿真及硬件实现

●在仿真中,主要问题是时间的设置。为防止仿真时间较长,可以去掉分频程

序直接由输入添加,并且可以加大频率。End time的设置最好应达到分钟有进位。

●硬件实现,可以根据实验指导书上的端口设置链接。重点注意位选以及段选

的端口顺序。

相关文档
最新文档