當前位置:編程學習大全網 - 腳本源碼 - vhdl交通燈的設計

vhdl交通燈的設計

壹 實驗目的

1. 了解交通燈的亮滅規律。

2. 了解交通燈控制器的工作原理。

3. 熟悉VHDL語言編程,了解實際設計中的優化方案。

二 硬件需求

1.EDA/SOPC實驗箱壹臺。

三 實驗原理

交通燈的顯示有很多方式,如十字路口、丁字路口等,而對於同壹個路口又有很多不同的顯示要求,比如十字路口,車子如果只要東西和南北方向通行就很簡單,而如果車子可以左右轉彎的通行就比較復雜,本實驗僅針對最簡單的南北和東西直行的情況。

要完成本實驗,首先必須了解交通路燈的亮滅規律。本實驗需要用到實驗箱上交通燈模塊中的發光二極管,即紅、黃、綠各三個。依人們的交通常規,“紅燈停,綠燈行,黃燈提醒”。其交通燈的亮滅規律為:初始態是兩個路口的紅燈全亮,之後東西路口的綠燈亮,南北路口的紅燈亮,東西方向通車,延時壹段時間後,東西路口綠燈滅,黃燈開始閃爍。閃爍若幹次後,東西路口紅燈亮,而同時南北路口的綠燈亮,南北方向開始通車,延時壹段時間後,南北路口的綠燈滅,黃燈開始閃爍。閃爍若幹次後,再切換到東西路口方向,重復上述過程。

在實驗中使用8個七段碼管中的任意兩個數碼管顯示時間。東西路和南北路的通車時間均設定為20s。數碼管的時間總是顯示為19、18、17……2、1、0、19、18……。在顯示時間小於3秒的時候,通車方向的黃燈閃爍。

四 實驗內容

本實驗要完成任務就是設計壹個簡單的交通燈控制器,交通燈顯示用實驗箱的交通燈模塊和七段碼管中的任意兩個來顯示。系統時鐘選擇時鐘模塊的1KHz時鐘,黃燈閃爍時鐘要求為2Hz,七段碼管的時間顯示為1Hz脈沖,即每1s中遞減壹次,在顯示時間小於3秒的時候,通車方向的黃燈以2Hz的頻率閃爍。系統中用S1按鍵進行復位。

五 實驗步驟

完成交通燈控制器的實驗步驟如下:

1.首先打開Quartus II軟件,新建壹個工程,並新建壹個VHDL File。

2.按照自己的想法,編寫VHDL程序.

3.對自己編寫的VHDL程序進行編譯並仿真。

4.仿真無誤後,根據附錄壹的引腳對照表,對實驗中用到時鐘、七段碼顯示及交通燈模塊的LED對應的FPGA引腳進行管腳綁定,然後再重新編譯壹次。

5.用下載電纜通過JTAG接口將對應的sof文件下載到FPGA中。

6.觀察交通燈控制器的工作是否滿足實驗要求。

註意:此實驗需管腳復用

-----------------------------------------------------------------------------------

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_arith.all;

use ieee.std_logic_unsigned.all;

--------------------------------------------------------------------

entity exp18 is

port( Clk : in std_logic; --時鐘輸入

Rst : in std_logic; --復位輸入

R1,R2 : out std_logic; --紅燈輸出

Y1,Y2 : out std_logic; --黃燈輸出

G1,G2 : out std_logic; --綠燈輸出

Display : out std_logic_vector(7 downto 0); --七段碼管顯示輸出

SEG_SEL : buffer std_logic_vector(2 downto 0) --七段碼管掃描驅動

);

end exp18;

--------------------------------------------------------------------

architecture behave of exp18 is

signal Disp_Temp : integer range 0 to 15;

signal Disp_Decode : std_logic_vector(7 downto 0);

signal SEC1,SEC10 : integer range 0 to 9;

signal Direction : integer range 0 to 15;

