1、系统复位信号rst;无人抢答警报信号warn;计时中止信号stop;计时十位个位信号tb,ta。计分模块。此模块主要实现给四个抢答器计分的功能,初始条件下,为每个抢答器信号预制5分,当某组抢答且回答正确时加一分,答错减一分,未获答题机会时保持不变。其中设有时钟信号clk;复位信号rst;抢答结果显示信号states;记分加减信号add(add1时为加,add0时为减);四个信号的得分显示信号a_out,b_out,c_out,d_out。BCD译码模块。此模块主要实现将抢答结果信号显示在bcd七段译码器上。其中输入信号a;输出译码结果信号q。分频器。此模块主要实现时钟分频功能。在开头对时钟信号
2、进行一次千分频。其中时钟输入信号clkin,输出信号clk。顶层模块。将前几个模块综合在一起,形成一个整体。分频器输出作为其他模块所需的时钟信号,使整个系统正常运转。二、程序源代码及说明抢答信号鉴别模块的程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity qdjb is port(clk2,en,rst:in std_logic; a,b,c,d: fangui:out std_logic; states:out std_logic_vector(3 downto 0);end q
3、djb;architecture one of qdjb issignal sinor,fanguif,tmp:std_logic;signal cnt:std_logic_vector(5 downto 0);beginsinor=a or b or c or d;p1:process(a,rst,b,c,d,tmp) begin if rst=1 then -复位信号有效,系统复位。 tmp=;states=0000 elsif tmp= then if a= then -判断哪路信号变化,进行选取 states0001tmp0 -对states进行置数 elsif b=0010 elsi
4、f c=0011 elsif d=0100 else tmp end if ; end if;end process p1;p2:process(clk2,en,rst,cnt) -判断是否提前抢答并报警 cnt000000fanguif -初始化提前抢答犯规信号 elsif clk2event and clk2= if en= and sinor= if cnt111111 fanguif=not fanguif;cnt=cnt+1; else fanguifend process p2;fangui=fanguif;end one;计时模块的程序:entity js is port(clk
5、,rst,en,stop: warn:buffer std_logic; ta,tb:buffer std_logic_vector(3 downto 0);end js;architecture one of js issignal co:process(clk,rst,en,stop,ta) -个位计时信号进行0到9循环计数 or stop= ta elsif clkevent and clk= co if ta=1001co else ta=ta-1;process(co,rst,en,stop,tb) -十位计时信号0到3变化 tb elsif coevent and co= if t
6、b= then tb else tb=tb-1;p3:process(rst,ta,tb) -计时时间到达,报警 warn elsif ta= and tb= else warnend process p3;计分模块的程序:entity jf is port(clk,rst,en,add:in std_logic_vector(3 downto 0); a_out,b_out,c_out,d_out:end jf;architecture one of jf isprocess(clk,rst,add,states,a_out,b_out,c_out,d_out) if (rst=) then
7、 a_out0101b_outc_outd_out if add= then -add信号为高时,加1分 if a_out=1111 then -最多15分 a_out else a_out=a_out+1; end if; elsif add= then -add信号为0,减1分=a_out-1; if b_out= b_out else b_out=b_out+1;=b_out-1; if c_out= c_out else c_out=c_out+1;=c_out-1; if d_out= d_out else d_out=a_out;=b_out;=c_out;=d_out; end
8、case;抢答器顶层模块程序:entity qiangda is port(clkin,clk2,en,a,b,c,d,add,stop,rst: fangui,alarm:buffer std_logic_vector(3 downto 0); statesout:out std_logic_vector(0 to 6);end qiangda;architecture bhv of qiangda iscomponent qdjb isend component;component js iscomponent jf iscomponent BCD7 isport(a:q:out std_
9、logic_vector(0 to 6);end component BCD7;component divf is port(clk: IN STD_LOGIC; q : OUT STD_LOGIC; qn: OUT std_logic_vector(9 downto 0);end component divf;std_logic_vector(3 downto 0);signal clk: STD_LOGIC;signal divqn: std_logic_vector(3 downto 0);u1:qdjb port map(clk2,en,rst,a,b,c,d,fangui,state
10、s);u2:js port map(clk,rst,en,stop,alarm,ta,tb);u3:jf port map(clk,rst,en,add,states,a_out,b_out,c_out,d_out);u4:BCD7 port map(states,statesout);u5:divf port map(clkin,clk,divqn);end bhv;BCD7段译码器模块程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY BCD7 ISPORT(a: IN STD_LOGIC_VECTOR(3 DOWNTO 0); -数据输入
11、 q : OUT STD_LOGIC_VECTOR(0 TO 6) ); -7段输出END BCD7;ARCHITECTURE behav OF BCD7 IS BEGIN PROCESS (a) BEGIN case a(3 downto 0) is - BCD 7段译码表 = q0000000 END case; END PROCESS;END behav;一千分频器模块程序:USE IEEE.STD_LOGIC_unsigned.ALL;ENTITY divf ISPORT(clk: qn:END divf;ARCHITECTURE behav OF divf IS signal rst
12、: std_logic; signal qn1:std_logic_vector(9 downto 0);PROCESS (clk,rst) qn1= 000=qn1+1; rst when qn1=1000 else qn=qn1; -计数=qn1(9); -分频输出,1000分频三、仿真结果及分析系统总体框图:对于各个模块的仿真测试所得结果,仿真波形分析如下:1、信号鉴别模块:仿真结果: 本模块主要实现抢答功能。当rst信号为1,en信号为1时,抢答开始,当有一路正常获得抢答时,系统会自动封锁另外三路的抢答信号,只允许一人处于答题状态;当主持人没有允许抢答时,若有人超前抢答,警报会响起,同
13、时只要有人抢答那么抢答显示台(states)会显示哪一个在抢答。如上图示,在系统第一个复位信号来临后,电路自动复位,在允许抢答信号来临之前(即en=0),b台超前抢答,此时警报响起(即超前抢答警报信号fangui获得一个频率很高的脉冲,就会响起),之后主持人复位,并允许抢答,a台最先抢答,此时抢答显示台显示其台号1。2、计时模块:本模块主要实现计时功能。当rst信号为1时,计时复位为30秒倒计时,主持人允许的en信号为1时,开始进行倒计时,系统时钟每来一个上升沿,倒计时减1,当到30秒倒计时计玩仍然无人抢答时,警报指示灯亮(即warn=1),若有人抢答主持人可以按下中止键(即stop=1),这
14、样倒计时就会回到30秒初始状态。图示的情况为在倒计时16秒时,主持人按下中止键,计时器变为初始值30,在下一轮抢答过程中,倒计时为0时仍然无人抢答,此时警报指示信号亮(即warn=1)。3、计分模块:本模块主要实现记分功能,其工作情况为:系统复位信号来临(即rst=1),将每个选手的得分预置为5分,抢答显示台显示为0即无人抢答,当主持人允许抢答时,若有人抢答,答对(即add=1,假设所有人都答对了)的加一分,答错(即add=0)的减一分,没有抢答的保持不变。图示,开始后a台连续抢答5题,且都答对,a_out变成10了,之后c台连续抢答成功,且都答对加分,最高记到了15分数码管显示位F,此时获胜
15、并把分数重新置为0。4、BCD7段译码模块: 本模块主要实现数据输入的7段输出。主要是0到9的数分别译出,10到15都译为“”,实现了设置的功能。5、一千分频模块:本模块实现输入信号的一千分频。另外还可以取其中的其他位,实现其他分频。如上图,qn0实现两分频,qn5实现64分频,qn6实现128分频,等等。6、顶层模块: 本模块为顶层文件,是综合抢答器鉴别模块、抢答器计时模块、抢答器记分模块、BCD7段译码模块和一千分频模块而成。在其仿真波形中描述的情况为:第一次系统复位后,主任人还没有宣布抢答开始,但a台超前抢答了,fangui信号脉冲波形出现了,主持人就知道a犯规了;接着第二轮系统复位后,
16、主持人宣布抢答开始,b台先抢答成功,抢答显示台号显示为3,单答题错误(add=0),故减分,相应的数码管显示其总分情况。四、心得体会这次实验,首先最难的就是模块的划分,必须先有一个总体的规划,然后细化去写每个模块的程序,我在写程序的过程中,参考了课程使用的课件,参考了网上资料,觉得vhdl程序结构特别严密,并且quartus ii软件能为我找出程序语法上的低级失误,低级错误,使我对于vhdl语法规则有了更加深刻的理解。此外,在仿真的过程中,开始时经常忘了将当前实体设置为顶层实体使得仿真过程中出现了多次错误,所以进过这次实验我大概有了一个仿真的固定步骤,一步一步来才不至于出现这种问题。总之,这次实验还是收获颇丰的,我知道了采用自顶向下的设计思想,那么顶层的设计就很重要,顶层设计好后,下面各部分写起来就比较清楚容易了。