本文為大家?guī)?lái)三種四人搶答器的VHDL語(yǔ)言設(shè)計(jì)方案介紹。
VHDL語(yǔ)言設(shè)計(jì)四人搶答器方案一
設(shè)計(jì)要求
l、設(shè)計(jì)用于競(jìng)賽的四人搶答器,功能如下:
(1)有多路搶答器,臺(tái)數(shù)為四,能顯示搶答臺(tái)號(hào);
(2)具有搶答開始后20秒倒計(jì)時(shí),20秒倒計(jì)時(shí)后無(wú)人搶答顯示超時(shí),并報(bào)警;
(3)能顯示超前搶答臺(tái)號(hào)并顯示犯規(guī)警報(bào);
2、系統(tǒng)復(fù)位后進(jìn)入搶答狀態(tài),當(dāng)有一路搶答鍵按下時(shí),該路搶答信號(hào)將其余各路搶答封鎖,同時(shí)鈴聲響,直至該路按鍵松開,顯示牌顯示該路搶答臺(tái)號(hào)。
3、用VHDL語(yǔ)言設(shè)計(jì)符合上述功能要求的四人搶答器,并用層次設(shè)計(jì)方法設(shè)計(jì)該電路。
電路工作原理
簡(jiǎn)易邏輯數(shù)字搶答器由主體電路與擴(kuò)展電路組成。優(yōu)先編碼電路、鎖存器、譯碼電路將參賽隊(duì)的輸入信號(hào)在顯示器上輸出;用控制電路和主持人開關(guān)啟動(dòng)報(bào)警電路,以上兩部分組成主體電路。通過(guò)定時(shí)電路和譯碼電路將秒脈沖產(chǎn)生的信號(hào)在顯示器上輸出實(shí)現(xiàn)計(jì)時(shí)功能,構(gòu)成擴(kuò)展電路。
電路主要由脈沖產(chǎn)生電路、鎖存電路、編碼及譯碼顯示電路、倒計(jì)時(shí)電路和音響產(chǎn)生電路組成。當(dāng)有選手搶答時(shí),首先鎖存,阻止其他選手搶答,然后編碼,再經(jīng)譯碼器將數(shù)字顯示在顯示器上同時(shí)產(chǎn)生音響。主持人宣布開始搶答時(shí),倒計(jì)時(shí)電路啟動(dòng)由20計(jì)到0,如有選手搶答,倒計(jì)時(shí)停止,如20秒后無(wú)人搶答,則會(huì)顯示報(bào)警。
源程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityqdqis
port(clr,clk,clk0,en,a,b,c,d:instd_logic;
dps:outstd_logic_vector(3downto0);
count:outstd_logic_vector(7downto0);
speaker:outstd_logic);
end;
architectureoneofqdqis
signaldps1:std_logic_vector(3downto0);
signalcount1:std_logic_vector(7downto0);
signaltmp1,tmp2,tmp3:std_logic;
begin
p1:process(clr,en,tmp1,tmp2)
begin
ifclr=‘1’then
tmp1<=‘0’;tmp2<=‘0’;
dps1<=“0000”;
elsifen=‘1’then
iftmp1=‘0’then
ifa=‘1’then
tmp1<=‘1’;
dps1<=“0001”;
endif;
ifb=‘1’thentmp1<=‘1’;
dps1<=“0010”;
endif;
ifc=‘1’thentmp1<=‘1’;
dps1<=“0011”;
endif;
ifd=‘1’thentmp1<=‘1’;
dps1<=“0100”;
endif;
endif;
elsifen=‘0’then
iftmp2=‘0’then
ifa=‘1’then
tmp2<=‘1’;
dps1<=“0001”;
endif;
ifb=‘1’then
tmp2<=‘1’;
dps1<=“0010”;
endif;
ifc=‘1’then
tmp2<=‘1’;
dps1<=“0011”;
endif;
ifd=‘1’then
tmp2<=‘1’;
dps1<=“0100”;
endif;
endif;
endif;
endprocess;
p2:process(clr,clk,tmp1,tmp3)
begin
ifclk‘eventandclk=’1‘then
ifclr=’1‘thencount1<=“00100000”;
tmp3<=’0‘;
elsifen=’1‘a(chǎn)ndtmp1=’0‘a(chǎn)ndtmp3=’0‘then
ifcount1=“00000000”then
tmp3<=’1‘;
elsifcount1(3downto0)=“0000”then
count1(3downto0)<=“1001”;
count1(7downto4)<=count1(7downto4)-’1‘;
elsecount1(3downto0)<=count1(3downto0)-’1‘;
endif;
endif;
endif;
endprocess;
count<=count1;
dps<=dps1;
speaker<=((tmp3oraorborcord)andclk0);
end;
仿真波形
(一)無(wú)人搶答的仿真波形

