用EDA做的倒计时牌.doc

上传人:PIYPING 文档编号:10899515 上传时间:2021-06-11 格式:DOC 页数:17 大小:174KB
返回 下载 相关 举报
用EDA做的倒计时牌.doc_第1页
第1页 / 共17页
用EDA做的倒计时牌.doc_第2页
第2页 / 共17页
用EDA做的倒计时牌.doc_第3页
第3页 / 共17页
用EDA做的倒计时牌.doc_第4页
第4页 / 共17页
用EDA做的倒计时牌.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《用EDA做的倒计时牌.doc》由会员分享,可在线阅读,更多相关《用EDA做的倒计时牌.doc(17页珍藏版)》请在三一文库上搜索。

1、电子系统课程设计报告课题名称:倒 计 时 牌班级: xx08 2班 组别: xx 设计者: 馨儿 同组人员: xxx xxx 学号: xxxxxxxxxx 指导老师: xxx 日期: xxxxxx 丽水学院机械电子与建筑工程学院倒计时牌任 务 书一、 任务 设计一个倒计时牌,要求在试验箱上实现。二、设计要求 能实现两位显示(00-99)的倒计时牌。 开始天数可任意设定。 最好能显示当前时间(可选)。 能实现显示手动清零。 能在倒计到00时来一个警报,如让LED灯亮一下 写出详细的设计报告。三 、设计方案(1)、设计原理选用一个定时器做核心器件,选用的芯片为EP1C6Q240C8。编写一个程序使

2、该器件有选位、置位、启动、复位、倒计时等功能。显示采用3个4位LED数码管,由KEY5,KEY6控制LED1,LED2, LED4灯的亮灭,并采用共阴接法,可以动态扫描显示。其系统原理是由分频模块分别发送时钟信号给定时器控制模块,按键模块,发光二极管和十六进制转换十进制模块,定时器控制模块中的报警系统和输出的十六进制分别送到按键模块中的LED指示输入端和十六进制转换为十进制的模块中的八位十六进制输入端,经转换成四位十进制输出显示在数码管上。主要系统框图如下:(2)主要模块介绍 用int_div分频模块,int_div模块是一个占空比为50%的任意整数分频器。输入时钟为clock,输出时钟为cl

3、k_out. 若要变分频系数,改变参数N到相应范围即可。本实验中输入时钟为48MHz.模块程序: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_Arith.ALL; USE IEEE.STD_LOGIC_Unsigned.ALL; ENTITY int_div IS GENERIC(N:Integer:=48000000);-此处定义了一个默认值N3,即电路为3分频电路; Port (Clockin:IN STD_LOGIC; ClockOut:OUT STD_LOGIC ); END; ARCHITECTURE D

4、evider OF int_div IS SIGNAL Counter:Integer RANGE 0 TO N-1; SIGNAL Temp1,Temp2:STD_LOGIC; BEGIN PROCESS(Clockin) BEGIN IF RISING_EDGE(Clockin) THEN IF Counter=N-1 THEN counter=0; Temp1=Not Temp1; ELSE Counter=Counter+1; END IF; END IF; IF falling_edge(clockin)THEN IF Counter=N/2 THEN Temp2=NOT Temp2

5、; END IF; END IF; END PROCESS; ClockOut=Temp1 XOR Temp2; END;(2) 用key_led按键输入数码管显示输出模块来控制数码管的显示,端口说明: a)clk_48MHz:系统时钟输入(48MHz);b)key7.0:按键输入(KEY1-KEY8);c)ledin3.0:LED指示输入端(分别接LED8-LED5, 高电平“1”LED亮);d)data15.0:数码管显示输入(经七段译码后送数码管5-8显示data15.12:数码管5、data11.8:数码管6、data7.4:数码管7、data3.0:数码管8);e)bin3.0:输出

6、4位二进制码,其值由LED4-LED1对应指示(高电平“1”LED亮);f)hex15.0:输出4组4位二进制码,其值经七段译码后送数码管1-4显示(hex15.12:数码管1、hex11.8:数码管2、hex7.4:数码管3、hex3.0:数码管4); g)led7.0:LED输出(低电平“0”LED亮);h)seg7.0:数码管段输出;o)dig7.0:数码管位输出.模块程序: LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY k

