课程设计《数字式智力抢答器》

更新时间:2024-04-06 08:18:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

课程设计

《数字式智力抢答器》

系统设计要求:

设计一个智力抢答器,可以判断第一抢答者,并具备计分功能。

抢答器有4路抢答按钮。设置抢答器使能信号,当此信号有效时,若参赛者按下抢答开关,则抢答器能判断出第一抢答者并指示该组抢答成功,其他参赛者的抢答开关不起作用。若提前抢答,则对相应的参赛者发出警报。

系统具有清零功能。当清零信号有效时,抢答器对前一轮抢答的第一抢答者判断结果进行清零,恢复为初始状态。

数字式智力抢答器还具有计分功能。如果抢答成功的参赛者满足得分条件,则增加相应分数,答错不扣分。

一、系统方案设计

根据系统设计要求,系统主要由三个主要的电路模块组成,分别为第一抢答判断电路、计分电路、显示电路。其中第一抢答判断电路主要完成最快抢答者的判断功能;计分电路存储每组竞赛者的分数;显示电路显示抢答器的状态和各组的分数。

因此,数字竞赛抢答器的输入信号包括:

复位信号CLR、抢答器使能信号EN、四组抢答按钮A/B/C/D、加分信号ADD;

输出信号:

四组抢答状态的显示LEDx;对应的得分SCOREx;抢答器抢答成功的组别显示、报警信号FALSE。

二、单元电路设计

1、第一抢答判断电路

第一抢答判断电路模块具有第一抢答信号的鉴别和锁存功能。 (1)当复位CLR信号有效(高电平)时,电路清零。

(2)当使能信号EN为低电平时,如果有人抢答,则提前抢答报警信号FALSE[3..0]

的对应位输出高电平,以示警告。 (3)当EN为高电平时,抢答开始。

首先将报警信号FALSE[3..0]清零,然后根据四组竞赛者的抢答情况选择最先抢答

的信号,显示抢答状态显示信号LEDA—LEDD。(即LEDA—LEDD对应输出高电平)。抢答成功者的组别编号由信号Q[3..0]输出,并锁存抢答器此时的状态,直到CLR信号有效为止。

(4)在每一轮新的抢答之前,都要使用复位信号CLR,清除上一轮抢答留下的痕迹,使电路恢复初始状态。 qd

第一抢答电路VHDL程序 library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;

clrenABCDLEDALEDBLEDCLEDDFALSE[3..0]Q[3..0]inst2

entity qd is

port(clr,en:in std_logic; A,B,C,D:in std_logic;

LEDA,LEDB,LEDC,LEDD:out std_logic;--抢答成功指示灯 FALSE:out std_logic_vector(3 downto 0);--提前抢答报警 Q: out std_logic_vector(3 downto 0)); --抢答成功组显示 End qd;

Architecture behave of qd is

Signal temp: std_logic_vector(3 downto 0); Signal TAG : std_logic; --设置锁存标志位 Begin

Temp<=A&B&C&D;

PROCESS(clr,EN,A,B,C,D) BEGIN

IF clr=’1’ then -- 电路清零 Q<=”0000”; LEDA<=’0’; LEDB<=’0’; LEDC<=’0’; LEDD<=’0’;

FALSE<=”0000”; TMG<=’0’;

ELSIF (EN=’0’) THEN -- 提前抢答报警 IF A=’1’ THEN --A提前抢答报警 FALSE(3)<=’1’; END IF;

IF B=’1’ THEN FALSE(2)<=’1’; END IF;

IF C=’1’ THEN FALSE(1)<=’1’; END IF;

IF D=’1’ THEN FALSE(0)<=’0’; END IF;

ELSE –抢答开始

FALSE<=”0000”;

IF TAG=’0’ THEN -- 尚未有抢答成功者 IF TEMP=”1000” THEN LEDA<=’1’;

LEDB<=”0”;

ELSIF TEMP=”0100” THEN LEDA<=’0’; LEDB<=”1”; LEDC<=”0”;

LEDD<=’0’;