由上圖可知,當(dāng)en=0時(shí)此時(shí)主持人并沒(méi)有提出開始搶答的信號(hào).en=1,開始搶答的時(shí)候20秒倒計(jì)時(shí),時(shí)間到而無(wú)人搶答。(count=“00000000”),則speaker報(bào)警,按下清零開關(guān)(clr=1),重新開始20秒倒計(jì)時(shí)進(jìn)行下一輪
(二)有人搶答的仿真波形
由上圖可知,clr=1,系統(tǒng)進(jìn)入初始狀態(tài),即count=“00100000”,dps=“0000”;en=0時(shí),此時(shí)主持人并沒(méi)有提出開始搶答的信號(hào)是不允許搶答的,若有人搶答(b=1),則speaker報(bào)警,且數(shù)碼管顯示組別(dps=“0010”)顯示出犯規(guī)的組別;en=1時(shí),開始正常搶答而且count開始20秒倒計(jì)時(shí),在15秒時(shí)(count=“00010101”)有人搶答(a=1),倒計(jì)時(shí)暫停同時(shí)鎖存器工作將其他組別的信號(hào)鎖存后面的信號(hào)將視為無(wú)效,數(shù)碼管顯示組別(dps=“0001”),且speaker報(bào)警。
VHDL語(yǔ)言設(shè)計(jì)四人搶答器方案二
設(shè)計(jì)任務(wù)及要求:
(1)設(shè)計(jì)用于競(jìng)賽搶答的四人搶答器;
①有多路搶答,搶答臺(tái)數(shù)為8;
②具有搶答開始后20秒倒計(jì)時(shí),20秒倒計(jì)時(shí)后無(wú)人搶答顯示超時(shí),并報(bào)警;
③能顯示超前搶答臺(tái)號(hào)并顯示犯規(guī)警報(bào);
(2)系統(tǒng)復(fù)位后進(jìn)入搶答狀態(tài),當(dāng)有一路搶答按鍵按下,該路搶答信號(hào)將其余各路搶答信號(hào)封鎖,同時(shí)鈴聲想起,直至該路按鍵松開,顯示牌顯示該路搶答臺(tái)號(hào);
(3)用VHDL語(yǔ)言設(shè)計(jì)符合上述功能要求的四人搶答器,并用層次化設(shè)計(jì)方法設(shè)計(jì)該電路;
設(shè)計(jì)思路
設(shè)計(jì)制作一個(gè)競(jìng)賽搶答器,每組受控于一個(gè)搶答開關(guān),分別為S1,S2,S3,S4,低電平表示搶答有效;設(shè)置主持人控制鍵K,用于控制整個(gè)系統(tǒng)清0和搶答有效控制,按下復(fù)位鍵時(shí),K=0,系統(tǒng)清零;抬起復(fù)位鍵時(shí),K=1,搶答開始;系統(tǒng)具有第一搶答信號(hào)鑒別和鎖存功能。在主持人將系統(tǒng)復(fù)位并使搶答有效開始后,第一搶答者按下?lián)尨鸢粹o,對(duì)應(yīng)的輸入引腳接低電位0,電路應(yīng)記憶下第一搶答者的組別,并封鎖其他各組的按鈕,即其他任何一組按鍵都不會(huì)使電路響應(yīng);系統(tǒng)以兩種方式指示第一搶答者:其一是通過(guò)譯碼程序顯示其組別號(hào);其二是在第一搶答者產(chǎn)生時(shí),蜂鳴器警示;設(shè)置違規(guī)電路單元,當(dāng)搶答者在主持人按下復(fù)位清零按鈕之前就已經(jīng)按下?lián)尨鸢粹o時(shí),則給出違規(guī)信號(hào)為高電平。對(duì)應(yīng)組別的紅色信號(hào)燈亮;當(dāng)20秒倒計(jì)時(shí)后無(wú)人搶答顯示超時(shí),并報(bào)警。
VHDL程序?qū)崿F(xiàn)
1、正常搶答程序
此模塊包括正常搶答第一信號(hào)鑒別和顯示搶答臺(tái)號(hào),并發(fā)生聲音提示。其中S1,S2,S3,S4為搶答按鈕,當(dāng)對(duì)應(yīng)的按鈕信號(hào)為0時(shí)表示有搶答信號(hào);K為主持人按鈕,按下復(fù)位鍵K時(shí), K=0,系統(tǒng)清零;抬起復(fù)位鍵時(shí),K=1,搶答開始;G為報(bào)警信號(hào)。其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個(gè)人,為0表示有搶答
K : in std_logic; --主持人搶答開始鍵
G : out std_logic; --報(bào)警信號(hào)
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) --顯示搶答成功者號(hào)碼
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、搶答倒計(jì)時(shí)程序
此模塊為搶答20s倒計(jì)時(shí)程序,在主持人按下按鈕K后此模塊即開始工作,在20s倒計(jì)時(shí)完后會(huì)有聲音提示,G為聲音報(bào)警信號(hào)。
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); --聲音報(bào)警
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時(shí),有搶答信號(hào)出現(xiàn),則Y=11表示某組違規(guī),當(dāng)RESET = 1時(shí),顯示違規(guī)組別。其中K為主持人按鈕,S1,S2,S3,S4為搶答按鈕,R1,R2,R3,R4為對(duì)應(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; --紅色燈指示超前搶答臺(tái)號(hào)
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) --顯示搶答成功者號(hào)碼
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;
VHDL語(yǔ)言設(shè)計(jì)四人搶答器方案三
問(wèn)題描述
設(shè)計(jì)一個(gè)4人參加的智力競(jìng)賽搶答計(jì)時(shí)器。電路具有回答問(wèn)題時(shí)間控制功能。要求回答問(wèn)題時(shí)間小于等于100妙(顯示為0~99),時(shí)間顯示采用倒計(jì)時(shí)方式。當(dāng)達(dá)到限定時(shí)間時(shí),發(fā)出聲響以示警告;當(dāng)有某一參賽者首先按下?lián)尨痖_關(guān)時(shí),相應(yīng)顯示燈亮并伴有聲響,此時(shí)搶答器不再接受其他輸入信號(hào)。
功能要求
1、用feng模塊將選手按下按鍵信號(hào)輸出高電平給鎖存模塊lockb,進(jìn)行鎖存的同時(shí)發(fā)出aim信號(hào)實(shí)現(xiàn)聲音提示,并使count模塊進(jìn)行答題時(shí)間的倒計(jì)時(shí),在計(jì)滿100妙后送出聲音提示;
2、用ch41a模塊將搶答結(jié)果轉(zhuǎn)換為二進(jìn)制數(shù);
3、用sel模塊產(chǎn)生數(shù)碼管片選信號(hào);
4、用ch42a模塊將對(duì)應(yīng)數(shù)碼管片選信號(hào),送出需要的顯示信號(hào);
5、用七段譯碼器dispa模塊進(jìn)行譯碼。
各模塊VHDL源代碼
1、搶答鑒別模塊FENG的VHDL源程序
--feng.vhd
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY FENG IS
PORT(CP,CLR:IN STD_LOGIC;
Q :OUT STD_LOGIC);
END FENG;
ARCHITECTURE FENG_ARC OF FENG IS
BEGIN
PROCESS(CP,CLR)
BEGIN
IF CLR=‘0’THEN
Q<=‘0’;
ELSIF CP‘EVENT AND CP=’0‘THEN
Q<=’1‘;
END IF;
END PROCESS;
END FENG_ARC;
2、片選信號(hào)產(chǎn)生模塊SEL的VHDL源程序
--sel.vhd
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY SEL IS
PORT(CLK:IN STD_LOGIC;
a:OUT INTEGER RANGE 0 TO 7);
END SEL;
ARCHITECTURE SEL_ARC OF SEL IS 片選信號(hào)產(chǎn)生模塊SEL
BEGIN
PROCESS(CLK)
VARIABLE AA:INTEGER RANGE 0 TO 7;
BEGIN
IF CLK’EVENT AND CLK=‘1’THEN
AA:=AA+1;
END IF;
A<=AA;
END PROCESS;
END SEL_ARC;
3、鎖存器模塊LOCKB的VHDL源程序
-lockb.vhd
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY LOCKB IS
PORT(D1,D2,D3,D4:IN STD_LOGIC;
CLK,CLR:IN STD_LOGIC;
Q1,Q2,Q3,Q4,ALM:OUT STD_LOGIC);
END LOCKB;
ARCHITECTURE LOCK_ARC OF LOCKB IS
BEGIN
PROCESS(CLK)
BEGIN
IF CLR=‘0’THEN
Q1<=‘0’;
Q2<=‘0’;
Q3<=‘0’;
Q4<=‘0’;
ALM<=‘0’; 模塊LOCKB
ELSIF CLK‘EVENT AND CLK=’1‘THEN
Q1<=D1;
Q2<=D2;
Q3<=D3;
Q4<=D4;
ALM<=’1‘;
END IF;
END PROCESS;
END LOCK_ARC;
4、轉(zhuǎn)換模塊CH41A的VHDL源程序
--ch41a..vhd
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY CH41A IS
PORT(D1,D2,D3,D4:IN STD_LOGIC;
Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END CH41A;
ARCHITECTURE CH41_ARC OF CH41A IS 轉(zhuǎn)換模塊CH41A
BEGIN
PROCESS(D1,D2,D3,D4)
VARIABLE TMP:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
TMP:=D1&D2&D3&D4;
CASE TMP IS
WHEN “0111”=>Q<=“0001”;
WHEN “1011”=>Q<=“0010”;
WHEN “1101”=>Q<=“0011”;
WHEN “1110”=>Q<=“0100”;
WHEN OTHERS=>Q<=“1111”;
END CASE;
END PROCESS;
END CH41_ARC;
5、3選1模塊CH31A的VHDL源程序
--ch31a.vhd
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY CH31A IS
PORT(SEL:IN STD_LOGIC_VECTOR(2 DOWNTO 0);
D1,D2,D3:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
Q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END CH31A;
ARCHITECTURE CH31_ARC OF CH31A IS
BEGIN
PROCESS(SEL,D1,D2,D3)
BEGIN
CASE SEL IS
WHEN “000”=>Q<=D1;
WHEN “001”=>Q<=D2;
WHEN “111”=>Q<=D3;
WHEN OTHERS=>Q<=“1111”;
END CASE;
END PROCESS;
END CH31_ARC;
6、倒計(jì)時(shí)模塊COUNT的VHDL源程序
倒計(jì)時(shí)模塊COUNT如圖16-7所示,該模塊實(shí)現(xiàn)答題時(shí)間的倒計(jì)時(shí),在計(jì)滿100s后送出聲音提示。
--count.vhd
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY COUNT IS
PORT(CLK,EN:IN STD_LOGIC; 倒計(jì)時(shí) 模塊COUNT
H,L:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
SOUND:OUT STD_LOGIC);
END COUNT;
ARCHITECTURE COUNT_ARC OF COUNT IS
BEGIN
PROCESS(CLK,EN)
VARIABLE HH,LL:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
IF CLK’EVENT AND CLK=‘1’THEN
IF EN=‘1’THEN
IF LL=0 AND HH=0 THEN
SOUND<=‘1’;
ELSIF LL=0 THEN
LL:=“1001”;
HH:=HH-1;
ELSE
LL:=LL-1;
END IF;
ELSE
SOUND<=‘0’;
HH:=“1001”;
LL:=“1001”;
END IF;
END IF;
H<=HH;
L<=LL;
END PROCESS;
END COUNT_ARC;
7、顯示譯碼模塊DISP的VHDL源程序
--disp.vhd
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY DISP IS 顯示譯碼模塊DISP
PORT(D:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
Q:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END DISP;
ARCHITECTURE DISP_ARC OF DISP IS
BEGIN
PROCESS(D)
BEGIN
CASE D IS
WHEN“0000”=>Q<=“0111111”;
WHEN“0001”=>Q<=“0000110”;
WHEN“0010”=>Q<=“1011011”;
WHEN“0011”=>Q<=“1001111”;
WHEN“0100”=>Q<=“1100110”;
WHEN“0101”=>Q<=“1101101”;
WHEN“0110”=>Q<=“1111101”;
WHEN“0111”=>Q<=“0100111”;
WHEN“1000”=>Q<=“1111111”;
WHEN“1001”=>Q<=“1101111”;
WHEN OTHERS=>Q<=“0000000”;
END CASE;
END PROCESS;
END DISP_ARC;
評(píng)論