数字式竞赛抢答器VHDL.pdf
-数字系统设计与硬件描述语言数字系统设计与硬件描述语言期末考试作业期末考试作业题目:数字式竞赛抢答器设计题目:数字式竞赛抢答器设计学院:电子信息工程学院:电子信息工程专业:电子信息工程专业:电子信息工程学号:学号:- word.zl-一、一、 选题设计描述选题设计描述1. 1. 功能介绍功能介绍此设计用于竞赛的四人抢答,有如下的功能:(1)具有多路抢答功能,台数设计为四;(2)具有抢答器开场后 30 秒倒计时,30 秒后无人抢答显示超时,并报警;(3)能显示超前抢答犯规,并警报;(4)能显示各组得分,大队加分,答错扣分;当系统复位,主持人按下抢答开场按键,处于使能状态,抢答开场,某路抢答键按下时,该路信号将其他路信号锁存,同时抢答铃声响起,直至此路按键松开,显示该路组号。2. 2. 算法简介算法简介本设计采用分层设计思想,分为:信号鉴别模块、计时模块、计分模块、 BCD 译码模块、分频器,还有顶层模块。信号鉴别模块信号鉴别模块。此模块主要实现抢答器的抢答功能,并能够分辨是正常抢答还是提前抢答,选取最先按下的一路信号,锁存其余信号,实现信号选取功能。在此模块中,用到的信号为抢答信号a、b、c、d;抢答使能信号 en;抢答结果信号 states;警报时钟信号 clk2;复位信号rst;提前抢答信号 fangui。计时模块计时模块。此模块主要实现抢答过程中的计时功能, 在抢答开场后进展 30 秒的倒计时,且在 30秒后显示无人抢答报警信号。其中有抢答时钟信号 clk;系统复位信号 rst;抢答使能信号 en;无人抢答警报信号 warn;计时中止信号 stop;计时十位个位信号tb,ta。计分模块计分模块。此模块主要实现给四个抢答器计分的功能,初始条件下,为每个抢答器信号预制 5分,当某组抢答且答复正确时加一分,答错减一分,未获答题时机时保持不变。其中设有时钟信号clk;复位信号rst;抢答使能信号en;抢答结果显示信号states;记分加减信号addadd1时为加,add0时为减 ;四个信号的得分显示信号a_out,b_out,c_out,d_out。BCDBCD 译码模块译码模块。此模块主要实现将抢答结果信号显示在 bcd 七段译码器上。其中输入信号 a;输出译码结果信号 q。分频器分频器。此模块主要实现时钟分频功能。在开头对时钟信号进展一次千分频。其中时钟输入信号 clkin,输出信号 clk。顶层模块顶层模块。将前几个模块综合在一起,形成一个整体。分频器输出作为其他模块所需的时钟信号,使整个系统正常运转。二、二、 程序源代码及说明程序源代码及说明抢答信号鉴别模块的程序抢答信号鉴别模块的程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity qd isport(clk2,en,rst:in std_logic;- word.zl-a,b,c,d:in std_logic;fangui:out std_logic;states:out std_logic_vector(3 downto 0);end qd;architecture one of qdissignal sinor,fanguif,tmp:std_logic;signalt:std_logic_vector(5 downto 0);beginsinor=a or b or c or d;p1:process(a,rst,b,c,d,tmp)beginif rst=1then -复位信号有效,系统复位。tmp=1;states=0000;elsif tmp=1thenif a=1 then-判断哪路信号变化,进展选取states=0001;tmp=0;-对 states 进展置数elsif b=1 thenstates=0010;tmp=0;elsif c=1 thenstates=0011;tmp=0;elsif d=1 thenstates=0100;tmp=0;else tmp=1;states=0000;end if ;end if;end process p1;p2:process(clk2,en,rst,t)-判断是否提前抢答并报警beginif rst=1 thent=000000;fanguif=0;-初始化提前抢答犯规信号elsif clk2event and clk2=1 then- word.zl-if en=0 and sinor=1 thenift111111 thenfanguif=not fanguif;t=t+1;else fanguif=0;end if;end if;end if;end process p2;fangui=fanguif;end one;计时模块的程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity js isport(clk,rst,en,stop:in std_logic;warn:buffer std_logic;ta,tb:buffer std_logic_vector(3 downto 0);end js;architecture one of js issignal co:std_logic;beginp1:process(clk,rst,en,stop,ta)-个位计时信号进展 0 到 9 循环计数beginif rst=1 or stop=1 thenta=0000;elsif clkevent and clk=1 thenco=0;if en=1 thenif ta=0000 thenta=1001;co=1;- word.zl-else ta=ta-1;end if;end if;end if;end process p1;p2:process(co,rst,en,stop,tb)-十位计时信号 0 到 3 变化beginif rst=1 or stop=1 thentb=0011;elsif coevent and co=1 thenif en=1 thenif tb=0000 then tb=0011;else tb=tb-1;end if;end if;end if;end process p2;p3:process(rst,ta,tb)-计时时间到达,报警beginif rst=1 thenwarn=0;elsif ta=0000 and tb=0000 thenwarn=1;else warn=0;end if;end process p3;end one;计分模块的程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;- word.zl-entity jf isport(clk,rst,en,add:in std_logic;states:in std_logic_vector(3 downto 0);a_out,b_out,c_out,d_out:buffer std_logic_vector(3 downto 0);end jf;architecture one of jf isbeginp1:process(clk,rst,add,states,a_out,b_out,c_out,d_out)beginif (rst=1) thena_out=0101;b_out=0101;c_out=0101;d_outif add=1 then-add 信号为高时,加 1 分if a_out=1111 then-最多 15 分a_out=0000;else a_out=a_out+1;end if;elsif add=0 then-add 信号为 0,减 1 分if a_out=0000 thena_out=0000;else a_outif add=1 thenif b_out=1111 thenb_out=0000;else b_out=b_out+1;- word.zl-end if;elsif add=0 thenif b_out=0000 thenb_out=0000;else b_outif add=1 thenif c_out=1111 thenc_out=0000;else c_out=c_out+1;end if;elsif add=0 thenif c_out=0000 thenc_out=0000;else c_outif add=1 thenif d_out=1111 thend_out=0000;else d_out=d_out+1;end if;elsif add=0 thenif d_out=0000 thend_out=0000;else d_outa_out=a_out;b_out=b_out;c_out=c_out;d_out q q q q q q q q q q q=0000000;END case;END PROCESS;END behav;一千分频器模块程序一千分频器模块程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_unsigned.ALL;ENTITY divf ISPORT(clk: IN STD_LOGIC;q : OUT STD_LOGIC;qn: OUT std_logic_vector(9 downto 0);END divf;ARCHITECTURE behav OF divf ISsignal rst: std_logic;signal qn1:std_logic_vector(9 downto 0);BEGINPROCESS (clk,rst)BEGINif rst=1 thenqn1= 0000000000;elsif clkevent and clk=1 thenqn1=qn1+1;end if;END PROCESS;rst=1 when qn1=1000 else 0;qn=qn1;-计数q=qn1(9);-分频输出,1000 分频END behav;三、三、 仿真结果及分析仿真结果及分析系统总体框图系统总体框图:- word.zl-对于各个模块的仿真测试所得结果,仿真波形分析如下:1、 信号鉴别模块:仿真结果:- word.zl-本模块主要实现抢答功能。当 rst 信号为1 ,en 信号为1时,抢答开场,当有一路正常获得抢答时,系统会自动封锁另外三路的抢答信号,只允许一人处于答题状态;当主持人没有允许抢答时,假设有人超前抢答,警报会响起,同时只要有人抢答那么抢答显示台 states会显示哪一个在抢答。如上图示,在系统第一个复位信号降临后,电路自动复位,在允许抢答信号降临之前即 en=0 ,b 台超前抢答,此时警报响起即超前抢答警报信号fangui 获得一个频率很高的脉冲,就会响起 ,之后主持人复位,并允许抢答,a 台最先抢答,此时抢答显示台显示其台号1。2、 计时模块计时模块:仿真结果:本模块主要实现计时功能。当 rst 信号为1时,计时复位为 30 秒倒计时,主持人允许的 en信号为1时,开场进展倒计时,系统时钟每来一个上升沿,倒计时减1,当到30 秒倒计时计玩仍然无人抢答时, 警报指示灯亮(即 warn= 1 ), 假设有人抢答主持人可以按下中止键 即 stop= 1 ,这样倒计时就会回到 30 秒初始状态。图示的情况为在倒计时 16 秒时,主持人按下中止键,计时器变为初始值 30, 在下一轮抢答过程中, 倒计时为 0 时仍然无人抢答, 此时警报指示信号亮 即 warn=1 。3、计分模块计分模块:仿真结果:- word.zl-本模块主要实现记分功能,其工作情况为:系统复位信号降临即rst=1 ,将每个选手的得分预置为 5 分,抢答显示台显示为 0 即无人抢答,当主持人允许抢答时,假设有人抢答,答对即add=1 ,假设所有人都答对了的加一分,答错(即 add=0)的减一分,没有抢答的保持不变。图示,开场后a 台连续抢答 5 题,且都答对, a_out 变成 10 了,之后c 台连续抢答成功,且都答对加分,最高记到了 15 分数码管显示位 F,此时获胜并把分数重新置为0。4、BCD7BCD7 段译码模块段译码模块:仿真结果:- word.zl-本模块主要实现数据输入的 7 段输出。主要是 0 到 9 的数分别译出,10 到 15 都译为“0000000,实现了设置的功能。5、一千分频模块一千分频模块:仿真结果:本模块实现输入信号的一千分频。另外还可以取其中的其他位,实现其他分频。如上图,qn0实现两分频,qn5实现 64 分频,qn6实现 128 分频,等等。6、顶层模块顶层模块:本模块为顶层文件,是综合抢答器鉴别模块、抢答器计时模块、抢答器记分模块、BCD7 段译码模块和一千分频模块而成。在其仿真波形中描述的情况为:第一次系统复位后,主任人还没有宣布抢答开场,但a 台超前抢答了,fangui 信号脉冲波形出现了,主持人就知道a 犯规了;接着第二轮系统- word.zl-复位后,主持人宣布抢答开场,b 台先抢答成功,抢答显示台号显示为3,单答题错误add=0 ,故减分,相应的数码管显示其总分情况。四、四、 心得体会心得体会这次实验,首先最难的就是模块的划分,必须先有一个总体的规划,然后细化去写每个模块的程序,我在写程序的过程中,参考了课程使用的课件,参考了网上资料,觉得vhdl 程序构造特别严密,并且 quartus ii 软件能为我找出程序语法上的低级失误,低级错误,使我对于vhdl 语法规那么有了更加深刻的理解。此外,在仿真的过程中,开场时经常忘了将当前实体设置为顶层实体使得仿真过程中出现了屡次错误,所以进过这次实验我大概有了一个仿真的固定步骤,一步一步来才不至于出现这种问题。总之,这次实验还是收获颇丰的,我知道了采用自顶向下的设计思想,那么顶层的设计就很重要,顶层设计好后,下面各局部写起来就比拟清楚容易了。- word.zl-