Q<=”0100”; --显示B抢答成功 TAG<=’1’; --锁存此状态

ELSIF TEMP=”0010” THEN LEDA<=’0’;

LEDB<=”0”; LEDC<=”1”; LEDD<=’0’;

Q<=”0010”; --显示A抢答成功 TAG<=’1’; --锁存此状态 LEDC<=”0”; LEDD<=’0’;

Q<=”1000”; --显示A抢答成功 TAG<=’1’; --锁存此状态

ELSIF TEMP=”0001” THEN LEDA<=’0’; LEDB<=”0”;

LEDC<=”0”; LEDD<=’1’;

Q<=”0001”; --显示A抢答成功 TAG<=’1’; --锁存此状态

END IF; END IF; END IF; END PROCESS; END behave;

2、计分电路

计分电路在参赛者抢答成功后,根据比赛情况进行比较分数的调整。该模块包括加分选择信号ADD、组别选择信号CHOS[3..0],其中加分选择信号ADD高电平有效,有效时对CHOS[3..0]选择的参赛组进行加分;组别选择信号CHOS[3..0]就是第一抢答电路模块的输出信号Q[3..0]. 输出信号分别对应四组参赛组的得分,以百分制表示。每组分数在比赛开始时预设100分,每答对一题加10分,答错不扣分。得分的个位、十位、百位用4位的逻辑矢量表示,使之方便与显示电路级联,从而输出比赛得分。 计分电路VHDL程序

--files:counter.vhd --date:2011/05/23 --designer: zj CHEN --Quartus ii 7.2 --

--description:计分电路 library ieee;

use ieee.std_logic_1164.all;

counterADDCHOS[3..0]A2[3..0]A1[3..0]A0[3..0]B2[3..0]B1[3..0]B0[3..0]C2[3..0]C1[3..0]C0[3..0]D2[3..0]D1[3..0]use ieee.std_logic_unsigned.all;

D0[3..0]

entity counter is

inst port(ADD: in std_logic; --加分信号--

CHOS:IN STD_LOGIC_VECTOR(3 DOWNTO 0);--参赛组选择信号

A2,A1,A0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--各组加分信号 B2,B1,B0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); C2,C1,C0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); D2,D1,D0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); end counter;

architecture behav of counter is begin

process(ADD,CHOS)--

variable POINTS_A2:STD_LOGIC_VECTOR(3 DOWNTO 0);--定义变量 variable POINTS_A1:STD_LOGIC_VECTOR(3 DOWNTO 0); variable POINTS_B2:STD_LOGIC_VECTOR(3 DOWNTO 0); variable POINTS_B1:STD_LOGIC_VECTOR(3 DOWNTO 0); variable POINTS_C2:STD_LOGIC_VECTOR(3 DOWNTO 0); variable POINTS_C1:STD_LOGIC_VECTOR(3 DOWNTO 0); variable POINTS_D2:STD_LOGIC_VECTOR(3 DOWNTO 0); variable POINTS_D1:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN

