用EDA做的倒计时牌.doc_第1页
用EDA做的倒计时牌.doc_第2页
用EDA做的倒计时牌.doc_第3页
用EDA做的倒计时牌.doc_第4页
用EDA做的倒计时牌.doc_第5页
免费预览已结束,剩余12页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电子系统课程设计报告课题名称:倒 计 时 牌班级: xx08 2班 组别: xx 设计者: 馨儿 同组人员: xxx xxx 学号: xxxxxxxxxx 指导老师: xxx 日期: xxxxxx 丽水学院机械电子与建筑工程学院倒计时牌任 务 书一、 任务 设计一个倒计时牌,要求在试验箱上实现。二、设计要求 能实现两位显示(00-99)的倒计时牌。 开始天数可任意设定。 最好能显示当前时间(可选)。 能实现显示手动清零。 能在倒计到00时来一个警报,如让LED灯亮一下 写出详细的设计报告。三 、设计方案(1)、设计原理选用一个定时器做核心器件,选用的芯片为EP1C6Q240C8。编写一个程序使该器件有选位、置位、启动、复位、倒计时等功能。显示采用3个4位LED数码管,由KEY5,KEY6控制LED1,LED2, LED4灯的亮灭,并采用共阴接法,可以动态扫描显示。其系统原理是由分频模块分别发送时钟信号给定时器控制模块,按键模块,发光二极管和十六进制转换十进制模块,定时器控制模块中的报警系统和输出的十六进制分别送到按键模块中的LED指示输入端和十六进制转换为十进制的模块中的八位十六进制输入端,经转换成四位十进制输出显示在数码管上。主要系统框图如下:(2)主要模块介绍 用int_div分频模块,int_div模块是一个占空比为50%的任意整数分频器。输入时钟为clock,输出时钟为clk_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 Devider 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; 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:输出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 key_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);-数码管段码输出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: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:STD_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;PROCESS(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-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)-按键3BEGINIFRISING_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(key_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;END 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 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 seg_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_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_vector(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.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,in8) 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号数码管和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拷贝到工程目录。 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+实验箱上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灯灭,开始倒计时,当倒计到00时,LED4等亮,数码管上显示00 ,且停止,不再倒计。若在倒计的任意时刻时候需要清零,则可按下KEY5,清零。5、 实验心得 通过两周的课程设计,我们对EDA和VHDL语言有了更多的了解,由于第一次做这种设计,所以刚开始对这个课题感觉很陌生,不知道从何下手,经查阅很多的相关资料,却还是不知如何做,后经老师提示知道了要用定时器着手,用这个做核心制作倒计时牌。于是开始了这个课题的第一阶段

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论