EDA实训报告
| 指导教 师 | 朱小祥 田欢 |
| 专业 | 电子信息工程技术 |
| 班级 | 电信1301 |
| 姓名 | 郑登 |
| 日期 | 2015年6月23日—27日 |
1、了解数字钟的工作原理。
2、进一步熟悉用VHDL语言编写驱动七段码管显示的代码。
3、掌握VHDL编写中的一些小技巧。
二、实训原理
多功能数字钟应该具有的功能有:显示时-分-秒、整点报时、小时和分钟可调等基本功能。首先要知道钟表的工作机理,整个钟表的工作应该是在1Hz信号的作用下进行,这样每来一个时钟信号,秒增加1秒,当秒从59秒跳转到00秒时,分钟增加1分,同时当分钟从59分跳转到00分时,小时增加1小时,但是需要注意的是,小时的范围是从0~23时。
在实训中为了显示的方便,由于分钟和秒钟显示的范围都是从0~59,所以可以用一个3位的二进制码显示十位,用一个四位的二进制码(BCD码)显示个位,对于小时因为它的范围是从0~23,所以可以用一个2位的二进制码显示十位,用4位二进制码(BCD码)显示个位。
实训中由于七段码管是扫描的方式显示,所以虽然时钟需要的是1Hz时钟信号,但是扫描确需要一个比较高频率的信号,因此为了得到准确的1Hz信号,必须对输入的系统时钟进行分频。
对于整点报时功能,用户可以根据系统的硬件结构和自身的具体要求来设计。本实训设计的是当进行整点的倒计时5秒时,让LED来闪烁进行整点报时的提示。
三、实训内容
本实验的任务就是设计一个多功能数字钟,要求显示格式为 小时-分钟-秒钟,整点报时,报时时间为10秒,即从整点前10秒钟开始进行报时提示,喇叭开始发声,直到过整点时,在整点前5秒LED开始闪烁,过整点后,停止闪烁。调整时间的的按键用按键模块的S1和S2,S1调节小时,每按下一次,小时增加一个小时,S2调整分钟,每按下一次,分钟增加一分钟。另外用按键作为系统时钟复位,复位后全部显示00-00-00。
四、实训步骤
1、写出数码管显示的程序部分。
2、写出数字钟的程序部分。
3、写出调时和蜂鸣器程序部分。
4、管脚分配和下载实验。
5、修改程序,简化,写注释。
五、实训VHDL程序
library ieee;
use ieee.std_logic_11.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity shizhong is
port(sr:out std_logic_vector(0 to 6);
led:out std_logic_vector(0 to 3);
tr:out std_logic_vector(0 to 5);
clk:in std_logic;
c1,c2,c3,c4:in std_logic;
speak:out std_logic);
end shizhong;
architecture behave of shizhong is----结构体
signal disp_temp :integer range 0 to 10;
signal sec1m,sec10m :integer range 0 to 9:=0;----秒的个位和十位信号
signal sec1,sec10 :integer range 0 to 10:=0;----------
signal hor1,hor10 :integer range 0 to 10:=0;
signal clk1khz:std_logic;---1KHz信号
signal clk1hz:std_logic;----1HZ信号
signal st:std_logic;
signal display :integer range 0 to 5;
signal k1,k2:std_logic_vector(2 downto 0);
signal k3:std_logic;
signal f1:std_logic_vector(1 downto 0);
signal cink: integer range 0 to 100;
BEGIN
--------------------------------------------------------50MHz分频出1Hz信号
PROCESS(clk)
variable cnt:integer range 0 to 49999999;
begin
if clk='1' and clk'event then
if cnt=49999999 then cnt:=0;
else
if cnt<25000000 then clk1hz<='1';
else clk1hz<='0';
end if;
cnt:=cnt+1;
end if;
end if;
end process;
--------------------------------------------------------50MHz分频出1KHz信号
PROCESS(clk)
variable cnt1:integer range 0 to 49999;
begin
if clk='1' and clk'event then
if cnt1=49999 then cnt1:=0;
else
if cnt1<25000 then clk1khz<='1';cink<=cink+1 ;if cink>=100 then cink<=0;end if;
else clk1khz<='0';
end if;
cnt1:=cnt1+1;
end if;
end if;
end process;
----------------------------------------------------------
process(clk1hz)
variable s1,s2,s3,s4,s5,s6:integer range 0 to 9;
begin
if clk1hz='1' and clk1hz'event then
if s1>=9 and s2>=5 then s1:=0;s2:=0;
if s3>=9 and s4>=5 then s3:=0;s4:=0;
if s5>=3 and s6>=2 then s5:=0;s6:=0;
elsif s6>2 then s6:=0;
elsif s5>=9 then s5:=0;s6:=s6+1;
else s5:=s5+1;end if;
elsif s3>=9 then s3:=0;s4:=s4+1;
else s3:=s3+1;end if;
elsif s1>=9 then s1:=0;s2:=s2+1;
else s1:=s1+1;end if;
if s3>9 and s4>5 then s3:=0;s4:=0;end if;
if s5>3 and s6>2 then s5:=0;s6:=0;end if;
if s6>2 then s6:=0;end if;
if s5>9 then s5:=0;end if;
if s3>9 then s3:=0;end if;
if s4>5 then s4:=0;end if;
if c1='0' then s3:=s3+1;end if;
if c2='0' then s4:=s4+1;end if;
if c3='0' then s5:=s5+1;end if;
if c4='0' then s6:=s6+1;end if;
sec1m<=s1;sec10m<=s2;sec1<=s3;sec10<=s4;hor10<=s6;hor1<=s5;
end if;
end if;
if s3=0 and s4=0 and s1<5 and s2=0 then speak<='0';led<="1111";
else speak<='1';led<="0000";end if;
end process;
----------------------------------------------------------
process(display)
begin
case(display) is
when 0=>disp_temp<=hor10;tr<="011111";
when 1=>disp_temp<=hor1;tr<="101111";
when 2=>disp_temp<=sec10;tr<="110111";
when 3=>disp_temp<=sec1;tr<="111011";
when 4=>disp_temp<=sec10m;tr<="111101";
when 5=>disp_temp<=sec1m;tr<="111110";
when others=>tr<="111111";
end case;
end process;
----------------------------------------------------------
process(clk1khz)
begin
if(clk1khz'event and clk1khz='1') then
if display=5 then display<=0;
else
display<=display+1;
end if;
end if;
end process;
process(disp_temp)
begin
case disp_temp is
when 0=>sr<="1000000";
when 1=>sr<="1111001";
when 2=>sr<="0100100";
when 3=>sr<="0110000";
when 4=>sr<="0011001";
when 5=>sr<="0010010";
when 6=>sr<="0000010";
when 7=>sr<="1111000";
when 8=>sr<="0000000";
when 9=>sr<="0010000";
when others=>sr<="1111111";
end case;
end process;
end behave;
六、管脚分配
七、实训结果
本实验的任务就是设计一个多功能数字钟,要求显示格式为 小时-分钟-秒钟,整点报时,报时时间为10秒,即从整点前10秒钟开始进行报时提示,喇叭开始发声,直到过整点时,在整点前5秒LED开始闪烁,过整点后,停止闪烁。调整时间的的按键用按键模块的S1和S2,S1调节小时,每按下一次,小时增加一个小时,S2调整分钟,每按下一次,分钟增加一分钟。另外用按键作为系统时钟复位,复位后全部显示00-00-00。
八、实训总结
通过本次实验对软件EDA软件有了更深的了解,掌握在Quartus Ⅱ中VHDL语句 VHDL语句的编写、仿真方法和层次设计的意义。
在实现不同电路的功能时,使用不同的语句其实际电路是不一样的,在语句的编写过程中如果可以使用”=”,就尽量避免” >”或”<”的使用,这样可以减小对硬件的占用。类似的问题还有很多,在语句描写的时候,不仅仅要考虑功能的实现,减小对硬件的使用量也是非常重要的。
VHDL中尽量不要使用乘除法,避免消耗大量LE,一个进程中只能有一个边沿检测event,编写程序是要尤其注意,VHDL为顺序执行结构,编写程序时,尽可能多的使用进程能增加程序的执行效率。
这次试验收获了很多,养成严谨以及对事物的细心观察的习惯,对问题的解决可以有很大的帮助。下载本文