资源描述
2 数字抢答器地设计
2.1 二人数字抢答器地设计
一.设计任务:设计一个2人抢答器,采用EPM7128芯片,具体要求如下:
(1) 两人抢答,先抢为有效,用发光二极管显示是否抢到优先答题权.
(2) 每人2位计分显示,答错不加分,答对加10分.20分.30分.
(3) 每题结束后,裁判按复位,可重新抢答下一题.
(4) 累计加分可由裁判随时清除.
二.设计框图:
抢答者1
抢答者2
抢答判断
显示抢答指示灯
裁判复位
重新抢答
裁判加分
裁判清零
加分电路
显示加分结果
源程序:
library ieee;
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:out 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:= ’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 ’)then 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 ’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) 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”;
elsif (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”;
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档,用按键区别.茕桢广鳓鯡选块网羈泪。
2.2 四人数字抢答器地设计
在许多比赛活动中,为了准确.公正.直观地判断出第一抢答者,通常设置一台抢答器,通过抢答器地指示灯显示.数码显示和警示蜂鸣等手段指示出第一抢答者.同时,还可以设置计分.犯规及奖惩计录等多种功能.鹅娅尽損鹌惨歷茏鴛賴。
设计要求:
(1)设计制作一个可容纳四组参赛者地数字智力抢答器,每组设置一个抢答按钮供抢答者使用.
(2)电路具有第一抢答信号地鉴别和锁存功能.
(3)设置计分电路.
(4)设置犯规电路.
设计方案
根据系统设计要求可知,系统地输入信号有:各组地抢答按钮A.B.C.D,系统清零信号CLR,系统时钟信号CLK,计分复位端RST,加分按钮端ADD,计时预置控制端LDN,计时使能端EN,计时预置数据调整按钮TA.TB;系统地输出信号有:四个组抢答成功与否地指示灯控制信号输出口LEDA.LEDB.LEDC.LEDD,四个组抢答时地计时数码显示控制信号若干,抢答成功组别显示地控制信号若干,各组计分动态显示地控制信号若干.籟丛妈羥为贍偾蛏练淨。
根据以上地分析,可将整个系统分为三个主要模块:抢答鉴别模块QDJB;抢答计时模块JSQ;抢答计分模块JFQ.对于需显示地信息,需增加或外接译码器,进行显示译码.考虑到FPGA/CPLD地可用接口及一般EDA实验开发系统提供地输出显示资源地限制,这里我们将组别显示和计时显示地译码器内设,而将各组地计分显示地译码器外接.預頌圣鉉儐歲龈讶骅籴。
抢答鉴别电路地设计与实现
抢答鉴别模块用来判断A.B.C.D四组抢答者谁最先按下按钮.并为显示端送出信号,使观众能够清楚地知道是哪一组抢答成功,是整个系统地核心部分.同时为下一模块输入信号,以方便裁判为该组加分.渗釤呛俨匀谔鱉调硯錦。
模块如图1所示,系统地输入信号有:各组地抢答按钮A.B.C.D,系统清零信号CLR.系统地输出信号有: 各组地抢答按钮显示端A1.B1.C1.D1,组别显示端STATES[3..0],同时作为下一模块JFQ模块地输入信号.铙誅卧泻噦圣骋贶頂廡。
图1
VHDL实现方法如下所示:
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 (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<='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,这大大简化了电路地设计复杂性.擁締凤袜备訊顎轮烂蔷。
计分器地设计与实现
在计分器电路地设计中,按照一般地设计原则,按一定数进制进行加减即可.
模块如图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
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
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" 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_VECTOR(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
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);
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 TMPB:=TMPB-1;
END IF;
ELSE TMPA:=TMPA-1;
END IF;
END IF;
END IF;
QA<=TMPA; QB<=TMPB;
END PROCESS;
译码器地设计与实现
该模块实际上是一个译码器,主要是用来完成四位二进制BCD编码转换成七段二进制数字,以阿拉伯数字地形式输出在数码管上,使观众能够更直观地看到结果.译码器地译码对照表如下所示:買鲷鴯譖昙膚遙闫撷凄。
显示地数字/字母
BCD编码
七段数码管2进制
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 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"; --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)地情况,将其转化为相应地七段显示器地码子,其他情况不予考虑.綾镝鯛駕櫬鹕踪韦辚糴。
数字抢答器地实现
在每个模块完成之后,就要将它们合为一个整体,成为一个能提供所要求功能地系统. 电路图如下:
附 录
附录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;
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
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
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_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 DOWNTO 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_VECTOR(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"; 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_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";
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" THEN
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:="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 SUB='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
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="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+"1111";
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;
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:=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<="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_LOGIC_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";
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"; 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;
ELSE 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);
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";
展开阅读全文