EDA 课程设计——数字式竞赛抢答器
一、系统设计要求
在许多比赛活动中,为了准确、公正、直观地判断出第一抢答者,通常设置一台抢答
器,通过数显、灯光及音响等各种手段批示出第一抢答者。同时,还可以设置计分、犯规及
奖惩记录等各种功能。本设计的具体要求是:
1、设计制作一个可容纳四组参赛者的数字智力抢答器,每组设置一个抢答按钮供抢答者
使用。
2、抢答器具有第一信号鉴别和锁存功能,使除第一抢答者外的按钮无作用。
3、设置一个主持人“复位”按钮。
4、主持人复位后,开始抢答,第一信号鉴别锁存电路得到信号后,有指示灯显示抢答
组别,扬声器发出 2~3 秒的音响。
5、设置一个计分电路,每组开始预置 100 分,由主持人记分,答对一次加 10 分,答错
一次减 10 分。
二、系统设计方案
根据系统设计要求可知,系统的输入信号有:各组的抢答按钮 A、B、C、D,系统清零信
号 CLR,系统时钟信号 CLK,计分复位端 RST,加分按钮端 ADD,减分按钮端 ACC,系统的
输出信号有:四个组抢答成功与否的指示灯控制信号输出口 LEDA、LEDB、LEDC、LEDD,
四个组抢答时的计时数码显示控制信号若干,抢答成功组别显示的控制信号若干,各组计分
动态显示的控制信号若干。本系统应具有的功能有:第一抢答信号的鉴别和锁存功能;抢答
计分功能;各组得分的累加和动态显示功能。
根据以上的分析,我们可将整个系统分为三个主要模块:抢鉴别模块 QDJB;抢答计分模
块 JFQ;显示译码模块 YMQ,对于需显示的信息,需增加或外接译码器,进行显示译码。
考虑到 FPGA 的可用接口及一般 EDA 实验开发系统的输出显示资源的限制,这里我们将组
别显示和计时显示的译码器内设,而将各组的计分显示的译码器外接。
系统的工作原理如下:当主持人按下使能端 CLR 时,抢答器开始工作,A、B、C、D
四个抢答者谁最先抢答成功则此选手的台号灯(LEDA—LEDD)将点亮,并且主持人前的
组别显示数码将显示出抢答成功者的台号;扬声器发出 2~3 秒的音响。接下来主持人提问,
若回答正确,主持人按加分按钮 ADD,若回答错误,主持人按减分按钮 ACC,抢答计分模
块 JFQ 将 给 对 应 的 组 加 分 或 者 减 分 , 并 将 该 组 的 总 分 显 示 在 对 应 的 选 手 计 分 数 码 管
JF2_A~JF0_A、JF2_B~JF0_B、JF2_C~JF0_C、JF2_D~JF0_D、上。完成第一轮抢答后,主
持人清零,接着重新开始,步骤如上。
三、主要 VHDL 源程序与系统模块
1. 抢答鉴别电路 QDJB 的 VHDL 源程序和模块
--QDJB.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY QDJB IS
PORT(CLR:
IN STD_LOGIC;
IN STD_LOGIC;
A, B, C, D:
A1,B1,C1,D1: OUT STD_LOGIC;
STATES: OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END ENTITY 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) 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;
END ARCHITECTURE ART;
图 1 抢答鉴别电路的模块
2. 计分器电路 JFQ 的 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;
ACC: 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 ENTITY JFQ ;
ARCHITECTURE ART OF JFQ IS
BEGIN
PROCESS(RST,ADD,ACC,CHOS) IS
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+'1';
END IF;
ELSE
POINTS_A1: =POINTS_A1+'1';
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+'1';
END IF;
ELSE
POINTS_B1: =POINTS_B1+'1';
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+'1';
END IF;
ELSE
POINTS_C1: =POINTS_C1+'1';
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+'1';
END IF;
ELSE
POINTS_D1: =POINTS_D1+'1';
END IF;
END IF;
ELSEIF (ACC'EVENT AND ACC='1') THEN
IF CHOS="0001" THEN
IF POINTS_A1="0000" THEN
POINTS_A1: ="1001";
IF POINTS_A2="0000" THEN
POINTS_A2: ="0000";
ELSE
POINTS_A2: =POINTS_A2-'1';
END IF;
ELSE
POINTS_A1: =POINTS_A1-'1';
END IF;
ELSIF CHOS="0010" THEN
IF POINTS_B1="0000" THEN
POINTS_B1: ="1001";
IF POINTS_B2="0000" THEN
POINTS_B2: ="0000";
ELSE
POINTS_B2: =POINTS_B2-'1';
END IF;
ELSE
POINTS_B1: =POINTS_B1-'1';
END IF;
ELSIF CHOS="0100" THEN
IF POINTS_C1="0000" THEN
POINTS_C1: ="1001";
IF POINTS_C2="0000" THEN
POINTS_C2: ="0000";
ELSE
POINTS_C2: =POINTS_C2-'1';
END IF;
ELSE
POINTS_C1: =POINTS_C1-'1';
END IF;
ELSIF CHOS="1000" THEN
IF POINTS_D1="0000" THEN
POINTS_D1: ="0000";
IF POINTS_D2="1001" THEN
POINTS_D2: ="0000";
ELSE
POINTS_D2: =POINTS_D2-'1';
END IF;
ELSE
POINTS_D1: =POINTS_D1-'1';
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 ARCHITECTURE ART;
图 2 计分器电路 JFQ 的模块
3. 译码器电路 YMQ 的 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";
WHEN "0001"=>DOUT7<="0000110";
WHEN "0010"=>DOUT7<="1011011";
WHEN "0011"=>DOUT7<="1001111";
WHEN "0100"=>DOUT7<="1100110";
WHEN "0101"=>DOUT7<="1101101";
WHEN "0110"=>DOUT7<="1111101";
WHEN "0111"=>DOUT7<="0000111";
WHEN "1000"=>DOUT7<="1111111";
WHEN "1001"=>DOUT7<="1101111";
WHEN OTHERS=>DOUT7<="0000000";
END CASE;
--0
--1
--2
--3
--4
--5
--6
--7
--8
--9
END PROCESS;
END ARCHITECTURE ART;
图 3 译码器电路 YMQ 的模块
四、系统仿真
1、 系统的有关仿真
系统仿真后的结果分别如图 4、图 5、图 6 所示。
图 4 抢答鉴别电路 QDJB 仿真图
图 5 计分器电路 JFQ 仿真图
图 6 译码器电路 YMQ 仿真图
五、设计技巧分析
1.在抢答鉴别电路设计中,A、B、C、D 四组抢答,理论上应该有 16 种可能情况,但实际
上由于芯片反应速度快到一定程度时,两组以上同时抢答成功的可能性非常不,因此我们可
设计成只有四种情况,这大大简化了电路的设计复杂性。
2.在计分器电路的设计中,按照一般的设计原则,按一定数进制进行加减即可,计分电路
采用十进制加/减计数器、数码管显示,由于每次都是加/减 10 分,所以个位始终为零,
只要十位、百位进行加/减运算即可。
六、心得体会
在这次设计中,我花了不少的时间,其中有苦也有乐。苦的是我付出了不少的汗水,乐的是
在付出的过程中我得到了许多,也学会了许多。
因为一个人的能力毕竟有限,在设计方面难免会出现这样那样的错误,但正是这些错误促进
了我的进步。根据电路的特点,我用层次化结构化设计概念,将此项设计任务分成若干模块,
规定每一模块的功能和各模块之间的接口,然后再将各模块合起来联试,这培养我了层次化
设计的概念。在这次课程设计中,我真正体会到了知识的重要性。在设计的过程中,遇到问
题我会先独立思考,到自己不能解决的时候我就会和同学讨论,实在解决不了我就会向指导
老师请教,应该说从功能的实现到流程图的绘制,从程序的编写到程序的检查,从程序的调
试到实验报告的写作,其间每一个过程都凝聚着大家对我的帮助。
最后,在设计的过程中我进一步养成了软件设计的方法,完成一个项目的的程序,进一步了
解了设计的步骤,进一步加深了对《EDA 基础设计》这门课的理解,增强了以后学习的兴
趣,为以后的工作积累了一定的经验,感谢朱老师给我们提供这次设计的机会。
七、参考文献
[1]《电子技术基础 模拟部分》(第四版),康华光主编,高教出版社
[2]《数字电子技术基础》(第四版),阎石主编,高教出版社
[3]《可编程 ASIC 设计及应用》李广军电子科技大学出版社等
[4] 《EDA 技术综合应用实力与分析》 谭会生主编 西安电子科技大学出版社
[5] 《EDA 与数字系统设计》. 李国丽,朱维勇.机械工业出版社