實驗的目的
1.了解燈的開關規則。
2.了解交通燈控制器的工作原理。
3.熟悉VHDL編程,了解實際設計中的優化方案。
第二,硬件要求
1.EDA/SOPC實驗箱。
三個實驗原則
紅綠燈的顯示方式有很多種,比如十字路口、丁字路口,同壹路口有很多不同的顯示要求。比如在十字路口,汽車從東西方向和南北方向通過是很簡單的,但是如果汽車可以左右轉彎就比較復雜了。這個實驗只是針對最簡單的從北到南,從東到西直行的情況。
要完成這個實驗,首先要了解交通路燈的點亮和熄滅規律。在這個實驗中,我們需要使用實驗箱上的交通燈模塊中的發光二極管,即三個紅色、三個黃色和三個綠色。按照人們的交通常規,“紅燈停,綠燈行,黃燈提醒”。紅綠燈的熄燈規律是:初始狀態是兩個路口紅燈全亮,然後東西路口綠燈亮,南北路口紅燈亮,東西方向通行。延遲壹段時間後,東西交叉路口的綠燈熄滅,黃燈開始閃爍。閃幾次後,東西路口紅燈亮,南北路口綠燈亮,南北方向開始通車。延時壹段時間後,南北路口綠燈熄滅,黃燈開始閃爍。閃爍幾次後,切換到東西向路口,重復上述過程。
實驗中,用八個七段碼管中的任意兩個數碼管來顯示時間。東西路、南北路開放時間設置為20s。數碼管的時間總是顯示為19,18,17...2, 1, 0, 19, 18.當顯示時間少於3秒時,交通方向的黃燈閃爍。
四個實驗內容
本實驗的任務是設計壹個簡單的交通燈控制器,交通燈顯示由實驗箱中的交通燈模塊和七段碼管中的任意兩個顯示。系統時鐘選擇時鐘模塊的1KHz時鐘,黃燈閃爍時鐘要求為2Hz,七段碼管時間顯示為1Hz脈沖,即每1s遞減壹次。當顯示時間小於3秒時,開啟方向的黃燈以2Hz的頻率閃爍。在系統中,使用S1鍵進行復位。
五個實驗步驟
完成交通燈控制器的實驗步驟如下:
1.首先,打開Quartus II軟件,構建壹個新項目,創建壹個新的VHDL文件。
2.按照自己的想法寫VHDL程序。
3.編譯和模擬VHDL程序。
4.仿真無誤後,根據附錄1中的管腳對照表,對實驗中用到的時鐘、七段碼顯示、紅綠燈模塊的LED對應的FPGA管腳進行管腳綁定,然後重新編譯。
5.用下載線通過JTAG接口將相應的sof文件下載到FPGA中。
6.觀察交通燈控制器是否符合實驗要求。
====================================
源代碼如下
====================================
圖書館ieee
使用IEEE . STD _ logic _ 1164 . all;
使用IEEE . STD _ logic _ arith . all;
使用IEEE . STD _ logic _ unsigned . all;
-
實體exp18是
port(Clk:in STD _ logic;-時鐘輸入
Rst:在std_logic中;-重置輸入
R1,R2:out STD _ logic;-紅光輸出
Y1,Y2:out STD _ logic;-黃光輸出
G1,G2:out STD _ logic;-綠光輸出
顯示:out STD _ logic _ vector(7 down to 0);-七位碼管顯示輸出。
seg _ sel:BufferSTD _ Logic _ Vector(2 downto 0)-七段碼管掃描驅動
);
end exp 18;
-
exp18的建築表現為
信號Disp_Temp:整數範圍0到15;
信號Disp _ Decode:STD _ logic _ vector(7 down to 0);
信號SEC1,SEC10:整數範圍0到9;
信號方向:整數範圍0到15;
信號Clk _ count 1:STD _ logic _ vector(9 down to 0);-產生0.5Hz時鐘的分頻器。
信號clk 1Hz:STD _ logic;
信號Dir _ Flag:STD _ logic;-方向標誌
開始
進程(時鐘)
開始
if(Clk'event and Clk='1 ')則
if(Clk _ count 1 & lt;1000)
clk _ count 1 & lt;= Clk _ count 1+1;
其他
clk _ count 1 & lt;="0000000001";
結束if;
結束if;
結束進程;
clk 1Hz & lt;= Clk _ count 1(9);
過程(時鐘1Hz,Rst)
開始
如果(Rst='0 ')那麽
sec 1 & lt;=0;
sec 10 & lt;=2;
Dir _ Flag & lt='0';
elsif(Clk1Hz '事件和Clk1Hz='1 ')然後
if(SEC1=0)則
sec 1 & lt;=9;
if(SEC10=0)則
sec 10 & lt;=1;
其他
sec 10 & lt;= sec 10-1;
結束if;
其他
sec 1 & lt;= sec 1-1;
結束if;
如果(SEC1=0且SEC10=0 ),則
Dir _ Flag & lt= not Dir _ Flag
結束if;
結束if;
結束進程;
過程(時鐘1Hz,Rst)
開始
如果(Rst='0 ')那麽
r 1 & lt;='1';
g 1 & lt;='0';
R2<='1';
G2 & lt='0';
否則-正常操作
if(sec 10 & gt;0或sec 1 & gt;3)然後
If (dir _ flag =' 0 ')則-橫向流量
r 1 & lt;='0';
g 1 & lt;='1';
R2<='1';
G2 & lt='0';
其他
r 1 & lt;='1';
g 1 & lt;='0';
R2<='0';
G2 & lt='1';
結束if;
其他
If (dir _ flag =' 0 ')則-橫向流量
r 1 & lt;='0';
g 1 & lt;='0';
R2<='1';
G2 & lt='0';
其他
r 1 & lt;='1';
g 1 & lt;='0';
R2<='0';
G2 & lt='0';
結束if;
結束if;
結束if;
結束進程;
過程(時鐘1Hz)
開始
if(sec 10 & gt;0或sec 1 & gt;3)然後
y 1 & lt;='0';
Y2 & lt='0';
elsif(Dir_Flag='0 ')然後
y 1 & lt;= clk 1Hz;
Y2 & lt='0';
其他
y 1 & lt;='0';
Y2 & lt= clk 1Hz;
結束if;
結束進程;
進程(目錄標誌)
開始
If (dir _ flag =' 0 ')則-水平
方向& lt=10;
否則-垂直
方向& lt=11;
結束if;
結束進程;
進程(分段_選擇)
開始
案例(SEG_SEL+1)為
當“000”= >Disp_Temp<=方向;
當" 001"= >時;Disp_Temp<=方向;
當" 010"= >時;Disp_Temp<= sec 10;
當" 011"= >Disp_Temp<= sec 1;
當" 100"= >Disp_Temp<=方向;
當" 101"= >Disp_Temp<=方向;
當" 110"= >Disp_Temp<= sec 10;
當" 111"= >Disp_Temp<= sec 1;
結束案例;
結束進程;
進程(時鐘)
開始
if(clk ' event and clk = ' 1 ')then-掃描累加。
SEG _ SEL & lt= SEG _ SEL+1;
顯示& lt= Disp _ Decode
結束if;
結束進程;
process(disp _ temp)-顯示轉換。
開始
案例顯示溫度為
當0= >時;Disp _ Decode & lt="00111111";- '0'
當1= >Disp _ Decode & lt="00000110";- '1'
當2= >時;Disp _ Decode & lt="01011011";- '2'
當3= >時;Disp _ Decode & lt="01001111";- '3'
當4= >時;Disp _ Decode & lt="01100110";- '4'
當5= >時;Disp _ Decode & lt="01101101";- '5'
當6= >時;Disp _ Decode & lt="01111101";- '6'
當7= >時;Disp _ Decode & lt="00000111";- '7'
當8= >時;Disp _ Decode & lt="01111111";- '8'
當9= >時;Disp _ Decode & lt="01101111";- '9'
當10= >Disp _ Decode & lt="01001000";- '='
當11= >Disp _ Decode & lt="00010100";- '||'
當別人= & gtDisp _ Decode & lt="00000000";-完全滅絕
結束案例;
結束進程;
結束行為;
==================================================
註意:根據不同的硬件對程序做適當的調整。