1、 2 数字抢答器地设计 2.1 二人数字抢答器地设计 一.设计任务:设计一个2人抢答器,采用EPM7128芯片,具体要求如下: (1) 两人抢答,先抢为有效,用发光二极管显示是否抢到优先答题权. (2) 每人2位计分显示,答错不加分,答对加10分.20分.30分. (3) 每题结束后,裁判按复位,可重新抢答下一题. (4) 累计加分可由裁判随时清除. 二.设计框图: 抢答者1 抢答者2 抢答判断 显示抢答指示灯 裁判复位 重新抢答 裁判加分 裁判清零 加分电路 显示加分结果 源程序: library ieee
2、 use ieee.std_logic_1164.all; use ieee.std_logic_signed.all; entity qd is port(i1,i2:in bit; reset:in bit; g10,g20,g30:in bit; clk:in bit; cong:in bit light1, light2:out bit= ’0 ’; t11:out std_logic_vector(6 downto 0):=”0111111”; t12:o
3、ut std_logic_vector(6 downto 0):=”0111111”; t21:out std_logic_vector(6 downto 0):=”0111111”; t22:out std_logic_vector(6 downto 0):=”0111111”); end qd; architecture stru of qd is signal cs1:integer range 0 to 9; signal cs2:integer range 0 to 9; signal a,b:bit:= ’0’; signal 11,12:bit:=
4、 ’0’; begin process(clk) begin if clk’event and clk = ’1 ’then if (cong = ’1 ’) then if (reset = ’1 ’) then if (i1 = ’0 ’and a = ’0 ’) then 11 <=’1 ’; elsif(i2 = ’0 ’and a = ’0 ’) then 12 <=’1 ’;a <=’1 ’;矚慫润厲钐瘗睞枥庑赖。 end if; if (g10=’0’and 11= ’1 ’and b= ’0 ’)t
5、hen cs1<=cs1+1;b<=’1 ’;聞創沟燴鐺險爱氇谴净。 elsif(g20=’0’and 11= ’1 ’and b= ’0 ’)then cs1<=cs1+2;b<=’1 ’;残骛楼諍锩瀨濟溆塹籟。 elsif(g30=’0’and 11= ’1 ’and b= ’0 ’)then cs1<=cs1+3;b<=’1 ’;酽锕极額閉镇桧猪訣锥。 end if; if (g10=’0’and 12= ’1 ’and b= ’0 ’)then cs2<=cs2+1;b<=’1 ’;彈贸摄尔霁毙攬砖卤庑。 elsif(g20=’0’and 12= ’1 ’
6、and b= ’0 ’)then cs2<=cs2+2;b<=’1 ’;謀荞抟箧飆鐸怼类蒋薔。 elsif(g30=’0’and 12= ’1 ’and b= ’0 ’)then cs2<=cs2+3;b<=’1 ’;厦礴恳蹒骈時盡继價骚。 end if; if (cs1 = 0) then t11<=”01111111”; elsif (cs1 = 1) then t11<=”0000110”; elsif (cs1 = 2) then t11<=”1011011”; elsif (cs1 = 3) then t11<=”1001111”; elsif (cs1 = 4)
7、then t11<=”1100110”; elsif (cs1 = 5) then t11<=”11011101”; elsif (cs1 = 6) then t11<=”1111101”; elsif (cs1 = 7) then t11<=”0000111”; elsif (cs1 = 8) then t11<=”1111111”; elsif (cs1 = 9) then t11<=”1101111”; end if; if (cs2 = 0) then t21<=”01111111”; elsif (cs2 = 1) then t21<=”0000110”; elsi
8、f (cs2 = 2) then t21<=”1011011”; elsif (cs2 = 3) then t21<=”1001111”; elsif (cs2 = 4) then t21<=”1100110”; elsif (cs2 = 5) then t21<=”11011101”; elsif (cs2 = 6) then t21<=”1111101”; elsif (cs2 = 7) then t21<=”0000111”; elsif (cs2 = 8) then t21<=”1111111”; elsif (cs2 = 9) then t21<=”1101111”;
9、 end if; else 11<=’0’;12<=’0’;a<=’0’;b<=’0’; end if; else cs1<=’0’; cs2<=’0’; 11<=’0’;12<=’0’; end if; light1<=11; light2<=12; t12<=”01111111”; t22<=”01111111”; end if; end process; end stru; 说明:当一人抢到优先权,发光二极管亮,另一人再按按键无效;答题结束后,裁判按复位键,方可再次抢答;每人有2个数码管显示累加计分情况,分数分为3档,用按键区别.茕桢广鳓鯡选块网羈泪。
10、 2.2 四人数字抢答器地设计 在许多比赛活动中,为了准确.公正.直观地判断出第一抢答者,通常设置一台抢答器,通过抢答器地指示灯显示.数码显示和警示蜂鸣等手段指示出第一抢答者.同时,还可以设置计分.犯规及奖惩计录等多种功能.鹅娅尽損鹌惨歷茏鴛賴。 设计要求: (1)设计制作一个可容纳四组参赛者地数字智力抢答器,每组设置一个抢答按钮供抢答者使用. (2)电路具有第一抢答信号地鉴别和锁存功能. (3)设置计分电路. (4)设置犯规电路. 设计方案 根据系统设计要求可知,系统地输入信号有:各组地抢答按钮A.B.C.D,系统清零信号CLR,系统时钟信号C
11、LK,计分复位端RST,加分按钮端ADD,计时预置控制端LDN,计时使能端EN,计时预置数据调整按钮TA.TB;系统地输出信号有:四个组抢答成功与否地指示灯控制信号输出口LEDA.LEDB.LEDC.LEDD,四个组抢答时地计时数码显示控制信号若干,抢答成功组别显示地控制信号若干,各组计分动态显示地控制信号若干.籟丛妈羥为贍偾蛏练淨。 根据以上地分析,可将整个系统分为三个主要模块:抢答鉴别模块QDJB;抢答计时模块JSQ;抢答计分模块JFQ.对于需显示地信息,需增加或外接译码器,进行显示译码.考虑到FPGA/CPLD地可用接口及一般EDA实验开发系统提供地输出显示资源地限制,这里我们将组别显
12、示和计时显示地译码器内设,而将各组地计分显示地译码器外接.預頌圣鉉儐歲龈讶骅籴。 抢答鉴别电路地设计与实现 抢答鉴别模块用来判断A.B.C.D四组抢答者谁最先按下按钮.并为显示端送出信号,使观众能够清楚地知道是哪一组抢答成功,是整个系统地核心部分.同时为下一模块输入信号,以方便裁判为该组加分.渗釤呛俨匀谔鱉调硯錦。 模块如图1所示,系统地输入信号有:各组地抢答按钮A.B.C.D,系统清零信号CLR.系统地输出信号有: 各组地抢答按钮显示端A1.B1.C1.D1,组别显示端STATES[3..0],同时作为下一模块JFQ模块地输入信号.铙誅卧泻噦圣骋贶頂廡。 图1 VHDL实现方法如下
13、所示: ARCHITECTURE ART OF QDJB IS CONSTANT W1: STD_LOGIC_VECTOR:="0001"; CONSTANT W2: STD_LOGIC_VECTOR:="0010"; CONSTANT W3: STD_LOGIC_VECTOR:="0100"; CONSTANT W4: STD_LOGIC_VECTOR:="1000"; BEGIN PROCESS(CLR,A,B,C,D) IS BEGIN IF CLR='1' THEN STATES<="0000"; ELSIF (
14、A='1'AND B='0'AND C='0'AND D='0') THEN A1<='1'; B1<='0'; C1<='0'; D1<='0'; STATES<=W1; ELSIF (A='0'AND B='1'AND C='0'AND D='0') THEN A1<='0'; B1<='1'; C1<='0'; D1<='0'; STATES<=W2; ELSIF (A='0'AND B='0'AND C='1'AND D='0') THEN A1<='0'; B1<='0'; C1
15、<='1'; D1<='0'; STATES<=W3; ELSIF (A='0'AND B='0'AND C='0'AND D='1') THEN A1<='0'; B1<='0'; C1<='0'; D1<='1'; STATES<=W4; END IF; END PROCESS; 在抢答鉴别电路地设计中,A.B.C.D四组抢答,理论上应该有16种可能情况,但实际上由于芯片地反应速度快到一定程度时,两组以上同时抢答成功地可能性非常小,因此可设计成只有四种情况,即ABCD分别为1000.0100.0010.0001,这大大简化了电路地设计复杂
16、性.擁締凤袜备訊顎轮烂蔷。 计分器地设计与实现 在计分器电路地设计中,按照一般地设计原则,按一定数进制进行加减即可. 模块如图2所示,系统地输入信号有:计分复位端RST,加分按钮端ADD,减分按钮端SUB,组别号输入端CHOS[3..0].系统地输出信号有:A组分数输出端AA2[3..0].AA1[3..0].AA0[3..0],B组分数输出端BB2[3..0].BB1[3..0].BB0[3..0],C组分数输出端CC2[3..0].CC1[3..0].CC0[3..0],D组分数输出端DD2[3..0].DD1[3..0].DD0[3..0].贓熱俣阃歲匱阊邺镓騷。 图2
17、 VHDL实现方法如下所示: (1)当按下RST键时,使分数复位,每位地初始分数为100分. IF RST='1' THEN POINTS_A2:="0001"; POINTS_A1:="0000"; POINTS_B2:="0001"; POINTS_B1:="0000"; POINTS_C2:="0001"; POINTS_C1:="0000"; POINTS_D2:="0001"; POINTS_D1:="0000"; (2)当按下加分按钮端ADD时,以给A组加分为例. IF POINTS_A1="1001" THEN
18、 POINTS_A1:="0000"; IF POINTS_A2="1001" THEN POINTS_A2:="0000"; ELSE POINTS_A2:=POINTS_A2+ "0001"; END IF; ELSE POINTS_A1:=POINTS_A1+ "0001"; END IF; (3)当按下减分按钮端SUB时,以给A组减分为例. IF POINTS_A1="0000" THEN POINTS_A1:="1001"; IF POINTS_A2="0000"
19、 THEN POINTS_A2:="1001"; ELSE POINTS_A2:=POINTS_A2+ "1111"; END IF; ELSE POINTS_A1:=POINTS_A1+ "1111"; END IF; 在设计中减法地实现是以加法运算来实现地.以A为例,由于每次减分都是减去10分,即每次为POINTS_A1减一,所以可以用POINTS_A1+ "1111"来实现.如:0111-0001=0110,用加法实现:0111+1111=10110.由于POINTS_A1: STD_LOGIC_VECT
20、OR(3 DOWNTO 0),所以POINTS_A1=0110.坛摶乡囂忏蒌鍥铃氈淚。 计时器地设计与实现 本系统中地计时器电路既有计时初始值地预置功能,又有倒计数功能,功能比较齐全. 模块如图3所示,系统输入信号有:系统清零信号CLR,计时预置控制端LDN,计时使能端EN,系统时钟信号CLK,计时预置数据调整按钮TA.TB.系统输出信号有:倒计时输出端QA[3..0].QB[3..0].蜡變黲癟報伥铉锚鈰赘。 图3 VHDL实现方法如下所示: (1)计时初始值功能地实现. PROCESS(TA,TB,CLR) BEGIN IF CLR='1' THEN
21、 DA<="0000"; DB<="0000"; ELSE IF TA='1' THEN DA<=DA+'1' ; END IF; IF TB='1' THEN DB<=DB+'1'; END IF; END IF; END PROCESS; (2)60秒倒计时功能地实现. PROCESS(CLK) VARIABLE TMPA: STD_LOGIC_VECTOR(3 DOWNTO 0); VARIABLE TMPB: STD_LOGIC_VECTOR(3 DOWNTO 0);
22、 BEGIN IF CLR='1' THEN TMPA:="0000"; TMPB:="0110"; ELSIF CLK'EVENT AND CLK='1' THEN IF LDN='1' THEN TMPA:=DA; TMPB:=DB; ELSIF EN='1' THEN IF TMPA="0000" THEN TMPA:="1001"; IF TMPB="0000" THEN TMPB:="0110"; ELSE
23、 TMPB:=TMPB-1; END IF; ELSE TMPA:=TMPA-1; END IF; END IF; END IF; QA<=TMPA; QB<=TMPB; END PROCESS; 译码器地设计与实现 该模块实际上是一个译码器,主要是用来完成四位二进制BCD编码转换成七段二进制数字,以阿拉伯数字地形式输出在数码管上,使观众能够更直观地看到结果.译码器地译码对照表如下所示:買鲷鴯譖昙膚遙闫撷凄。 显示地数字/字母 BCD编码 七段数码管2
24、进制 0 0000 0111111 1 0001 0000110 2 0010 1011011 3 0011 1001111 4 0100 1100110 5 0101 1101101 6 0110 1111101 7 0111 0000111 8 1000 1111111 9 1001 1101111 X XXXX 0000000 表2-1 模块如图4所示,由四位串行输入端AIN4[3..0]和七位串行输出端DOUT7[6..0]组成. 图4 VHDL实现方法如下所示: ARCHITECTURE ART OF YMQ
25、 IS BEGIN PROCESS(AIN4) BEGIN CASE AIN4 IS WHEN "0000"=>DOUT7<="0111111"; --0 WHEN "0001"=>DOUT7<="0000110"; --1 WHEN "0010"=>DOUT7<="1011011"; --2 WHEN "0011"=>DOUT7<="1001111"; --3 WHEN "0100"=>DOUT7<="1100110"; --4 WHEN "0101"=>DOUT7<="1101101
26、"; --5 WHEN "0110"=>DOUT7<="1111101"; --6 WHEN "0111"=>DOUT7<="0000111"; --7 WHEN "1000"=>DOUT7<="1111111"; --8 WHEN "1001"=>DOUT7<="1101111"; --9 WHEN OTHERS=>DOUT7<="0000000"; END CASE; END PROCESS; END ARCHITECTURE ART; 在程序中只考虑0000-1001(即0-9)地情况,将其转
27、化为相应地七段显示器地码子,其他情况不予考虑.綾镝鯛駕櫬鹕踪韦辚糴。 数字抢答器地实现 在每个模块完成之后,就要将它们合为一个整体,成为一个能提供所要求功能地系统. 电路图如下: 附 录 附录1 抢答鉴别模块VHDL程序(QDJB.VHD) LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY QDJB IS PORT(CLR: IN STD_LOGIC; A, B, C, D: IN STD_LOGIC; A1,B1,C1,D1: OUT STD_LOGIC;
28、STATES: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END QDJB; ARCHITECTURE ART OF QDJB IS CONSTANT W1: STD_LOGIC_VECTOR:="0001"; CONSTANT W2: STD_LOGIC_VECTOR:="0010"; CONSTANT W3: STD_LOGIC_VECTOR:="0100"; CONSTANT W4: STD_LOGIC_VECTOR:="1000"; BEGIN PROCESS(CLR,A,B,C,D) BEGIN
29、 IF CLR='1' THEN STATES<="0000"; ELSIF (A='1'AND B='0'AND C='0'AND D='0') THEN A1<='1'; B1<='0'; C1<='0'; D1<='0'; STATES<=W1; ELSIF (A='0'AND B='1'AND C='0'AND D='0') THEN A1<='0'; B1<='1'; C1<='0'; D1<='0'; STATES<=W2; ELSIF (A='0'AND B='0'AND C='1'AND D='0') THEN
30、 A1<='0'; B1<='0'; C1<='1'; D1<='0'; STATES<=W3; ELSIF (A='0'AND B='0'AND C='0'AND D='1') THEN A1<='0'; B1<='0'; C1<='0'; D1<='1'; STATES<=W4; END IF; END PROCESS; END ART; 附录2 计分器模块VHDL程序(JFQ.VHD) LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_
31、UNSIGNED.ALL; ENTITY JFQ IS PORT(RST: IN STD_LOGIC; ADD: IN STD_LOGIC; SUB: IN STD_LOGIC; CHOS: IN STD_LOGIC_VECTOR(3 DOWNTO 0); AA2,AA1,AA0,BB2,BB1,BB0: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); 驅踬髏彦浃绥譎饴憂锦。 CC2,CC1,CC0,DD2,DD1,DD0: OUT STD_LOGIC_VECTOR(3 DOWNT
32、O 0)); 猫虿驢绘燈鮒诛髅貺庑。 END JFQ ; ARCHITECTURE ART OF JFQ IS BEGIN PROCESS(RST,ADD,SUB,CHOS) VARIABLE POINTS_A2,POINTS_A1: STD_LOGIC_VECTOR(3 DOWNTO 0); 锹籁饗迳琐筆襖鸥娅薔。 VARIABLE POINTS_B2,POINTS_B1: STD_LOGIC_VECTOR(3 DOWNTO 0); 構氽頑黉碩饨荠龈话骛。 VARIABLE POINTS_C2,POINTS_C1: STD_LOGIC_VECT
33、OR(3 DOWNTO 0); 輒峄陽檉簖疖網儂號泶。 VARIABLE POINTS_D2,POINTS_D1: STD_LOGIC_VECTOR(3 DOWNTO 0); 尧侧閆繭絳闕绚勵蜆贅。 BEGIN IF (ADD'EVENT AND ADD='1') THEN IF RST='1' THEN POINTS_A2:="0001"; POINTS_A1:="0000"; POINTS_B2:="0001"; POINTS_B1:="0000"; POINTS_C2:="0001";
34、 POINTS_C1:="0000"; POINTS_D2:="0001"; POINTS_D1:="0000"; ELSIF CHOS="0001" THEN IF POINTS_A1="1001" THEN POINTS_A1:="0000"; IF POINTS_A2="1001" THEN POINTS_A2:="0000"; ELSE POINTS_A2:=POINTS
35、A2+"0001"; END IF; ELSE POINTS_A1:=POINTS_A1+"0001"; END IF; ELSIF CHOS="0010" THEN IF POINTS_B1="1001" THEN POINTS_B1:="0000"; IF POINTS_B2="1001" THEN POINTS_B2:="0000";
36、 ELSE POINTS_B2:=POINTS_B2+"0001"; END IF; ELSE POINTS_B1:=POINTS_B1+"0001"; END IF; ELSIF CHOS="0100" THEN IF POINTS_C1="1001" THEN POINTS_C1:="0000"; IF POINTS_C2="1001" THE
37、N POINTS_C2:="0000"; ELSE POINTS_C2:=POINTS_C2+"0001"; END IF; ELSE POINTS_C1:=POINTS_C1+"0001"; END IF; ELSIF CHOS="1000" THEN IF POINTS_D1="1001" THEN POINTS_D1:
38、"0000"; IF POINTS_D2="1001" THEN POINTS_D2:="0000"; ELSE POINTS_D2:=POINTS_D2+"0001"; END IF; ELSE POINTS_D1:=POINTS_D1+"0001"; END IF; END IF; ELSIF (SUB'EVENT AND S
39、UB='1') THEN IF RST='1' THEN POINTS_A2:="0001"; POINTS_A1:="0000"; POINTS_B2:="0001"; POINTS_B1:="0000"; POINTS_C2:="0001"; POINTS_C1:="0000"; POINTS_D2:="0001"; POINTS_D1:="0000"; ELSIF CHOS="0001" THEN IF POINTS_A1="0000" THEN
40、 POINTS_A1:="1001"; IF POINTS_A2="0000" THEN POINTS_A2:="1001"; ELSE POINTS_A2:=POINTS_A2+"1111"; END IF; ELSE POINTS_A1:=POINTS_A1+"1111"; END IF; ELSIF CHOS="
41、0010" THEN IF POINTS_B1="0000" THEN POINTS_B1:="1001"; IF POINTS_B2="0000" THEN POINTS_B2:="1001"; ELSE POINTS_B2:=POINTS_B2+"1111"; END IF; ELSE POINTS_B1:=POINTS_B1+"11
42、11"; END IF; ELSIF CHOS="0100" THEN IF POINTS_C1="0000" THEN POINTS_C1:="1001"; IF POINTS_C2="0000" THEN POINTS_C2:="1001"; ELSE POINTS_C2:=POINTS_C2+"1111"; END IF;
43、 ELSE POINTS_C1:=POINTS_C1+"1111"; END IF; ELSIF CHOS="1000" THEN IF POINTS_D1="0000" THEN POINTS_D1:="1001"; IF POINTS_D2="0000" THEN POINTS_D2:="1001"; ELSE POINTS_D2:=
44、POINTS_D2+"1111"; END IF; ELSE POINTS_D1:=POINTS_D1+"1111"; END IF; END IF; END IF; AA2<=POINTS_A2; AA1<=POINTS_A1; AA0<="0000"; BB2<=POINTS_B2; BB1<=POINTS_B1; BB0<="0000"; CC2<=POINTS_C2; CC1<=POINTS_C1; CC0<=
45、"0000"; DD2<=POINTS_D2; DD1<=POINTS_D1; DD0<="0000"; END PROCESS; END ART; 附录3 计时器模块VHDL程序(JFQ.VHD) LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY JSQ IS PORT(CLR,LDN,EN,CLK: IN STD_LOGIC; TA,TB: IN STD_LOGIC; QA: OUT STD_L
46、OGIC_VECTOR(3 DOWNTO 0); QB: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END JSQ; ARCHITECTURE ART OF JSQ IS SIGNAL DA: STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL DB: STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN PROCESS(TA,TB,CLR) BEGIN IF CLR='1' THEN DA<="0000"; DB<="0000";
47、 ELSE IF TA='1' THEN DA<=DA+'1' ; END IF; IF TB='1' THEN DB<=DB+'1'; END IF; END IF; END PROCESS; PROCESS(CLK) VARIABLE TMPA: STD_LOGIC_VECTOR(3 DOWNTO 0); VARIABLE TMPB: STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN IF CLR='1' THEN TMPA:="0000
48、"; TMPB:="0110"; ELSIF CLK'EVENT AND CLK='1' THEN IF LDN='1' THEN TMPA:=DA; TMPB:=DB; ELSIF EN='1' THEN IF TMPA="0000" THEN TMPA:="1001"; IF TMPB="0000" THEN TMPB:="0110"; ELSE TMPB:=TMPB-1; END IF; ELS
49、E TMPA:=TMPA-1; END IF; END IF; END IF; QA<=TMPA; QB<=TMPB; END PROCESS; END ART; 附录4 译码器VHDL程序(YMQ.VHD) LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY YMQ IS PORT(AIN4: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
50、 DOUT7: OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END YMQ; ARCHITECTURE ART OF YMQ IS BEGIN PROCESS(AIN4) BEGIN CASE AIN4 IS WHEN "0000"=>DOUT7<="0111111"; --0 WHEN "0001"=>DOUT7<="0000110"; --1 WHEN "0010"=>DOUT7<="1011011"; --2 WHEN "0011"=>DOUT7<="1001111";






