1、VHDL语言四人抢答器中南林业科技大学课程设计报告 设计名称: 基于VHDL语言的四人抢答器 姓 名: 杜涵 学 号: 20134491 专业班级: 电子信息工程 一班 院(系): 计算机与信息工程学院 设计时间: 2015年12月8日 设计地点: 东园22栋201 1、设计题目2、设计要求3、设计目的4、设计背景5、使用工具6、设计原理7、设计结构8、原理图9、模块程序10、引脚分配11、设计结果验证12、总结1、设计题目:基于VHDL语言的四路抢答器二丶设计要求: 1、设计制作一个竞赛抢答器,每组受控于一个抢答开关,分别为S1, S2, S3, S4。 2、控制键K,用于控制整个系统清零,
2、 K=0,系统清零;抬起复位键时,K=1,抢答开始。 3、每答对一题计十分,每次答题时间不能超过60秒。 4、第一抢答者按下抢答按钮,对应的led灯点亮,同时数码管显示是第几位抢答者,并封锁其他各组的按钮,即其他任何一组按键都不会再使电路响应。与此同时,数码管开始显示60秒的倒计时。通过K键复位,开始下一轮抢答。3、设计目的 1.通过设计竞赛抢答器的实例来体会设计实际产品的过程,在学好理论的基础上,提高动手实践能力。 2.学习怎样用vhdl语言来描述自己的设计思路,调试硬件后,能够使产品实现功能。 3.进一步掌握用vhdl语言编写数字电路。4.在做课题过程中,掌握多位共阴极扫描显示数码管的驱动
3、及编码,学会使用和调试硬件。四、设计背景现代电子产品几乎渗透了社会的各个领域EDA技术是电子设计的发展趋势,EDA工具从数字系统设计的单一领域,应用范围己涉及模拟、微波等多个领域,可实现各个领域电子系统设计的测试、设计仿真和布局布线等。设计者只要完成对电子系统的功能描述,就可利用计算机和EDA工具,进行设计处理,最终得到设计结果。 随着大规模集成电路技术和计算机技术的不断发展,即使是普通的电子产品的开发,EDA技术常常使一些原来的技术瓶颈得以轻松突破,从而使产品的开发周期大为缩短、性能价格比大幅提高。不言而喻,EDA技术将迅速成为电子设计领域中的极其重要的组成部分。从目前的EDA技术来看,其发
4、展趋势是政府重视、使用普及、应用文泛、工具多样、软件功能强大。抢答器是一种应用非常广泛的设备,在各种竞猜、抢答场合中,它能迅速、客观地分辨出最先获得发言权的选手。早期的抢答器只由几个三极管可控硅、发光管等组成,能通过发光管的指示辨认出选手。现在大多数抢答器均使用单片机和数字集成电路,并增加了许多新的功能,如选手号码显示、抢按器或抢按后的计时、选手得分显示等功能。五、使用工具:装有Quartus II软件的PC、Cyclone系列FPGA开发板(ep2c5t144c8)六、设计原理根据设计要求,我们经过分析应用分模块的方式比较容易设计该抢答器,我们底层应用VHDL语言,顶层应用原理图的方式进行设
5、计,然后通过仿真验证并不断修改完善设计。模块:(1)四人按键抢答模块:设计为五个输入按键,其实S键为主持人控制抢答过程的按键,当有选手抢答后使其他人的按键无效。然后根据抢答成功者的编号使对应LED灯点亮,同时输出一个状态让数码管显示抢答者编号。主持人S键复位,开始下一轮抢答。(2)计时模块:在有人抢答后开始一个60秒的倒计时,并输出道数码管显示,CLK来自1HZ分频模块。(3)计分模块:在选手答题正确后通过外接ADD键给该选手加分,每次加十分,并输出到数码管显示,CLEAR键为清空所有选手分数。(4)译码模块:讲选手序号,倒计时以及选手分数显示出来,CLK由1KHz分频模块提供。(5)1HZ与
6、1KHz分频模块:程序由FPGA板的50MHz频率编写。7、设计结构8、原理图:九、模块程序1、抢答模块程序:Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Use ieee.std_logic_arith.all;Entity QD is Port( s,clk:in std_logic; s0,s1,s2,s3:in std_logic; states:buffer std_logic_vector(3 downto 0); T:out std_logic; LIANG:buffer std_
7、logic_vector(3 downto 0); XI:buffer std_logic_vector(3 downto 0); End QD;Architecture aa of QD issignal s_0,s_1,s_2,s_3,l_1,l_2,l_3,l_4:std_logic;beginprocess(s0,s1,s2,s3,s,clk)begin XI=1111;if (s=0) then s_0=0;s_1=0;s_2=0;s_3=0;LIANG=1111; elsif (clkevent and clk=1) then if (s_0=1 or s_1=1 or s_2=1
8、 or s_3=1) then null; elsif s0=0 then s_0=1;states=0001;LIANG=1110; elsif s1=0 then s_1=1;states=0010;LIANG=1101; elsif s2=0 then s_2=1;states=0011;LIANG=1011; elsif s3=0 then s_3=1;states=0100;LIANG=0111; else states=0000; end if; end if;T= s_0 or s_1 or s_2 or s_3;end process;end aa ;说明:S为主持人复位键;
9、S0,S1,S2,S3:四个抢答选手; STATES:抢答组号输出 T:在S按下后使倒计时停止; LIANG:控制四个LED灯,点亮选手对应LED灯; XI:使另外四个LED灯熄灭;2、计时模块程序:library ieee;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_1164.all;entity JS isport(clk,s,T:in std_logic; sw,gw:buffer std_logic_vector(3 downto 0);end JS;architectu
10、re aa of JS isbeginprocess(clk,s,T)beginif (s=0) then sw=0110;gw=0000; elsif(clkevent and clk=1) then if(T=0) then gw=gw;sw=sw; elsif (gw=0000) then gw=1001; if(sw=0000) then sw=0000; else sw=sw-1; end if; else gw=gw-1; end if; if (sw=0 and gw=0) then sw=0000;gw=0000; end if; end if;end process;end
11、aa;说明:S:按下后倒计时开始; SW:输出倒计时十位数; GW:输出倒计时百位数3、计分模块LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY JFQ IS PORT(RST: IN STD_LOGIC; ADD: IN STD_LOGIC; CHOS: IN STD_LOGIC_VECTOR(3 DOWNTO 0); OUT1: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); END ENTITY JFQ ; ARCHITECTURE ART OF JFQ
12、 IS BEGIN PROCESS(RST,ADD,CHOS) IS VARIABLE POINTS_A0: STD_LOGIC_VECTOR(3 DOWNTO 0); VARIABLE POINTS_B0: STD_LOGIC_VECTOR(3 DOWNTO 0); VARIABLE POINTS_C0: STD_LOGIC_VECTOR(3 DOWNTO 0); VARIABLE POINTS_D0: STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN IF RST=1 THEN POINTS_A0:=0000; POINTS_B0:=0000; POINTS_C0:=
13、0000; POINTS_D0:=0000; ELSIF (ADDEVENT AND ADD=0) THEN IF CHOS=0001 THEN IF POINTS_A0=1001 THEN POINTS_A0:=0000; ELSE POINTS_A0:=POINTS_A0+1; END IF; END IF; IF CHOS=0010 THEN IF POINTS_B0=1001 THEN POINTS_B0:=0000; ELSE POINTS_B0:=POINTS_B0+1; END IF; END IF; IF CHOS=0011 THEN IF POINTS_C0=1001 THE
14、N POINTS_C0:=0000; ELSE POINTS_C0:=POINTS_C0+1; END IF; END IF; IF CHOS=0100 THENIF POINTS_D0=1001 THEN POINTS_D0:=0000; ELSE POINTS_D0:=POINTS_D0+1; END IF; END IF; END IF; IF chos=0001 then out1=POINTS_a0;ELSIF chos=0010 then out1=POINTS_b0;ELSIF chos=0011 then out1=POINTS_c0;ELSIF chos=0100 then
15、out1=POINTS_D0;ELSIF chos=0000 then out1=0000;END IF;END PROCESS; END ARCHITECTURE ART; 说明:RST:分数清零按键; ADD:加分按键; CHOS=STATES:输入选手组号; OUT1:输出分数;4、译码显示模块程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity YM is port(a:in std_logic_vector(3 do
16、wnto 0); b:in std_logic_vector(3 downto 0); c:in std_logic_vector(3 downto 0); clk1:in std_logic; Y:in std_logic_vector(3 downto 0); adres: out std_logic_vector(7 downto 0); led7s: out std_logic_vector(7 downto 0) );end YM;ARCHITECTURE segled of YM issignal S:integer range 0 to 12;signal D:std_logic
17、_vector(3 downto 0);signal zero:std_logic_vector(3 downto 0);beginP1: process(clk1) begin zero=0000;if clk1event and clk1=1 then if S5 then S=S+1; else SD=a; adresD=b; adresD=c; adresD=Y; adresD=zero;adresnull; end case;end process P2;P3:process(D) begin case D is when 0000 =led7sled7sled7sled7sled7
18、sled7sled7sled7sled7sled7snull; end case;end process P3;end segled;说明:A:输入选手组号; B:倒计时十位; C:倒计时个位; Y:选手分数; ADRES:控制数码管位选; LED7S:控制数码管段选;5、分频模块程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity FP is port( clk: in STD_LOGIC; clk1Hz: out std_
19、logic);end FP;ARCHITECTURE segled of FP isbegin PROCESS (clk) VARIABLE count:INTEGER RANGE 0 TO 49999999;BEGIN IF clkEVENT AND clk=1 THEN IF count=24999999 THEN clk1Hz=0; count=24999999 AND count=49999999 THEN clk1Hz=1; count:=count+1; ELSE count:=0; END IF; END IF; END PROCESS ; END ARCHITECTURE se
20、gled;(分频1HZ时将其中的数去掉三个9)6、计分器ADD加分输入消抖模块程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY XIAOD IS PORT (CLK,ADD:IN STD_LOGIC; ADD_EN: OUT STD_LOGIC );END ENTITY;ARCHITECTURE BHV OF XIAOD ISBEGINPROCESS(CLK,ADD) VARIABLE COUNT1 :INTEGER RANGE 0 TO 100000; BEGIN IF ADD
21、=0 THEN IF RISING_EDGE(CLK) THEN IF COUNT1100000 THEN COUNT1:=COUNT1+1; ELSE COUNT1:=COUNT1; END IF; IF COUNT1=99999 THEN ADD_EN=1; ELSE ADD_EN=0; END IF; END IF; ELSE COUNT1:=0;END IF; END PROCESS ;END;十:引脚分配11、设计结果验证 编译成功后下载到FPGA板上进行结果验证:数码管显示0 60 00;按下S后,显示0 59 00;S0抢答后,显示1倒计时停止 按下ADD显示10 第一个LED灯点亮;S1抢答后,显示2倒计时停止 按下ADD显示10第二个LED灯点亮;S2抢答后,显示3倒计时停止 按下ADD显示10第三个LED灯点亮;S3抢答后,显示4倒计时停止 按下ADD显示10第四个LED灯点亮;若按下RST键,所有选手得分清零。十二:总结在这次的课程设计中,我对VHDL语言以及QUARTUS II软件的应用有了更深刻的认识。一个个程序的编写及模块的生成锻炼了我的思维,让我对每个模块的功能、每段程序的作用有了更多的了解。通过不断的思考,总的原理图才能够完成。通过不断的出错与修改、完善,最终才能在FPGA上应用,我感觉付出都是值得的。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1