Transcript Lab8

Programmable Logic
System Design
Lab08
- Reaction Timer
SOC LAB.
Che-Yuan Sung
2013.12
LAB Description
 此實驗中我們將測量人的反應時間,由於人的
反應時間遠大於內建CLOCK的週期,因此要對
CLOCK做除頻的動作方可適用,並方便於計數
器的計算與七段顯示器的呈現。
 實驗內容為當看到LED亮起時,立即做出反應
將計數器停下,並顯示當時計數器之時間,計
數器以兩位數BCD counter來實現並將結果顯
示於七段顯示器上。
Assignment
注意:FPGA板上的按鈕是平常為0,按下為1,與圖示相反
(掃描多顆七段也需要除頻)
clk
(內部要除頻)
Assignment
 基本題:撰寫 VHDL 並燒進 FPGA 完成上述電路功能
,並Demo給助教看 (60%)
 加分題:使用 ModelSim 測試整個電路的邏輯,並
Demo 給助教看。模擬人按下按鈕的時間可以自己隨
意設定,助教只會看整體邏輯反應是否正常 (40%)
 ModelSim 的有無會反應在結報分數上,若時間來不
及仍可選擇只用板子 Demo 基本題。
Practice 1:The 7-segment code converter
architecture Behavioral of sevenseg is
begin
aout<="00000011" when ain ="0000" ELSE
"10011111" when ain ="0001" ELSE
"00100101" when ain ="0010" ELSE
"00001101" when ain ="0011" ELSE
"10011001" when ain ="0100" ELSE
"01001001" when ain ="0101" ELSE
"01000001" when ain ="0110" ELSE
"00011111" when ain ="0111" ELSE
"00000001" when ain ="1000" ELSE
"00011001" when ain ="1001" ELSE
"11111111";
end Behavioral;
Practice 2: The BCD counter
entity BCDcount is PORT(
clock, clear,E:in STD_LOGIC;
BCD1,BCD0:BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0));
end BCDcount;
architecture Behavioral of BCDcount is begin
process(clock) begin
IF Clock'EVENT AND Clock = '1' THEN
IF Clear = '1' THEN
BCD1 <= "0000" ; BCD0 <= "0000" ;
ELSIF E = '1' THEN
IF BCD0 = "1001" THEN
BCD0 <= "0000" ;
IF BCD1 = "1001" THEN
BCD1 <= "0000";
ELSE
BCD1 <= BCD1 + '1' ;
END IF ;
ELSE
BCD0 <= BCD0 + '1' ;
END IF ;
END IF ;
END IF;
END PROCESS;
end Behavioral;
Practice 3: Clock Divider
signal clk:STD_LOGIC_VECTOR(20 DOWNTO 0);
signal hhh:STD_LOGIC;
process(stop)
begin
if stop='1' then
hhh<='0';
else
hhh<=clk(20);
end if;
end process;
PROCESS(Clock)
BEGIN
IF Clock'EVENT AND Clock='1' THEN
clk <= clk + '1';
END IF;
END PROCESS;
Practice 4:Scan code in Reaction Timer
 為了節省接腳的個數,實驗版將四組七段的輸入信號共用接腳,
因此我們必須以分時的方法來顯示timer的兩個位數,並透過信號
(AN0~AN3)來選擇控制的七段顯示器,如果我們要同時顯示兩個
以上的數字,就必須使用分時的技巧。
 所謂的分時的技巧是指將時間平均分配至每個待顯示的顯示器,
利用視覺暫留與放電延遲的原理產生同時顯示的效果,所以我們
可以利用一個超過人眼視覺暫留的頻率,來切換位數的顯示。
 下面的程式片段是以scanclk作為掃描訊號,切換個位數與十位數
,drive0、drive1是分別驅動兩組七段顯示的驅動訊號,outbcd
是給七段顯示器的輸入訊號。
Practice 4:Scan code in Reaction Timer
PROCESS(scanclk)
begin
if scanclk='0' then
drive0<= '0';
drive1<='0';
outbcd<=bcd0;
else
drive0<='0';
drive1<='1';
outbcd<=bcd1;
end if;
end process;
附錄:對應腳位圖
附錄:對應腳位圖
附錄:七段顯示器編號