7、ey_led IS PORT(clk_48M:INSTD_LOGIC;-系统时钟(48MHz)key:INSTD_LOGIC_VECTOR(7 DOWNTO 0);-按键输入(KEY1KEY8)ledin:INSTD_LOGIC_VECTOR(3 DOWNTO 0);-LED显示输入(在LED5LED8显示)data:INSTD_LOGIC_VECTOR(15 DOWNTO 0);-数码管显示输出(在数码管58显示)led:OUTSTD_LOGIC_VECTOR(7 DOWNTO 0);-LED输出(LED1LED8)seg:OUTSTD_LOGIC_VECTOR(7 DOWNTO 0);-数

8、码管段码输出hex:OUTSTD_LOGIC_VECTOR(15 DOWNTO 0);-4位16进制数输出(在数码管14显示)bin:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);-4位2进制数输出(在LED1LED4显示)dig:OUT STD_LOGIC_VECTOR(7 DOWNTO 0) -数码管位码输出);END ;ARCHITECTURE one of key_led ISSIGNAL hex_r:STD_LOGIC_VECTOR(15 DOWNTO 0);SIGNALbin_r:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNALseg_r:

9、STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNALdig_r:STD_LOGIC_VECTOR(7DOWNTO 0);SIGNAL count:STD_LOGIC_VECTOR(16 DOWNTO 0);-时钟分频计数器SIGNALdout1,dout2,dout3,buff:STD_LOGIC_VECTOR(7 DOWNTO 0);-消抖寄存器SIGNALcnt3:STD_LOGIC_VECTOR(2 DOWNTO 0);-数码管扫描计数器SIGNALdisp_dat:STD_LOGIC_VECTOR(3 DOWNTO 0);-数码管扫描显存SIGNALdiv_clk:S

10、TD_LOGIC;SIGNAL key_edge:STD_LOGIC_VECTOR(7 DOWNTO 0);-按键消抖输出BEGINhex=hex_r;bin=bin_r;seg=seg_r;dig=dig_r;led=not (ledin & bin_r);PROCESS(clk_48M)-时钟分频部分BEGINIFRISING_EDGE(clk_48M)THENIF count120000 THENcount=count+1;div_clk=0;ELSEcount=B0_0000_0000_0000_0000;div_clk=1;END IF;END IF;END PROCESS;PROC

11、ESS(clk_48M)BEGINIFRISING_EDGE(clk_48M)THENIF div_clk=1 THENdout1=key;dout2=dout1;dout3=dout2;END IF;END IF;END PROCESS;PROCESS (clk_48M)-按键边沿检测部分BEGINIFRISING_EDGE(clk_48M)THENbuff=dout1 OR dout2 OR dout3;END IF;END PROCESS;key_edge= not(dout1 OR dout2 OR dout3) AND buff;-按键消抖输出PROCESS(clk_48M)-按键1

12、-4位16进制数输出部分BEGINIFRISING_EDGE(clk_48M)THENIF(key_edge(0)=1)THENhex_r(15 DOWNTO 12)=hex_r(15 DOWNTO 12) + 1;END IF;END IF;END PROCESS;PROCESS(clk_48M)-按键2BEGINIFRISING_EDGE(clk_48M)THENIF(key_edge(1)=1)THENhex_r(11 DOWNTO 8)=hex_r(11 DOWNTO 8)+ 1;END IF;END IF;END PROCESS;PROCESS(clk_48M)-按键3BEGINIF

13、RISING_EDGE(clk_48M)THENIF(key_edge(2)=1)THENhex_r(7 DOWNTO 4)=hex_r(7 DOWNTO 4)+1;END IF;END IF;END PROCESS;PROCESS(clk_48M)-按键4BEGINIFRISING_EDGE(clk_48M)THENIF(key_edge(3)=1)THENhex_r(3 DOWNTO 0)=hex_r(3 DOWNTO 0)+1;END IF;END IF;END PROCESS;PROCESS(clk_48M)-按键5BEGINIFRISING_EDGE(clk_48M)THENIF(k

14、ey_edge(4)=1)THENbin_r(0) = NOT bin_r(0);END IF;END IF;END PROCESS;PROCESS(clk_48M)-按键6BEGINIFRISING_EDGE(clk_48M)THENIF(key_edge(5)=1)THENbin_r(1) = NOT bin_r(1);END IF;END IF;END PROCESS;PROCESS(clk_48M)-按键7BEGINIFRISING_EDGE(clk_48M)THENIF(key_edge(6)=1)THENbin_r(2) = NOT bin_r(2);END IF;END IF;E