if (ADD'EVENT AND ADD='1') THEN --加分信号上升沿有效 if (chos=\ --A组答对,加10分 if points_a1=\ points_a1:=\

if points_a2=\ points_a2:=\ else

points_a2:=points_a2+'1'; end if; else

points_a1:=points_a1+1;

end if;

elsif (chos=\ --B组答对,加10分 if points_b1=\ points_b1:=\ if points_b2=\ points_b2:=\ else

points_b2:=points_b2+1; end if; else

points_b1:=points_b1+1; end if;

elsif (chos=\ --C组答对,加10分 if points_c1=\ points_c1:=\ if points_c2=\ points_c2:=\ else

points_c2:=points_c2+1; end if;

else

points_c1:=points_c1+1;

end if;

elsif (chos=\ --D组答对,加10分 if points_d1=\ points_d1:=\ if points_d2=\ points_d2:=\ else

points_d2:=points_d2+1; end if; else

points_d1:=points_d1+1;

end if; end if; end if;

--将各组得分赋给输出信号 A2<=POINTS_A2; A1<=POINTS_A1; A0<=\

B2<=POINTS_B2; B1<=POINTS_B1; B0<=\

C2<=POINTS_C2; C1<=POINTS_C1; C0<=\

D2<=POINTS_D2; D1<=POINTS_D1; D0<=\

END PROCESS;

end behav; 3、显示电路

显示电路是一个简单的LED共阴极显示模块的译码器。 其中DIN[3..0]为输入信号;DOUT[6..0]为输出信号。 显示电路的VHDL程序 library ieee;

use ieee.std_logic_1164.all;

entity disp is

port(din:in std_logic_vector(3 downto 0); dout:out std_logic_vector(6 downto 0)); end disp;

architecture behav of disp is begin process(din)

begin

case din is --共阴极译码器 when \ when \

dispdin[3..0]dout[6..0]inst1

when \ when \ when \ when \ when \ when \ when \ when \ when others =>dout<=\ end case; end process;

end behav;

4、顶层模块设计

OUTPUTLEDAOUTPUTLEDBLEDCLEDDOUTPUTOUTPUTdispdin[3..0]dout[6..0]OUTPUTFIRST[6..0]ADDINPUTVCCinst1counterclrenINPUTVCCINPUTVCCqdclrenALEDALEDBLEDCLEDDFALSE[3..0]Q[3..0]ADDCHOS[3..0]A2[3..0]A1[3..0]A0[3..0]B2[3..0]B1[3..0]B0[3..0]C2[3..0]C1[3..0]C0[3..0]D2[3..0]D1[3..0]D0[3..0]OUTPUTOUTPUTOUTPUTOUTPUTOUTPUTOUTPUTOUTPUTOUTPUTOUTPUTOUTPUTOUTPUTOUTPUTA2[3..0]A1[3..0]A0[3..0]B2[3..0]B1[3..0]B0[3..0]C2[3..0]C1[3..0]C0[3..0]D2[3..0]D1[3..0]D0[3..0]AINPUTVCCBCDBCDINPUTVCCINPUTVCCINPUTVCCinst2instOUTPUTFALSE[3..0]

--files:qd.vhd --date:2011/05/22 --designer: zj CHEN --Quartus ii 7.2

--

--description:第一抢答判断电路 library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity qd is

port(clr: in std_logic; --复位信号

en : in std_logic; --抢答使能信号

A,B,C,D:in std_logic;--抢答按钮

LEDA,LEDB,LEDC,LEDD:out std_logic; -- 抢答成功指示灯 FALSE:out std_logic_vector(3 downto 0);--提前抢答报警 Q : out std_logic_vector(3 downto 0));--抢答成功组显示 end qd;

architecture rtl of qd is

signal temp:std_logic_vector(3 downto 0); signal TAG:std_logic;--设置锁存标志位 begin

temp<= A&B&C&D;

process(clr,en,A,B,C,D,temp) begin

if (clr='0') then --电路清零 Q<=\ FALSE<=\

LEDA<='0'; LEDB<='0'; LEDC<='0'; LEDD<='0';

TAG<='0';

ELSIF ( en='0') then --提前抢答报警 if A='1' THEN

FALSE(3)<='1'; end if;

if B='1' THEN FALSE(2)<='1'; end if;

if C='1' THEN FALSE(1)<='1'; end if;

if D='1' THEN FALSE(0)<='1';

end if;

ELSE --抢答开始 FALSE<=\

if TAG='0' THEN --尚未有抢答成功者出现 IF temp=\抢答成功 LEDA<='1'; LEDB<='0'; LEDC<='0'; LEDD<='0';

Q<=\

TAG<='1'; --锁存此状态 elsif temp=\ LEDA<='0'; LEDB<='1'; LEDC<='0'; LEDD<='0'; Q<=\ TAG<='1';

elsif temp=\ LEDA<='0'; LEDB<='0'; LEDC<='1'; LEDD<='0'; Q<=\ TAG<='1';

elsif temp=\ LEDA<='0'; LEDB<='0'; LEDC<='0'; LEDD<='1'; Q<=\ TAG<='1'; end if; end if; end if; end process; end rtl;

--files:counter.vhd --date:2011/05/23 --designer: zj CHEN --Quartus ii 7.2 --

--description:计分电路 library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity counter is

port(ADD: in std_logic; --加分信号--

CHOS:IN STD_LOGIC_VECTOR(3 DOWNTO 0);--参赛组选择信号 A2,A1,A0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--各组加分信号 B2,B1,B0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); C2,C1,C0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); D2,D1,D0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); end counter;

architecture behav of counter is begin

process(ADD,CHOS)--

variable POINTS_A2:STD_LOGIC_VECTOR(3 DOWNTO 0);--定义变量 variable POINTS_A1:STD_LOGIC_VECTOR(3 DOWNTO 0); variable POINTS_B2:STD_LOGIC_VECTOR(3 DOWNTO 0); variable POINTS_B1:STD_LOGIC_VECTOR(3 DOWNTO 0); variable POINTS_C2:STD_LOGIC_VECTOR(3 DOWNTO 0); variable POINTS_C1:STD_LOGIC_VECTOR(3 DOWNTO 0); variable POINTS_D2:STD_LOGIC_VECTOR(3 DOWNTO 0); variable POINTS_D1:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN

if (ADD'EVENT AND ADD='1') THEN --加分信号上升沿有效 if (chos=\ --A组答对,加10分 if points_a1=\ points_a1:=\

if points_a2=\ points_a2:=\ else

points_a2:=points_a2+'1'; end if; else

points_a1:=points_a1+1; end if;

elsif (chos=\ --B组答对,加10分 if points_b1=\ points_b1:=\ if points_b2=\ points_b2:=\ else

points_b2:=points_b2+1;

end if;

else

points_b1:=points_b1+1; end if;

elsif (chos=\ --C组答对,加10分 if points_c1=\ points_c1:=\ if points_c2=\ points_c2:=\ else

points_c2:=points_c2+1; end if;

else

points_c1:=points_c1+1;

end if;

elsif (chos=\ --D组答对,加10分 if points_d1=\ points_d1:=\ if points_d2=\ points_d2:=\ else

points_d2:=points_d2+1; end if; else

points_d1:=points_d1+1; end if; end if; end if;

--将各组得分赋给输出信号 A2<=POINTS_A2; A1<=POINTS_A1; A0<=\

B2<=POINTS_B2; B1<=POINTS_B1; B0<=\

C2<=POINTS_C2; C1<=POINTS_C1; C0<=\

D2<=POINTS_D2; D1<=POINTS_D1; D0<=\

END PROCESS; end behav; --files:disp.vhd --date:2011/05/23 --designer: zj CHEN --Quartus ii 7.2 --显示模块

--description:显示电路

library ieee;

use ieee.std_logic_1164.all;

entity disp is

port(din:in std_logic_vector(3 downto 0); dout:out std_logic_vector(6 downto 0)); end disp;

architecture behav of disp is begin

process(din)

begin

case din is --共阴极译码器 when \ when \ when \ when \ when \ when \ when \ when \ when \ when \ when others =>dout<=\ end case; end process; end behav;

--顶层模块:4路智力竞赛抢答器

library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;

entity qdq is

port( clr,en:in std_logic;--复位信号,抢答使能信号 A,B,C,D: IN STD_LOGIC;--抢答按钮 ADD:IN STD_LOGIC; --计分信号

LEDA,LEDB,LEDC,LEDD:OUT STD_LOGIC;

FALSE:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--报警信号

FIRST:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);--

SCOREA2,SCOREA1,SCOREA0:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); SCOREB2,SCOREB1,SCOREB0:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); SCOREC2,SCOREC1,SCOREC0:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); SCORED2,SCORED1,SCORED0:OUT STD_LOGIC_VECTOR(6 DOWNTO 0) ); end qdq;

architecture struc of qdq is --定义元件

component qd is --第一抢答判断电路 port(clr: in std_logic; --复位信号

en : in std_logic; --抢答使能信号

A,B,C,D:in std_logic;--抢答按钮

LEDA,LEDB,LEDC,LEDD:out std_logic; -- 抢答成功指示灯 FALSE:out std_logic_vector(3 downto 0);--提前抢答报警 Q : out std_logic_vector(3 downto 0));--抢答成功组显示 end component qd;

component counter is --计分电路

port(ADD: in std_logic; --加分信号--

CHOS:IN STD_LOGIC_VECTOR(3 DOWNTO 0);--参赛组选择信号 A2,A1,A0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--各组加分信号 B2,B1,B0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); C2,C1,C0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); D2,D1,D0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0) );