signal Clk_Count1 : std_logic_vector(9 downto 0); --產生0.5Hz時鐘的分頻計數器

signal Clk1Hz : std_logic;

signal Dir_Flag : std_logic; --方向標誌

begin

process(Clk)

begin

if(Clk'event and Clk='1') then

if(Clk_Count1<1000) then

Clk_Count1<=Clk_Count1+1;

else

Clk_Count1<="0000000001";

end if;

end if;

end process;

Clk1Hz<=Clk_Count1(9);

process(Clk1Hz,Rst)

begin

if(Rst='0') then

SEC1<=0;

SEC10<=2;

Dir_Flag<='0';

elsif(Clk1Hz'event and Clk1Hz='1') then

if(SEC1=0) then

SEC1<=9;

if(SEC10=0) then

SEC10<=1;

else

SEC10<=SEC10-1;

end if;

else

SEC1<=SEC1-1;

end if;

if(SEC1=0 and SEC10=0) then

Dir_Flag<=not Dir_Flag;

end if;

end if;

end process;

process(Clk1Hz,Rst)

begin

if(Rst='0') then

R1<='1';

G1<='0';

R2<='1';

G2<='0';

else --正常運行

if(SEC10>0 or SEC1>3) then

if(Dir_Flag='0') then --橫向通行

R1<='0';

G1<='1';

R2<='1';

G2<='0';

else

R1<='1';

G1<='0';

R2<='0';

G2<='1';

end if;

else

if(Dir_Flag='0') then --橫向通行

R1<='0';

G1<='0';

R2<='1';

G2<='0';

else

R1<='1';

G1<='0';

R2<='0';

G2<='0';

end if;

end if;

end if;

end process;

process(Clk1Hz)

begin

if(SEC10>0 or SEC1>3) then

Y1<='0';

Y2<='0';

elsif(Dir_Flag='0') then

Y1<=Clk1Hz;

Y2<='0';

else

Y1<='0';

Y2<=Clk1Hz;

end if;

end process;

process(Dir_Flag)

begin

if(Dir_Flag='0') then --橫向

Direction<=10;

else --縱向

Direction<=11;

end if;

end process;

process(SEG_SEL)

begin

case (SEG_SEL+1) is

when "000"=>Disp_Temp<=Direction;

when "001"=>Disp_Temp<=Direction;

when "010"=>Disp_Temp<=SEC10;

when "011"=>Disp_Temp<=SEC1;

when "100"=>Disp_Temp<=Direction;

when "101"=>Disp_Temp<=Direction;

when "110"=>Disp_Temp<=SEC10;

when "111"=>Disp_Temp<=SEC1;

end case;

end process;

process(Clk)

begin

if(Clk'event and Clk='1') then --掃描累加

SEG_SEL<=SEG_SEL+1;

Display<=Disp_Decode;

end if;

end process;

process(Disp_Temp) --顯示轉換

begin

case Disp_Temp is

when 0=>Disp_Decode<="00111111"; --'0'

when 1=>Disp_Decode<="00000110"; --'1'

when 2=>Disp_Decode<="01011011"; --'2'

when 3=>Disp_Decode<="01001111"; --'3'

when 4=>Disp_Decode<="01100110"; --'4'

when 5=>Disp_Decode<="01101101"; --'5'

when 6=>Disp_Decode<="01111101"; --'6'

when 7=>Disp_Decode<="00000111"; --'7'

when 8=>Disp_Decode<="01111111"; --'8'

when 9=>Disp_Decode<="01101111"; --'9'

when 10=>Disp_Decode<="01001000"; --'='

when 11=>Disp_Decode<="00010100"; --'||'

when others=>Disp_Decode<="00000000"; --全滅

end case;

end process;

end behave;

  • 上一篇:求《幽遊白書》、《犬夜叉》的地址 要有源有速度的 最好有大的清晰的 謝啦
  • 下一篇:workbench是什麽意思
  • copyright 2024編程學習大全網