15、ND PROCESS;PROCESS(clk_48M)-按键8BEGINIFRISING_EDGE(clk_48M)THENIF(key_edge(7)=1)THENbin_r(3) = NOT bin_r(3);END IF;END IF;END PROCESS;-数码管扫描显示部分PROCESS(clk_48M)BEGINIFRISING_EDGE(clk_48M)THENIF div_clk=1 THENcnt3 = cnt3 + 1;END IF;END IF;END PROCESS;PROCESS(clk_48M)BEGINIFRISING_EDGE(clk_48M) THENIF

16、div_clk=1 THENCASE(cnt3) IS -disp_datdisp_dat disp_dat disp_dat disp_dat disp_dat disp_dat disp_dat= data(3 DOWNTO 0);END CASE;CASE (cnt3)IS-dig_rdig_rdig_rdig_rdig_rdig_rdig_rdig_r=11111110;END CASE;END IF;END IF;END PROCESS;PROCESS(disp_dat)- seg_r seg_r seg_r seg_r seg_r seg_r seg_r seg_r seg_r s

17、eg_r seg_r seg_r seg_r seg_r seg_r seg_r NULL;END CASE;END PROCESS;END;(3)用countdown模块进行清零,置数。端口说明: a)clk:分频信号输入端口 b)rst:清零端口,当rst=1时,数值清零 c)s:置数使能端,当s=1时,允许置数 d)d7.0:置数端 e)bo:输出借位端 f)l3.0:警报端口 g)cnt8:8位16进制输出端程序: library ieee; use ieee.std_logic_arith.all; use ieee.std_logic_1164.all; use ieee.std_

18、logic_unsigned.all; entity countdown is port(clk,rst,s:in std_logic; d:in std_logic_vector(7 downto 0); bo:out std_logic; l:out std_logic_vector(3 downto 0); cnt8:out std_logic_vector(7 downto 0); end countdown; architecture one of countdown is begin process(clk,rst,s,d) variable temp:std_logic_vect

19、or(7 downto 0); begin if rst=0then temp:=00000000; elsif s=1 then temp:=d; elsif clkevent and clk=1 then if temp=00000000 then l=0001; else l=0000; temp:=temp-1; bo=0; end if; end if; cnt8=temp; end process; end one;(4)用conv模块将十六进制转换为十进制。端口说明: clk:系统时钟输入端; int87.0:八位十六进制输入端; out17.4:四位十进制输出端; Out23.

20、0:四位十进制输出端; 程序: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity conv is port( clk:in std_logic; in8:in std_logic_vector(7 downto 0); out1,out2:out integer range 0 to 9); end entity conv; architecture bhv of conv is begin process(clk,in

21、8) variable tmp,q1,q2:integer; begin tmp:=conv_integer(in8); q1:=tmp/10; q2:=tmp rem 10; if clkevent and clk=1 then out1=q1; out2=q2; end if; end process; end bhv; 3、 实验内容 本实验的内容是设计一个倒计时牌,并在SmartSOPC试验箱上进行测试,按KEY5键开始倒数,并由LED1亮灯指示,按KEY6打开置数使能端,并有LED2灯亮显示,再按KEY1和KEY2键将1号数码管和2号数码管分别置数,再按下KEY6键,LED2灯灭,1

22、号数码管和2号数码管上显示的十六进制数转换为十进制并送到7号数码管和8号数码管,结果在数码管78上显示出来,同时开始倒计时,当任意值倒计到00时,LED4灯亮且数码管停止不再重新倒数。亦可在倒计到任意时刻的时候按KEY5键将7号数码管和8号数码管的数清零,按KEY6重新开始倒数。4、 实验步骤 1)启动Quartus建立一个空白工程,然后命名countdown.qpf 2)新建VHDL源程序文件countdown,输入程序代码并保存,进行综合编译,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。 3)将事先准备的int_div.vhd,key_led.vhd,conv.vhd拷贝到