end component counter;

component disp is --显示电路

port(din:in std_logic_vector(3 downto 0); dout:out std_logic_vector(6 downto 0) );

end component disp; --定义信号

signal qtemp:STD_LOGIC_VECTOR(3 DOWNTO 0);--组别显示,计分组别显示 signal AA2,AA1,AA0: STD_LOGIC_VECTOR(3 DOWNTO 0);--百分制输入信号 SIGNAL bb2,bb1,bb0: STD_LOGIC_VECTOR(3 DOWNTO 0); signal cc2,cc1,cc0: STD_LOGIC_VECTOR(3 DOWNTO 0); signal dd2,dd1,dd0: STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN

--元件例化

u1:qd port map(clr=>clr,en=>en,

a=>a,b=>b,c=>c,d=>d, leda=>leda, ledb=>ledb, ledc=>ledc, ledd=>ledd,

q=>qtemp,false=>false);

u2:counter port map(add=>add,CHOS=>qtemp,

A2=>AA2,A1=>AA1,A0=>AA0, B2=>BB2,B1=>BB1,B0=>BB0, C2=>CC2,C1=>CC1,C0=>CC0, D2=>DD2,D1=>DD1,D0=>DD0);

U3:disp port map (din=>qtemp,DOUT=>FIRST);

