eda課程設計搶答器
『壹』 EDA中用VHDL語言設計五人搶答器
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_ARITH.all;
use ieee.std_logic_UNSIGNED.all;
ENTITY BIAOJUE IS
PORT(
FF:IN STD_LOGIC_VECTOR(1 TO 5);
QQ:OUT BIT;
QALL:OUT STD_LOGIC_VECTOR(3 DOWNTO 1);
SHIJIAN:BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0);
FUWEI,KAISHI,CLK:IN STD_LOGIC);
END BIAOJUE;
ARCHITECTURE FUNG OF BIAOJUE IS
BEGIN
PROCESS(FF,CLK,KAISHI,FUWEI)
VARIABLE SUO:BOOLEAN;
VARIABLE SUM:STD_LOGIC_VECTOR(1 TO 3);
BEGIN
IF (FUWEI='0') THEN
QQ<='0';
SHIJIAN<="1010";
SUO:=FALSE;
SUM:="000";
QALL<="000";
ELSIF (CLK'EVENT AND CLK='1') THEN
IF (KAISHI='1') THEN
IF (NOT SUO) THEN
IF SHIJIAN="0000" THEN
SUO:=TRUE;
FOR N IN 1 TO 5 LOOP
SUM:=FF(N)+SUM;
END LOOP;
ELSE
SHIJIAN<=SHIJIAN-1;
END IF;
END IF;
QALL<=SUM;
IF (SUM >= 3) THEN
QQ<='1';
ELSE
QQ<='0';
END IF;
END IF;
END IF;
END PROCESS;
END FUNG;
『貳』 關於搶答器的EDA課程設計(完整的)
搶答器
通信081 李笑笑 082278
一、簡要說明
在進行智力競賽搶答題比賽時,在一定時間內,各參賽者考慮好答案後都想搶先答題。如果沒有合適的設備,有時難以分清他們的先後,使主持人感到為難。為了使比賽能順利進行,需要有一個能判斷搶答先後的設備,我們將它稱為智力競賽搶答器。
二、設計要求
1.最多可容納15名選手或15個代表隊參加比賽,他們的編號分別為1到15,各用一個搶答按鈕,其編號與參賽者的號碼一一對應。此外,還有一個按鈕給主持人用來清零,主持人清零後才可進行下一次搶答。
2.搶答器具有數據鎖存功能,並將所鎖存的數據用LED數碼管顯示出來。在主持人將搶答器清零後,若有參賽者按搶答按鈕,數碼管立即顯示出最先動作的選手的編號,搶答器對參賽選手動作的先後有很強的分辨能力,即較他們動作的先後只相差幾毫秒,搶答器也能分辨出來。數碼管不顯示後動作選手的編號,只顯示先動作選手的編號,並保持到主持人清零為止。
3.在各搶答按鈕為常態時,主持人可用清零按鈕將數碼管變為零狀態,直至有人使用搶答按鈕為止。搶答時間設為10秒。在10秒後若沒有參賽者按搶答按鈕,搶答按鈕無效。並保持到主持人清零為止。
三、設計提示
1. 輸入輸出信號
輸出顯示的位掃描時鍾信號可以作為鍵盤輸入的檢測掃描信號。10秒定時計數器的時鍾信號可以選2Hz的時鍾。復位信號用來使10秒定時器和鍵盤編碼器清零。15個按鍵輸入信號應進行編碼。A—G數碼管段驅動信號。SEG0,SEGl數碼管位驅動信號。
2.系統功能
按下非同步復位鍵,10秒定時器和鍵盤編碼器清零。放開非同步復位健後,啟動定時器,並允許鍵盤編碼器掃描信號輸入端,如在10秒內發現有輸入信號,將其編碼輸出,同時使定時器停止計時;否則,停止掃描編碼和定時,直到再次按下非同步復位健鍵。把16進制編碼轉換為十進制碼,經解碼後顯示。
3.設計框圖如圖:
四、程序代碼
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity answer is
port(
KEY_IN: in std_logic_vector(15 downto 1);
CLEAR: in std_logic;
SCANCLK: in std_logic;
CLK1S: in std_logic;
LED_OUT: out std_logic_vector(6 downto 0);
SCAN_OUT: out std_logic;
SOUND_OUT: out std_logic
);
end answer;
architecture rtl of answer is
signal KEY_CODE: integer range 0 to 15;
signal KEY_CODE_REG: integer range 0 to 15;
signal KEY_EN: std_logic;
signal NUM1: integer range 0 to 9;
signal NUM2: integer range 0 to 9;
signal KEY_EN1,KEY_EN2: std_logic;
signal KEY_IN1,KEY_IN2,KEY_INS: std_logic_vector(15 downto 1);
signal HEX: integer range 0 to 9;
signal TIME_CNT: std_logic_vector(3 downto 0);
begin
process(KEY_EN,KEY_IN,SCANCLK,CLEAR)
begin
if CLEAR = '0' then
KEY_CODE_REG<=0;
elsif SCANCLK'event and SCANCLK = '1' then
if KEY_CODE_REG = 0 then
KEY_CODE_REG<=KEY_CODE;
end if;
end if;
end process;
process(SCANCLK,CLEAR,KEY_IN)
begin
if SCANCLK'event and SCANCLK = '1' then
KEY_IN2 <= KEY_IN1;
KEY_IN1 <= KEY_IN;
end if;
end process;
KEY_INS<=not KEY_IN2 or KEY_IN1;
KEY_CODE<=0 when KEY_EN = '0' else
1 when KEY_INS(1)='0' else
2 when KEY_INS(2)='0' else
3 when KEY_INS(3)='0' else
4 when KEY_INS(4)='0' else
5 when KEY_INS(5)='0' else
6 when KEY_INS(6)='0' else
7 when KEY_INS(7)='0' else
8 when KEY_INS(8)='0' else
9 when KEY_INS(9)='0' else
10 when KEY_INS(10)='0' else
11 when KEY_INS(11)='0' else
12 when KEY_INS(12)='0' else
13 when KEY_INS(13)='0' else
14 when KEY_INS(14)='0' else
15 when KEY_INS(15)='0' else
0 ;
process(CLK1S,CLEAR,KEY_EN)
begin
if CLEAR = '0' then
TIME_CNT <= "0000";
elsif CLK1S'event and CLK1S = '1' then
if KEY_EN='1' then
TIME_CNT<=TIME_CNT + 1;
end if;
end if;
end process;
KEY_EN<='1' when KEY_CODE_REG = 0 and TIME_CNT<=9 else '0';
process(CLK1S,CLEAR,KEY_EN)
begin
if CLEAR = '0' then
KEY_EN1 <= '1';
KEY_EN2 <= '1';
elsif CLK1S'event and CLK1S = '1' then
KEY_EN2 <= KEY_EN1;
KEY_EN1 <= KEY_EN;
end if;
end process;
SOUND_OUT<=SCANCLK when KEY_EN1='0' and KEY_EN2='1' else '0';
with HEX select
LED_OUT<="0000110" when 1,
"1011011" when 2,
"1001111" when 3,
"1100110" when 4,
"1101101" when 5,
"1111101" when 6,
"0000111" when 7,
"1111111" when 8,
"1101111" when 9,
"0111111" when OTHERS;
HEX<= NUM1 when SCANCLK='0' else NUM2;
NUM2<=1 when KEY_CODE_REG>9 ELSE 0;
NUM1<=KEY_CODE_REG when KEY_CODE_REG<=9 ELSE KEY_CODE_REG-10;
SCAN_OUT <= SCANCLK;
end rtl;
『叄』 EDA課程設計!數字式競賽搶答器!
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYqdqIS
PORT(a1,a2,a3,a4,rest,clk:INSTD_LOGIC;
s1:OUTSTD_LOGIC;
LED7S:OUTSTD_LOGIC_VECTOR(6DOWNTO0));
end;
ARCHITECTUREoneOFqdqIS
SIGNALd:STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALf:STD_LOGIC;
SIGNALs2:STD_LOGIC_VECTOR(2DOWNTO0);
BEGIN
p1:PROCESS(a1,a2,a3,a4,rest,clk)
BEGIN
if(rest='1')then
f<='0';d<="0000";
elsifrising_edge(clk)then
if((a1='1')or(d(3)='1'))andnot((d(0)='1')or(d(1)='1')or(d(2)='1'))thend(3)<='1';
endif;
if((a2='1')or(d(2)='1'))andnot((d(0)='1')or(d(1)='1')or(d(3)='1'))thend(2)<='1';
endif;
if((a3='1')or(d(1)='1'))andnot((d(0)='1')or(d(2)='1')or(d(3)='1'))thend(1)<='1';
endif;
if((a4='1')or(d(0)='1'))andnot((d(1)='1')or(d(2)='1')or(d(2)='1'))thend(0)<='1';
endif;
f<=a1ora2ora3ora4;
endif;
endprocess;
s1<=fandclk;
p2:PROCESS(d)
BEGIN
Ifd="1000"thenLED7S<="0000110";
elsIfd="0100"thenLED7S<="1011011";
elsIfd="0010"thenLED7S<="1001111";
elsIfd="0001"thenLED7S<="1100110";
ElseLED7S<="0111111";
endprocess;
endone;