23、工程目录。 4)新建图形设计文件(顶层模块)命名为count_down.bdf并保存,其模块图如图所示 5)选择目标器件并对相应的引脚进行锁定,在这里所选择的器件为Altera公司Cyclone系列的EP1C12Q240C8芯片,引脚锁定方法,结果如下图所示 6)将count_down.bdf设置为顶层实体。对该工程文件进行全程编译处理,若在编译过程中发现错误,直至编译成功为止。 7)硬件连接、下载程序 (1)拿出实验箱配置的连线将核心板上PACK区的引脚236、237、238和239 分别与数码管显示区的COM3(DIG_COM)的DIG4DIG7相对应连接。 (2)拨出SmartSOPC+

24、实验箱上JP6的KEY1KEY8 短接帽,拿出短接线将JP6的KEY1KEY8连接到D6区域的SW_COM插针上,使KEY1KEY8分别与FPGA的引脚相连。拿出Altera Byte Blaster下载电缆,并将此电缆的两端分别接到PC机的打印机并口和QuickSOPC+核心板上的JTAG下载口上,打开电源,执行下载命令,把程序下载到FPGA器件中。按KEY1,KEY2,KEY5,KEY6观察数码管的状态,是否与设计符合。 (3)在实验箱上按KEY5进行倒计时,LED1灯亮,同时按下KEY6时打开置数使能端,LED2灯亮,分别按下KEY1、KEY2进行置数,再按下KEY6,LED2灯灭,开始

25、倒计时,当倒计到00时,LED4等亮,数码管上显示00 ,且停止,不再倒计。若在倒计的任意时刻时候需要清零,则可按下KEY5,清零。5、 实验心得 通过两周的课程设计,我们对EDA和VHDL语言有了更多的了解,由于第一次做这种设计,所以刚开始对这个课题感觉很陌生,不知道从何下手,经查阅很多的相关资料,却还是不知如何做,后经老师提示知道了要用定时器着手,用这个做核心制作倒计时牌。于是开始了这个课题的第一阶段的学习。有了目标觉得会好做多了,可是后来才发现真的难,对于程序的的编写真的感觉不行,想想以前做实验的时候都是按部就班的按书上要求做,对于实验的理解却少之又少,现在却要求自己写程序,查半天查不到

26、多少有关资料,真的有种要崩溃的感觉。还好在组员的共同努力下,不断错误之后编译成功了我们的第一个程序,就是那个核心模块,即定时器模块的程序。跨出了这一步,我们有了信心一定能拿下这个课题。后来找到了实验时常用的分频模块和key_led模块,设定各个模块管脚的时候也碰到一些问题,不过还好,仔细检查过之后就编译成功了。此时能在实验箱上显示结果,不过问题又来了,我们的数码管上只能显示十六进制的倒数,问了老师之后,老师说要添加一个十六进制转换为十进制的模块,最后我们找到了相关的程序,经过多次修改终于能用了,将该模块接入原来的那个图中,重新设定了管脚之后,编译成功了,最后能在实验箱数码管上显示十进制的倒计时

27、。后来加了一个警报的条件,这个我不懂该怎么出发,只觉得应该在定时器模块上修改,至于怎么考虑了好久也没想出来,问了组员,是说在定时器模块的输出端加上一个端口连到LED指示输入端,仔细看了一下key_led模块中的ledin3.0的说明,就是这个控制LED灯的亮灭,我们就在定时器模块的输出端加了一个输出,将它连到ledin3.0,适当修改了程序之后,保存,下载,进行全程编译,通过按键控制显示实验结果。 完成这次的课程设计真的不简单,回味起来还有些后怕,因为程序的编写和修改真的很烦,错了有错,还有就是当不知道修改哪里的时候最糟糕。庆幸的是我们最后还是完成了任务,能在实验箱上显示99-00的倒数,KEY5能清零,LED1灯亮,KEY1,KEY2置数,按KEY6将数码管1,2号的数字送入7,8号进行倒数,当任意数倒计到00时,停止倒数,且LED4灯亮,否则灯一直灭。总之,这次的设计我们都花费了很多心思,最后经过我们的共同努力总算我们完成了这次的任务。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1