VHDL語言設(shè)計四人搶答器方案二
設(shè)計任務(wù)及要求:
(1)設(shè)計用于競賽搶答的四人搶答器;
①有多路搶答,搶答臺數(shù)為8;
②具有搶答開始后20秒倒計時,20秒倒計時后無人搶答顯示超時,并報警;
③能顯示超前搶答臺號并顯示犯規(guī)警報;
(2)系統(tǒng)復(fù)位后進入搶答狀態(tài),當(dāng)有一路搶答按鍵按下,該路搶答信號將其余各路搶答信號封鎖,同時鈴聲想起,直至該路按鍵松開,顯示牌顯示該路搶答臺號;
(3)用VHDL語言設(shè)計符合上述功能要求的四人搶答器,并用層次化設(shè)計方法設(shè)計該電路;
設(shè)計思路
設(shè)計制作一個競賽搶答器,每組受控于一個搶答開關(guān),分別為S1,S2,S3,S4,低電平表示搶答有效;設(shè)置主持人控制鍵K,用于控制整個系統(tǒng)清0和搶答有效控制,按下復(fù)位鍵時,K=0,系統(tǒng)清零;抬起復(fù)位鍵時,K=1,搶答開始;系統(tǒng)具有第一搶答信號鑒別和鎖存功能。在主持人將系統(tǒng)復(fù)位并使搶答有效開始后,第一搶答者按下?lián)尨鸢粹o,對應(yīng)的輸入引腳接低電位0,電路應(yīng)記憶下第一搶答者的組別,并封鎖其他各組的按鈕,即其他任何一組按鍵都不會使電路響應(yīng);系統(tǒng)以兩種方式指示第一搶答者:其一是通過譯碼程序顯示其組別號;其二是在第一搶答者產(chǎn)生時,蜂鳴器警示;設(shè)置違規(guī)電路單元,當(dāng)搶答者在主持人按下復(fù)位清零按鈕之前就已經(jīng)按下?lián)尨鸢粹o時,則給出違規(guī)信號為高電平。對應(yīng)組別的紅色信號燈亮;當(dāng)20秒倒計時后無人搶答顯示超時,并報警。
VHDL程序?qū)崿F(xiàn)
1、正常搶答程序
此模塊包括正常搶答第一信號鑒別和顯示搶答臺號,并發(fā)生聲音提示。其中S1,S2,S3,S4為搶答按鈕,當(dāng)對應(yīng)的按鈕信號為0時表示有搶答信號;K為主持人按鈕,按下復(fù)位鍵K時, K=0,系統(tǒng)清零;抬起復(fù)位鍵時,K=1,搶答開始;G為報警信號。其VHDL源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee. std_logic_arith.all;
use ieee. std_logic_unsigned.all;
--------------------------------------------------------------------
entity qiangda is
port( S1,S2,S3,S4 : in std_logic; --輸入:表示4個人,為0表示有搶答
K : in std_logic; --主持人搶答開始鍵
G : out std_logic; --報警信號
ledag : out std_logic_vector (6 downto 0);
Dout : out std_logic_vector(3 downto 0) ); --搶答結(jié)果顯示
end qiangda;
--------------------------------------------------------------------
architecture behave of qiangda is
signal Enable_Flag : std_logic;--允許搶答控制變量,為1表示允許搶答
signal S : std_logic_vector(3 downto 0);
signal D : std_logic_vector(3 downto 0);
begin
process(S1,S2,S3,S4,K) --允許搶答控制
begin
S<=S1&S2&S3&S4;
If (K=‘1’) then
Enable_Flag<=‘1’;
elsif(S/=“1111”) then
Enable_Flag<=‘0’;
end if;
end process;
process(S1,S2,S3,S4,K) --搶答結(jié)果顯示
begin
if(K=‘0’) then
D<=“0000”;
Elsif (Enable_Flag=‘1’) then
if(S1=‘0’) then
D(0)<=‘1’;
G<=‘0’;
elsif(S2=‘0’) then
D(1)<=‘1’;
G<=‘0’;
elsif(S3=‘0’) then
D(2)<=‘1’;
G<=‘0’;
elsif(S4=‘0’) then
D(3)<=‘1’;
G<=‘0’;
end if;
dout<=d;
end if;
end process;
process(d) --顯示搶答成功者號碼
begin
case d is
when “0000”=>ledag<=“0111111”;
when “0001”=>ledag<=“0000110”;
when “0010”=>ledag<=“1011011”;
when “0100”=>ledag<=“1001111”;
when “1000”=>ledag<=“1100110”;
when others=>ledag<=“0000000”;
end case;
end process;
end behave;
2、搶答倒計時程序
此模塊為搶答20s倒計時程序,在主持人按下按鈕K后此模塊即開始工作,在20s倒計時完后會有聲音提示,G為聲音報警信號。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY COUNT IS
PORT (CLK, Enable_Flag: IN STD_LOGIC;
H,L: OUT STD_LOGIC_VECTOR (3 DOWNTO 0);
G:OUT STD_LOGIC); --聲音報警
END COUNT;
ARCHITECTURE COUNT_ARC OF COUNT IS
BEGIN
PROCESS (CLK, Enable_Flag)
VARIABLE HH, LL: STD_LOGIC_VECTOR (3 DOWNTO 0);
BEGIN
IF CLK‘EVENT AND CLK=’1‘THEN
IF Enable_Flag=’1‘THEN
IF LL=0 AND HH=0 THEN
G<=’1‘;
ELSIF LL=0 THEN
LL: =“1001”;
HH: =HH-1;
ELSE
LL: =LL-1;
END IF;
ELSE
G<=’0‘;
HH: =“1001”;
LL: =“1001”;
END IF;
END IF;
H<=HH;
L<=LL;
END PROCESS;
END COUNT_ARC;
3、超前犯規(guī)搶答程序
此模塊為違規(guī)電路。當(dāng)搶答者在主持人復(fù)位系統(tǒng)之前就已按下?lián)尨鸢粹o,即當(dāng)RESET=0時,有搶答信號出現(xiàn),則Y=11表示某組違規(guī),當(dāng)RESET = 1時,顯示違規(guī)組別。其中K為主持人按鈕,S1,S2,S3,S4為搶答按鈕,R1,R2,R3,R4為對應(yīng)組別犯規(guī)紅色顯示燈。其VHDL源程序如下:
LIBRARY ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
ENTITY wg IS
PORT(K: IN std_logic;
S1, S2, S3, S4: IN std_logic;
R1, R2, R3, R4: OUT std_logic; --紅色燈指示超前搶答臺號
y: OUT std_logic_VECTOR (1 DOWNTO 0) );
END wg;
ARCHITECTURE a OF wg IS
SIGNAL TEMP1: STD_LOGIC;
SIGNAL TEMP2: STD_LOGIC_VECTOR (1 DOWNTO 0);
BEGIN
TEMP1<=S1 OR S2 OR S3 OR S4 ;
TEMP2<=K&TEMP1;
process(TEMP2) --顯示搶答成功者號碼
begin
case TEMP2 is
when “01”=>Y<=“11”;
when “10”=>Y<=“00”;
when “11”=>Y<=“00”;
when others=>Y<=“00”;
end case;
if(K<=‘0’) then
if(S1=‘0’) then
R1<=‘0’;
elsif(S2=‘0’) then
R2<=‘0’;
elsif(S3=‘0’) then
R3<=‘0’;
elsif(S4=‘0’) then
R4<=‘0’;
end if;
end if;
end process;
評論
查看更多