u4:disp port map (din=>aa2,dout=>scorea2);--计分显示,百分制 u5:disp port map (din=>aa1,dout=>scorea1); u6:disp port map (din=>aa0,dout=>scorea0);

u7:disp port map (din=>bb2,dout=>scoreb2); u8:disp port map (din=>bb1,dout=>scoreb1); u9:disp port map (din=>bb0,dout=>scoreb0);

u10:disp port map (din=>cc2,dout=>scorec2); u11:disp port map (din=>cc1,dout=>scorec1); u12:disp port map (din=>cc0,dout=>scorec0);

u13:disp port map (din=>dd2,dout=>scored2); u14:disp port map (din=>dd1,dout=>scored1); u15:disp port map (din=>dd0,dout=>scored0); end struc;

counter:u2qd:u1ABCDclrenABCDclrenLEDALEDBLEDCLEDDFALSE[3..0]Q[3..0]ADDCHOS[3..0]A2[3..0]A1[3..0]A0[3..0]B2[3..0]B1[3..0]B0[3..0]C2[3..0]C1[3..0]C0[3..0]din[3..0]din[3..0]disp:u15SCORED0[6..0]dout[6..0]disp:u14SCORED1[6..0]dout[6..0]ADDD2[3..0]D1[3..0]D0[3..0]disp:u13SCORED2[6..0]din[3..0]dout[6..0]disp:u12SCOREC0[6..0]din[3..0]dout[6..0]disp:u11SCOREC1[6..0]din[3..0]dout[6..0]disp:u10SCOREC2[6..0]din[3..0]dout[6..0]disp:u9SCOREB0[6..0]din[3..0]dout[6..0]disp:u8SCOREB1[6..0]din[3..0]dout[6..0]disp:u7SCOREB2[6..0]din[3..0]dout[6..0]disp:u6SCOREA0[6..0]din[3..0]dout[6..0]disp:u5SCOREA1[6..0]din[3..0]dout[6..0]disp:u4SCOREA2[6..0]din[3..0]dout[6..0]disp:U3FIRST[6..0]din[3..0]dout[6..0]FALSE[3..0]LEDDLEDCLEDBLEDA

本文来源:https://www.bwwdw.com/article/yiwr.html

Top