第一篇:FPGA交通燈實驗報告
交通燈實驗報告
一,實驗目的
實現兩路信號燈交替亮起,并利用兩組數碼管分別對兩路信號進行倒計時。
兩路信號時間分別為:
V:綠燈(30S)
H:紅燈(35S)
黃燈(5s)
綠燈(30S)
紅燈(35S)
黃燈(5S)
二,實驗步驟 建立工程
可在歡迎界面點擊“Creat a New Project”進入工程建立界面,亦可關閉歡迎界面,點擊菜單欄的“File”,點擊“New Project Wizard”進入建立工程界面。右側為建立工程界面,點擊next。
在此界面選定工程路徑,取好工程名,點擊“Next”。注意:路徑中不能有中文,工程名也不能有中文。
一直點擊“Next”進入器件設置界面,DE2-70開發工具采用的Cyclone II系列的EP2C70F896C6N。點擊“Finish”,完成工程建立
1、點擊“File”,點擊“New” 選擇“Verilog HDL” 2,點擊主界面工具欄中的 選擇“Verilog HDL”
3、寫入verilog代碼。
代碼如下:
module traffic(Clk_50M,Rst,LedR_H,LedG_H,LedY_H,LedR_V,LedG_V,LedY_V,Seg7_VH,Seg7_VL,Seg7_HH,Seg7_HL,led15);
parameter S1=2'b00;parameter S2=2'b01;parameter S3=2'b10;parameter S4=2'b11;
input Clk_50M,Rst;output LedR_H,LedG_H,LedY_H,LedR_V,LedG_V,LedY_V;output[6:0] Seg7_VH,Seg7_VL,Seg7_HH,Seg7_HL;output led15;
//-------------div for 1Hz-------start----reg Clk_1Hz;reg [31:0] Cnt_1Hz;always@(posedge Clk_50M or negedge Rst)begin
if(!Rst)
begin
Cnt_1Hz<=1;
Clk_1Hz<=1;
end
else
begin
if(Cnt_1Hz>=25000000)
end
//-----------div for 1Hz------end-----reg[7:0] Cnt30,CntH,CntV,CntHH,CntVV;reg[7:0] CntDis,CntDiss;//-----------30 counter and seg7---start---reg LedR_H,LedG_H,LedY_H,LedR_V,LedG_V,LedY_V;always@(posedge Clk_1Hz)begin
end
begin
Cnt_1Hz<=1;
Clk_1Hz<=~Clk_1Hz;
end
else
Cnt_1Hz<=Cnt_1Hz + 1;
case(state)
S1:
end
always@(posedge Clk_1Hz)begin
case(stateV)
S1:
begin
if(CntV>=30)
CntV<=1;
begin
if(Cnt30>=30)
Cnt30<=1;
else
Cnt30<=Cnt30 + 1;S2:
begin
if(Cnt30>=5)
Cnt30<=1;end
else
Cnt30<=Cnt30 + 1;S3:
begin
if(Cnt30>=30)
Cnt30<=1;end
else
Cnt30<=Cnt30 + 1;S4:
begin
if(Cnt30>=5)
Cnt30<=1;end
else
Cnt30<=Cnt30 + 1;end endcase
else
CntV<=CntV + 1;
S2: begin
end
end if(CntV>=5)
CntV<=1;
else
CntV<=CntV + 1;end
S3:
begin
if(CntV>=35)
CntV<=1;
else
CntV<=CntV + 1;end endcase always@(posedge Clk_1Hz)begin
case(stateH)
S1:
end
always@(negedge Clk_50M or negedge Rst)begin
begin
if(CntH>=35)
CntH<=1;
else
CntH<=CntH + 1;
S2:
begin
if(CntH>=30)
CntH<=1;end
else
CntH<=CntH + 1;end
S3:
begin
if(CntH>=5)
CntH<=1;
else
CntH<=CntH + 1;end endcase
case(state)
S1:
end always@(negedge Clk_50M or negedge Rst)begin
case(state)
S1:
end
//16進制計數器轉換為用于顯示的10進制計數器 always@(posedge Clk_50M)begin
if(CntVV>29)
begin
CntDis[7:4]<=3;
CntDis[3:0]<=CntVV20;end else if(CntVV>9)begin
CntDis[7:4]<=1;
CntDis[3:0]<=CntVV30;end else if(CntHH>19)begin
CntDiss[7:4]<=2;
CntDiss[3:0]<=CntHH10;end else
CntDiss<=CntHH;
end
if(Cnt30>=5)
end
end S3:
begin
state<=S4;
end S4:
begin
state<=S1;
end default:
begin
state<=S1;
end endcase
if(Cnt30>=30)
if(Cnt30>=5)always@(posedge Clk_1Hz)begin
case(state)
S1:
end
always@(posedge Clk_50M or negedge Rst)
begin
stateH<=S1;
stateV<=S1;
end S2:
begin
stateH<=S1;
stateV<=S2;
end S3:
begin
stateH<=S2;
stateV<=S3;
end S4:
begin
stateH<=S3;
stateV<=S3;
end endcase begin
if(!Rst)
begin
LedR_H<=0;
else
LedG_H<=0;LedY_H<=0;
LedR_V<=0;
LedG_V<=0;end LedY_V<=0;
begin
case(state)
S1:
begin
LedR_H<=1;LedG_H<=0;LedY_H<=0;LedR_V<=0;LedG_V<=1;LedY_V<=0;end
S2:
begin
LedR_H<=1;LedG_H<=0;LedY_H<=0;LedR_V<=0;LedG_V<=0;LedY_V<=1;end
S3:
begin
LedR_H<=0;LedG_H<=1;LedY_H<=0;LedR_V<=1;LedG_V<=0;LedY_V<=0;end
S4:
begin LedR_H<=0;LedG_H<=0;
end
LedY_H<=1;LedR_V<=1;LedG_V<=0;LedY_V<=0;end
default:
begin
end LedR_H<=0;LedG_H<=0;LedY_H<=0;LedR_V<=0;LedG_V<=0;LedY_V<=0;end
endcase assign led15=state;
endmodule
module SEG7_LUT input [3:0] iDIG;output reg
always @(iDIG)begin
case(iDIG)4'h1: oSEG = 7'b1111001;
//---t----4'h2: oSEG = 7'b0100100;// |
| 4'h3: oSEG = 7'b0110000;// lt rt
4'h4: oSEG = 7'b0011001;// |
| 4'h5: oSEG = 7'b0010010;//---m----4'h6: oSEG = 7'b0000010;// |
| 4'h7: oSEG = 7'b1111000;// lb rb 4'h8: oSEG = 7'b0000000;// |
| 4'h9: oSEG = 7'b0011000;//---b----4'ha: oSEG = 7'b0001000;4'hb: oSEG = 7'b0000011;4'hc: oSEG = 7'b1000110;4'hd: oSEG = 7'b0100001;4'he: oSEG = 7'b0000110;[6:0] oSEG;[6:0] oSEG;(oSEG,iDIG);
end
4'hf: oSEG = 7'b0001110;4'h0: oSEG = 7'b1000000;endcase endmodule 編譯工程
保存文件,將文件放在所建工程所在路徑下 點擊主界面工具欄中的圖標
也可點擊菜單欄中“Processing”,點擊“Start Compilation”
分配關鍵如下:
Clk_50M Input PIN_AD15 LedG_H Output PIN_AD9 LedG_V Output PIN_AJ6 LedR_H Output PIN_AJ7)LedR_V Output PIN_AJ5)LedY_H Output PIN_AD8 LedY_V Output PIN_AK5 Rst Input PIN_AA23 Seg7_HH[6] Output PIN_G1 Seg7_HH[5] Output PIN_H3 Seg7_HH[4] Output PIN_H2 Seg7_HH[3] Output PIN_H1 Seg7_HH[2] Output PIN_J2 Seg7_HH[1] Output PIN_J1 Seg7_HH[0] Output PIN_K3
Seg7_HL[6] Seg7_HL[5] Seg7_HL[4] Seg7_HL[3] Seg7_HL[2] Seg7_HL[1] Seg7_HL[0] Seg7_VH[6] Seg7_VH[5] Seg7_VH[4] Seg7_VH[3] Seg7_VH[2] Seg7_VH[1] Seg7_VH[0] Seg7_VL[6] Seg7_VL[5] Seg7_VL[4] Seg7_VL[3] Seg7_VL[2] Seg7_VL[1] Seg7_VL[0] Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output PIN_E4 PIN_F4 PIN_G4 PIN_H8 PIN_H7 PIN_H4 PIN_H6 PIN_AD17 PIN_AF17 7 PIN_AE17 7 PIN_AG16 PIN_AF16 7 PIN_AE16 7 PIN_AG13 PIN_AD12 PIN_AD11 PIN_AF10 8 PIN_AD10 PIN_AH9 8 PIN_AF9 8 PIN_AE8 8
燒寫代碼
在管腳配置完成后,還需將工程再編譯一次,成功后,點擊主界面工具欄中的亦可點擊主界面菜單欄中“Tools”,點擊“Programmer”
進入代碼燒寫界面后,點擊“Start”,當“Progress”為100%時,表示燒寫完成,這是可觀察DE2-70板現象
獲得預期的效果,兩組的信號紅黃綠燈交替切換,計數器記為零時信號燈切換狀態,紅燈35s,黃燈5s,綠燈30s。三,心得體會
通過本次實驗初步了解了EDA技術,熟悉了FPGA開發板的開發流程,鍛煉了動手能力。
第二篇:基于FPGA的交通燈控制系統
基于FPGA的交通燈控制系統
摘 要:針對現實中越來越嚴重的城市交通擁堵現象,提出了一種城市十字路口 交通信號燈控制與FPGA實現的新方法。利用超高速硬件描述語言VHDL設計十字路口交通信號燈控制器,實現主干道和支干道的交通控制功能,實時監測每個路口的車輛通行情況,以此更改主干道與支干道的交通燈狀態,提高十字路口的車輛通行效率,最后通過硬件測試實現具體功能。
關鍵詞:VHDL FPGA 交通燈控制
一、概述 1.1 設計要求:
(1)設計一個交通信號燈控制器,由一條主干道和一條支干道匯合成十字路口,在每個入口處設置紅、綠、黃三色信號燈,紅燈亮禁止通行,綠燈亮允許通行,黃燈亮則給行駛中的車輛有時間停在禁行線外。(2)紅、綠、黃發光二極管作信號燈。
(3)主干道處于常允許通行的狀態,支干道有車來時才允許通行。主干道亮綠燈時,支干道亮紅燈;支干道亮綠燈時,主干道亮紅燈。
(4)主、支干道均有車時,兩者交替允許通行,主干道每次放行45秒,支干道每次放行25秒,設立45秒、25秒計時、顯示電路。
(5)在每次由綠燈亮到紅燈亮的轉換過程中,要亮5秒黃燈作為過渡,使行駛中的車輛有時間停到禁行線外,設立5秒計時、顯示電路。1.2 課題分析
(1)主支道路分4種行車狀況,無無、無有、有無、有有,此信號從傳感器輸出信號得到,作為系統的輸入,在本系統中用撥片開關模擬狀態輸入。(2)主支道路有4種亮燈情況:主綠支紅、主黃支紅、支綠主紅、支黃主紅。(3)只要支路無車通行,則一直為主綠支紅狀態,只有支路有車通過才會進入支綠主紅狀態。
(4)系統可以根據行車情況智能進入相應亮燈情況,提高了十字路口的通車效率。
(5)用6個發光二極管作為主道路綠黃紅三燈顯示輸出和支道路綠黃紅三燈顯示輸出;用4個數碼管分別作為主支道路倒計時顯示輸出。
二、系統方案設計 2.1 整體模塊設計 2.1.1整體設計思路
整體設計思路為:交通燈控制系統主要包括兩個模塊,即交通燈控制模塊和倒計時顯示模塊。首先利用教學實驗箱提供的1HZ時鐘信號,實現計數功能,1s計數一次,同時設定主干道、支干道的交通燈的具體亮燈時間,并將計數結果傳給倒計時模塊,以實現倒計時模塊顯示的時間與交通燈的狀態相對應。在交通燈控制過程中,用狀態機來實現,設定主干道、支干道的行車檢測信號,用以進行狀態變換。每進入一個狀態就開始計數,該狀態結束則清零,在下個狀態開始時重新計數,實現每個狀態亮燈時間不同的需求。2.1.2 整體設計框架
根據系統要求可知:
輸入信號為系統時鐘,主支道路行車情況模擬輸入。輸出信號為主支道路紅綠黃顯示信號、倒計時顯示。
2.2 交通燈狀態轉換模塊設計
由原理分析可知系統需要在4種亮燈狀態之間切換,所以需要設計一個狀態轉換控制模塊,而倒計時顯示則來自內部的計數,所以狀態轉換模塊內部包含了計數模塊,又因為二極管模擬紅綠燈顯示是和亮燈狀態緊密相關的,所以相應的二極管控制整合在狀態轉換控制模塊內部。故在狀態轉換模塊內部包含3個子模塊,分別為計數模塊、狀態轉換控制模塊、二極管實現模塊。最后因為數碼管動態顯示模塊需要根據亮燈狀態決定輸出,所以本模塊還需增加計數輸出以及狀態輸出信號。該模塊計數采用1hz的時鐘脈沖,以期實現交通燈的秒數設置。
狀態循環控制: S0:主干道綠燈支干道紅燈45s S1:主干道黃燈支干道紅燈5s S2:主干道紅燈支干道綠燈25s S3:主干道紅燈支干道黃燈5s
2.3 數碼管倒計時顯示模塊設計
由于此模塊采用了數碼管的動態顯示原理,所以代碼量較多,單獨分為一個模塊,又因為動態顯示倒計時間是與亮燈狀態緊密相關的,所以必須從交通燈狀態控制模塊獲取相關的狀態輸入,引出狀態輸出信號,以供本模塊使用。又因為動態顯示需要較高的時鐘頻率,所以本模塊的時鐘信號采用系統輸入信號,而非之前計數的1hz時鐘。4位數碼管的前兩位顯示支干道的亮燈時間,后兩位顯示主干道的亮燈時間。
三、硬件設計 3.1總體設計框圖
由clk1hz輸入,用來計數,道路行車檢測由pass_state1,pass_state0控制,pass_state1為主干道行車檢測,pass_state0為支干道行車檢測。1為有車通行,0為無車通行,輸出為數碼管的位選信號和段選信號,以及6個二極管控制信號。
3.2交通燈狀態轉換模塊
輸入計數時鐘和行車控制,輸出主干道以及支干道紅綠黃三燈的控制信號,最重要的是將此時的計數時間輸出給倒計時模塊,并將4個狀態的狀態輸出信號給倒計時模塊,實現在對應的狀態下顯示對應的時間。3.3數碼管倒計時顯示模塊
為了實現數碼管動態掃描,此模塊的時鐘使用較高頻率,輸入上級電路的計數輸出和狀態輸出,給出位選以及段選信號的控制。
四、硬件測試 4.1 引腳分配
Pin_3——1hz時鐘輸入,用于狀態控制模塊 Pin_33——24khz時鐘輸入,用于數碼管動態掃描 Pin_4——K1 支干道行車模擬輸入 Pin_5——K2 主干道行車模擬輸入
Pin_6,Pin_8,Pin_10——數碼管位選信號
Pin_11,Pin_12,Pin_13,Pin_14,Pin_15,Pin_30,Pin_31——數碼管段選信號
Pin_34——R1主干道紅燈 Pin_35——Y1 主干道黃燈 Pin_36——G1 主干道綠燈 Pin_37——R2 支干道紅燈 Pin_39——Y2 支干道黃燈 Pin_40——G2 支干道綠燈
4.2 仿真結果 交通燈顯示:
倒計時顯示:
S1狀態(支紅主黃):
S0狀態(支紅主綠)
五、總結
基本實現了設計所需的功能,能根據道路行車情況實現交通燈的智能控制,并將紅綠燈通行的時間通過數碼管直觀顯示出來,較好的完成了十字路口交通情況的模擬。
六、附錄
6.1 頂層模塊源程序
LIBRARY IEEE;---自動交通燈控制系統頂層描述 USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY TRAFFIC_LIGHT_CONTROL IS PORT(CLK1hz,CLK1khz : IN STD_LOGIC;---信號時鐘輸入
PASS_STATE : IN STD_LOGIC_VECTOR(1 DOWNTO 0);---主支通道的通車情況,低位為支通道高位為主通道,0為無車1為有車
ALIGHT : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);---主干道紅綠黃燈控制信號 BLIGHT : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);---支干道紅綠黃燈控制信號 SEL : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);---輸出數碼管位選信號 LED7S : OUT STD_LOGIC_VECTOR(6 DOWNTO 0)---輸出數碼管段選信號);END ENTITY TRAFFIC_LIGHT_CONTROL;
ARCHITECTURE behav OF TRAFFIC_LIGHT_CONTROL IS COMPONENT STATE_CONTROL PORT(CLK1 : IN STD_LOGIC;---1Hz時鐘信號輸入
PASS_STATE_IN : IN STD_LOGIC_VECTOR(1 DOWNTO 0);---主支通道的通車情況,低位為支通道高位為主通道,0為無車1為有車
A_LIGHT: OUT STD_LOGIC_VECTOR(2 DOWNTO 0);---主干道紅綠黃燈控制信號 B_LIGHT: OUT STD_LOGIC_VECTOR(2 DOWNTO 0);---支干道紅綠黃燈控制信號 CNTOUT : OUT STD_LOGIC_VECTOR(5 DOWNTO 0);---已計數時間輸出
STATEOUT : OUT STD_LOGIC_VECTOR(1 DOWNTO 0)---狀態輸出,傳遞給數碼顯示模塊);END COMPONENT;
COMPONENT DISPLAY PORT(CLK2 : IN STD_LOGIC;---1KHz時鐘信號輸入
CNTIN : IN STD_LOGIC_VECTOR(5 DOWNTO 0);---亮燈已過時間輸入 STATEIN : IN STD_LOGIC_VECTOR(1 DOWNTO 0);---狀態輸入
LED7SOUT : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);---數碼管段選信號輸出 SELOUT : OUT STD_LOGIC_VECTOR(2 DOWNTO 0)---數碼管位選信號輸出);END COMPONENT;
SIGNAL MSTATE : STD_LOGIC_VECTOR(1 DOWNTO 0);---中間信號傳遞通車狀態
SIGNAL MCNT : STD_LOGIC_VECTOR(5 DOWNTO 0);---中間信號傳遞亮燈已計數時間
BEGIN---例化語句
U1: STATE_CONTROL PORT MAP(CLK1=>CLK1hz,PASS_STATE_IN=>PASS_STATE,B_LIGHT=>BLIGHT, A_LIGHT=>ALIGHT, CNTOUT=>MCNT, STATEOUT=>MSTATE);U2: DISPLAY PORT MAP(CLK2=>CLK1khz,CNTIN=>MCNT,STATEIN=>MSTATE,LED7SOUT=>LED7S,SELOUT=>SEL);
END ARCHITECTURE behav;6.2 交通燈狀態轉換模塊源程序
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY STATE_CONTROL IS GENERIC(GREENA_CNT:INTEGER:=45;---主通道綠燈亮的時間45s
YELLOWA_CNT:INTEGER:=5;---主通道黃燈亮的時間5s
GREENB_CNT:INTEGER:=25;---支通道綠燈亮的時間25s
YELLOWB_CNT:INTEGER:=5);---支通道黃燈亮的時間5s PORT(CLK1 : IN STD_LOGIC;---1Hz時鐘信號輸入
PASS_STATE_IN : IN STD_LOGIC_VECTOR(1 DOWNTO 0);---主支通道的通車情況,低位為支通道高位為主通道,0為無車1為有車
A_LIGHT : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);---主干道紅綠黃燈控制信號 B_LIGHT : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);---支干道紅綠黃燈控制信號 CNTOUT : OUT STD_LOGIC_VECTOR(5 DOWNTO 0);---已計數時間輸出 STATEOUT : OUT STD_LOGIC_VECTOR(1 DOWNTO 0)---剩余時間輸出顯示);END ENTITY STATE_CONTROL;
ARCHITECTURE behav OF STATE_CONTROL IS TYPE STATES IS(ST0,ST1,ST2,ST3);---4個狀態分別為【主綠支紅45s、主黃支紅5s、支綠主紅25s、支黃主紅5s、】
SIGNAL STATE : STATES:=ST0;---初始化狀態為狀態0 SIGNAL CNT_EN : STD_LOGIC:='0';---計數使能控制信號,初始不計數
SIGNAL CNT : STD_LOGIC_VECTOR(5 DOWNTO 0):=“000001”;---因為初始不計數,但已過一個周期,所以初值為1 BEGIN
PROCESS(CLK1)BEGIN IF CLK1'EVENT AND CLK1 = '0' THEN
IF(CNT_EN='1')THEN---計數模塊
CNT<=CNT+1;ELSE
CNT<=“000001”;---若溢出則計數使能為0,CNT重新賦值為1 END IF;CASE STATE IS---狀態循環控制模塊 WHEN ST0 => IF(CNT=GREENA_CNT)THEN---主綠支紅若計數滿45s則根據主支通道的通車情況決定轉入下一個狀態
CASE PASS_STATE_IN IS
WHEN “00” => STATE<=ST0;
WHEN “01” => STATE<=ST1;
WHEN “10” => STATE<=ST0;
WHEN “11” => STATE<=ST1;
WHEN OTHERS => NULL;
END CASE;ELSE
STATE<=ST0;---若計數未滿則為原來狀態
END IF;WHEN ST1 =>---主黃支紅若計數滿5s則根據主支通道的通車情況決定轉入下一個狀態
IF(CNT=YELLOWA_CNT)THEN
CASE PASS_STATE_IN IS
WHEN “00” => STATE<=ST2;
WHEN “01” => STATE<=ST2;
WHEN “10” => STATE<=ST2;
WHEN “11” => STATE<=ST2;
WHEN OTHERS => NULL;
END CASE;ELSE
STATE<=ST1;---若計數未滿則為原來狀態 END IF;WHEN ST2 =>---支綠主紅若計數滿25s則根據主支通道的通車情況決定轉入下一個狀態
IF(CNT=GREENB_CNT)THEN
CASE PASS_STATE_IN IS
WHEN “00” => STATE<=ST3;
WHEN “01” => STATE<=ST2;
WHEN “10” => STATE<=ST3;
WHEN “11” => STATE<=ST3;
WHEN OTHERS => NULL;
END CASE;ELSE
STATE<=ST2;---若計數未滿則為原來狀態
END IF;
WHEN ST3 =>---支黃主紅若計數滿5s則根據主支通道的通車情況決定轉入下一個狀態
IF(CNT=YELLOWA_CNT)THEN
CASE PASS_STATE_IN IS
WHEN “00” => STATE<=ST0;
WHEN “01” => STATE<=ST0;
WHEN “10” => STATE<=ST0;
WHEN “11” => STATE<=ST0;
WHEN OTHERS => NULL;
END CASE;ELSE
STATE<=ST3;---若計數未滿則為原來狀態
END IF;END CASE;END IF;CNTOUT<=CNT;END PROCESS;
PROCESS(STATE)BEGIN CASE STATE IS WHEN ST0 =>---狀態0時主綠支紅
A_LIGHT<=“010”;B_LIGHT<=“100”;CNT_EN<='1';STATEOUT<=“00”;---將當前狀態傳遞給數碼管顯示模塊,以供后續使用 IF(CNT=GREENA_CNT)THEN CNT_EN<='0';END IF;
WHEN ST1 =>---狀態1時主黃支紅
A_LIGHT<=“001”;B_LIGHT<=“100”;CNT_EN<='1';STATEOUT<=“01”;---將當前狀態傳遞給數碼管顯示模塊,以供后續使用 IF(CNT=YELLOWA_CNT)THEN CNT_EN<='0';END IF;
WHEN ST2 =>---狀態2時支綠主紅
A_LIGHT<=“100”;B_LIGHT<=“010”;CNT_EN<='1';STATEOUT<=“10”;---將當前狀態傳遞給數碼管顯示模塊,以供后續使用 IF(CNT=GREENB_CNT)THEN CNT_EN<='0';END IF;
WHEN ST3 =>---狀態3時支黃主紅
A_LIGHT<=“100”;B_LIGHT<=“001”;CNT_EN<='1';STATEOUT<=“11”;---將當前狀態傳遞給數碼管顯示模塊,以供后續使用 IF(CNT=YELLOWB_CNT)THEN CNT_EN<='0';END IF;
END CASE;END PROCESS;END behav;6.3 數碼管顯示倒計時源程序
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DISPLAY IS PORT(CLK2 : IN STD_LOGIC;---時鐘輸入
CNTIN : IN STD_LOGIC_VECTOR(5 DOWNTO 0);---已計數輸入,來自狀態控制模塊 STATEIN : IN STD_LOGIC_VECTOR(1 DOWNTO 0);---狀態輸入,來自狀態控制模塊 LED7SOUT : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);---數碼管段選信號輸出 SELOUT : OUT STD_LOGIC_VECTOR(2 DOWNTO 0)---數碼管位選信號輸出);END ENTITY DISPLAY;ARCHITECTURE behav OF DISPLAY IS BEGIN PROCESS(CLK2)VARIABLE BITSEL : STD_LOGIC_VECTOR(2 DOWNTO 0);BEGIN-----------------------------位選信號循環模塊----------------IF CLK2'EVENT AND CLK2='0' THEN CASE BITSEL IS WHEN “000” => BITSEL:=“001”;SELOUT<=“001”;WHEN “001” => BITSEL:=“010”;SELOUT<=“010”;WHEN “010” => BITSEL:=“011”;SELOUT<=“011”;WHEN “011” => BITSEL:=“000”;SELOUT<=“000”;WHEN OTHERS => NULL;END CASE;END IF;-------------------------動態顯示模塊-----------------CASE STATEIN IS WHEN “00” =>---主綠支紅狀態 OK CASE BITSEL IS WHEN “000” =>---主綠支紅狀態 點亮支干道十位數字 OK CASE CNTIN IS WHEN “000001” => LED7SOUT <= “1101101”;---01 50 WHEN “000010” => LED7SOUT <= “1100110”;---02 49 WHEN “000011” => LED7SOUT <= “1100110”;WHEN “000100” => LED7SOUT <= “1100110”;WHEN “000101” => LED7SOUT <= “1100110”;WHEN “000110” => LED7SOUT <= “1100110”;---06 45 WHEN “000111” => LED7SOUT <= “1100110”;WHEN “001000” => LED7SOUT <= “1100110”;WHEN “001001” => LED7SOUT <= “1100110”;WHEN “001010” => LED7SOUT <= “1100110”;WHEN “001011” => LED7SOUT <= “1100110”;---11 40 WHEN “001100” => LED7SOUT <= “1001111”;WHEN “001101” => LED7SOUT <= “1001111”;WHEN “001110” => LED7SOUT <= “1001111”;WHEN “001111” => LED7SOUT <= “1001111”;WHEN “010000” => LED7SOUT <= “1001111”;---16 35 WHEN “010001” => LED7SOUT <= “1001111”;WHEN “010010” => LED7SOUT <= “1001111”;WHEN “010011” => LED7SOUT <= “1001111”;WHEN “010100” => LED7SOUT <= “1001111”;WHEN “010101” => LED7SOUT <= “1001111”;---21 30 WHEN “010110” => LED7SOUT <= “1011011”;WHEN “010111” => LED7SOUT <= “1011011”;WHEN “011000” => LED7SOUT <= “1011011”;WHEN “011001” => LED7SOUT <= “1011011”;WHEN “011010” => LED7SOUT <= “1011011”;---26 25 WHEN “011011” => LED7SOUT <= “1011011”;WHEN “011100” => LED7SOUT <= “1011011”;WHEN “011101” => LED7SOUT <= “1011011”;WHEN “011110” => LED7SOUT <= “1011011”;WHEN “011111” => LED7SOUT <= “1011011”;---31 20 WHEN “100000” => LED7SOUT <= “0000110”;WHEN “100001” => LED7SOUT <= “0000110”;WHEN “100010” => LED7SOUT <= “0000110”;WHEN “100011” => LED7SOUT <= “0000110”;WHEN “100100” => LED7SOUT <= “0000110”;---36 15 WHEN “100101” => LED7SOUT <= “0000110”;WHEN “100110” => LED7SOUT <= “0000110”;WHEN “100111” => LED7SOUT <= “0000110”;WHEN “101000” => LED7SOUT <= “0000110”;WHEN “101001” => LED7SOUT <= “0000110”;---41 10 WHEN “101010” => LED7SOUT <= “0111111”;WHEN “101011” => LED7SOUT <= “0111111”;WHEN “101100” => LED7SOUT <= “0111111”;WHEN “101101” => LED7SOUT <= “0111111”;---45 06 WHEN OTHERS => NULL;END CASE;WHEN “001” =>---主綠支紅狀態 點亮支干道個位數字 OK CASE CNTIN IS WHEN “000001” => LED7SOUT <= “0111111”;---01 50 WHEN “000010” => LED7SOUT <= “1101111”;---02 49 WHEN “000011” => LED7SOUT <= “1111111”;WHEN “000100” => LED7SOUT <= “0000111”;WHEN “000101” => LED7SOUT <= “1111101”;WHEN “000110” => LED7SOUT <= “1101101”;WHEN “000111” => LED7SOUT <= “1100110”;---07 44 WHEN “001000” => LED7SOUT <= “1001111”;WHEN “001001” => LED7SOUT <= “1011011”;WHEN “001010” => LED7SOUT <= “0000110”;WHEN “001011” => LED7SOUT <= “0111111”;WHEN “001100” => LED7SOUT <= “1101111”;---12 39 WHEN “001101” => LED7SOUT <= “1111111”;WHEN “001110” => LED7SOUT <= “0000111”;WHEN “001111” => LED7SOUT <= “1111101”;WHEN “010000” => LED7SOUT <= “1101101”;WHEN “010001” => LED7SOUT <= “1100110”;---17 34 WHEN “010010” => LED7SOUT <= “1001111”;WHEN “010011” => LED7SOUT <= “1011011”;WHEN “010100” => LED7SOUT <= “0000110”;WHEN “010101” => LED7SOUT <= “0111111”;WHEN “010110” => LED7SOUT <= “1101111”;---22 29 WHEN “010111” => LED7SOUT <= “1111111”;WHEN “011000” => LED7SOUT <= “0000111”;WHEN “011001” => LED7SOUT <= “1111101”;WHEN “011010” => LED7SOUT <= “1101101”;WHEN “011011” => LED7SOUT <= “1100110”;---27 24 WHEN “011100” => LED7SOUT <= “1001111”;WHEN “011101” => LED7SOUT <= “1011011”;WHEN “011110” => LED7SOUT <= “0000110”;WHEN “011111” => LED7SOUT <= “0111111”;WHEN “100000” => LED7SOUT <= “1101111”;---32 19 WHEN “100001” => LED7SOUT <= “1111111”;WHEN “100010” => LED7SOUT <= “0000111”;WHEN “100011” => LED7SOUT <= “1111101”;WHEN “100100” => LED7SOUT <= “1101101”;WHEN “100101” => LED7SOUT <= “1100110”;---37 14 WHEN “100110” => LED7SOUT <= “1001111”;WHEN “100111” => LED7SOUT <= “1011011”;WHEN “101000” => LED7SOUT <= “0000110”;WHEN “101001” => LED7SOUT <= “0111111”;---41 09 WHEN “101010” => LED7SOUT <= “1101111”;WHEN “101011” => LED7SOUT <= “1111111”;WHEN “101100” => LED7SOUT <= “0000111”;WHEN “101101” => LED7SOUT <= “1111101”;---45 06 WHEN OTHERS => NULL;END CASE;WHEN “010” =>---主綠支紅狀態 點亮主干道十位數字 OK CASE CNTIN IS WHEN “000000” => LED7SOUT <= “1111101”;---00 46 WHEN “000001” => LED7SOUT <= “1100110”;WHEN “000010” => LED7SOUT <= “1100110”;WHEN “000011” => LED7SOUT <= “1100110”;WHEN “000100” => LED7SOUT <= “1100110”;WHEN “000101” => LED7SOUT <= “1100110”;---05 41 WHEN “000110” => LED7SOUT <= “1100110”;WHEN “000111” => LED7SOUT <= “1001111”;WHEN “001000” => LED7SOUT <= “1001111”;WHEN “001001” => LED7SOUT <= “1001111”;WHEN “001010” => LED7SOUT <= “1001111”;---10 36 WHEN “001011” => LED7SOUT <= “1001111”;WHEN “001100” => LED7SOUT <= “1001111”;WHEN “001101” => LED7SOUT <= “1001111”;WHEN “001110” => LED7SOUT <= “1001111”;WHEN “001111” => LED7SOUT <= “1001111”;---15 31 WHEN “010000” => LED7SOUT <= “1001111”;WHEN “010001” => LED7SOUT <= “1011011”;WHEN “010010” => LED7SOUT <= “1011011”;WHEN “010011” => LED7SOUT <= “1011011”;WHEN “010100” => LED7SOUT <= “1011011”;---20 26 WHEN “010101” => LED7SOUT <= “1011011”;WHEN “010110” => LED7SOUT <= “1011011”;WHEN “010111” => LED7SOUT <= “1011011”;WHEN “011000” => LED7SOUT <= “1011011”;WHEN “011001” => LED7SOUT <= “1011011”;---25 21 WHEN “011010” => LED7SOUT <= “1011011”;WHEN “011011” => LED7SOUT <= “0000110”;WHEN “011100” => LED7SOUT <= “0000110”;WHEN “011101” => LED7SOUT <= “0000110”;WHEN “011110” => LED7SOUT <= “0000110”;---30 16 WHEN “011111” => LED7SOUT <= “0000110”;WHEN “100000” => LED7SOUT <= “0000110”;WHEN “100001” => LED7SOUT <= “0000110”;WHEN “100010” => LED7SOUT <= “0000110”;WHEN “100011” => LED7SOUT <= “0000110”;---35 11 WHEN “100100” => LED7SOUT <= “0000110”;---36 10 WHEN “100101” => LED7SOUT <= “0111111”;WHEN “100110” => LED7SOUT <= “0111111”;WHEN “100111” => LED7SOUT <= “0111111”;WHEN “101000” => LED7SOUT <= “0111111”;WHEN “101001” => LED7SOUT <= “0111111”;WHEN “101010” => LED7SOUT <= “0111111”;WHEN “101011” => LED7SOUT <= “0111111”;WHEN “101100” => LED7SOUT <= “0111111”;WHEN “101101” => LED7SOUT <= “0111111”;---45 01 WHEN OTHERS => NULL;END CASE;WHEN “011” =>---主綠支紅狀態 點亮主干道個位數字 OK CASE CNTIN IS WHEN “000000” => LED7SOUT <= “1111101”;---00 46 WHEN “000001” => LED7SOUT <= “1101101”;---01 45 WHEN “000010” => LED7SOUT <= “1100110”;WHEN “000011” => LED7SOUT <= “1001111”;WHEN “000100” => LED7SOUT <= “1011011”;WHEN “000101” => LED7SOUT <= “0000110”;WHEN “000110” => LED7SOUT <= “0111111”;---06 40 WHEN “000111” => LED7SOUT <= “1101111”;WHEN “001000” => LED7SOUT <= “1111111”;WHEN “001001” => LED7SOUT <= “0000111”;WHEN “001010” => LED7SOUT <= “1111101”;WHEN “001011” => LED7SOUT <= “1101101”;---11 35 WHEN “001100” => LED7SOUT <= “1100110”;WHEN “001101” => LED7SOUT <= “1001111”;WHEN “001110” => LED7SOUT <= “1011011”;WHEN “001111” => LED7SOUT <= “0000110”;WHEN “010000” => LED7SOUT <= “0111111”;---16 30 WHEN “010001” => LED7SOUT <= “1101111”;WHEN “010010” => LED7SOUT <= “1111111”;WHEN “010011” => LED7SOUT <= “0000111”;WHEN “010100” => LED7SOUT <= “1111101”;WHEN “010101” => LED7SOUT <= “1101101”;---21 25 WHEN “010110” => LED7SOUT <= “1100110”;WHEN “010111” => LED7SOUT <= “1001111”;WHEN “011000” => LED7SOUT <= “1011011”;WHEN “011001” => LED7SOUT <= “0000110”;WHEN “011010” => LED7SOUT <= “0111111”;---26 20 WHEN “011011” => LED7SOUT <= “1101111”;WHEN “011100” => LED7SOUT <= “1111111”;WHEN “011101” => LED7SOUT <= “0000111”;WHEN “011110” => LED7SOUT <= “1111101”;WHEN “011111” => LED7SOUT <= “1101101”;---31 15 WHEN “100000” => LED7SOUT <= “1100110”;WHEN “100001” => LED7SOUT <= “1001111”;WHEN “100010” => LED7SOUT <= “1011011”;WHEN “100011” => LED7SOUT <= “0000110”;WHEN “100100” => LED7SOUT <= “0111111”;---35 10 WHEN “100101” => LED7SOUT <= “1101111”;WHEN “100110” => LED7SOUT <= “1111111”;WHEN “100111” => LED7SOUT <= “0000111”;WHEN “101000” => LED7SOUT <= “1111101”;WHEN “101001” => LED7SOUT <= “1101101”;WHEN “101010” => LED7SOUT <= “1100110”;WHEN “101011” => LED7SOUT <= “1001111”;WHEN “101100” => LED7SOUT <= “1011011”;WHEN “101101” => LED7SOUT <= “0000110”;---45 01 WHEN OTHERS => NULL;END CASE;
WHEN OTHERS => NULL;END CASE;-----------WHEN “01” =>---主黃支紅狀態 OK CASE BITSEL IS WHEN “000” =>---主黃支紅狀態 點亮支干道十位數字 CASE CNTIN IS WHEN “000001” => LED7SOUT <= “0111111”;WHEN “000010” => LED7SOUT <= “0111111”;WHEN “000011” => LED7SOUT <= “0111111”;WHEN “000100” => LED7SOUT <= “0111111”;WHEN “000101” => LED7SOUT <= “0111111”;WHEN OTHERS => NULL;END CASE;WHEN “001” =>---主黃支紅狀態 點亮支干道個位數字 CASE CNTIN IS WHEN “000001” => LED7SOUT <= “1101101”;WHEN “000010” => LED7SOUT <= “1100110”;WHEN “000011” => LED7SOUT <= “1001111”;WHEN “000100” => LED7SOUT <= “1011011”;WHEN “000101” => LED7SOUT <= “0000110”;WHEN OTHERS => NULL;END CASE;WHEN “010”=>---主黃支紅狀態 點亮主干道十位數字 CASE CNTIN IS WHEN “000001” => LED7SOUT <= “0111111”;WHEN “000010” => LED7SOUT <= “0111111”;WHEN “000011” => LED7SOUT <= “0111111”;WHEN “000100” => LED7SOUT <= “0111111”;WHEN “000101” => LED7SOUT <= “0111111”;WHEN OTHERS => NULL;END CASE;WHEN“011” =>---主黃支紅狀態 點亮主干道個位數字 CASE CNTIN IS WHEN “000001” => LED7SOUT <= “1101101”;WHEN “000010” => LED7SOUT <= “1100110”;WHEN “000011” => LED7SOUT <= “1001111”;WHEN “000100” => LED7SOUT <= “1011011”;WHEN “000101” => LED7SOUT <= “0000110”;WHEN OTHERS => NULL;END CASE;WHEN OTHERS => NULL;END CASE;-----------------------WHEN “10” =>---支綠主紅狀態 OK CASE BITSEL IS WHEN “000” =>---支綠主紅狀態 點亮支干道十位數字 OK CASE CNTIN IS WHEN “000001” => LED7SOUT <= “1011011”;---01 25 WHEN “000010” => LED7SOUT <= “1011011”;WHEN “000011” => LED7SOUT <= “1011011”;WHEN “000100” => LED7SOUT <= “1011011”;WHEN “000101” => LED7SOUT <= “1011011”;WHEN “000110” => LED7SOUT <= “1011011”;---06 20 WHEN “000111” => LED7SOUT <= “0000110”;WHEN “001000” => LED7SOUT <= “0000110”;WHEN “001001” => LED7SOUT <= “0000110”;WHEN “001010” => LED7SOUT <= “0000110”;WHEN “001011” => LED7SOUT <= “0000110”;---11 15 WHEN “001100” => LED7SOUT <= “0000110”;WHEN “001101” => LED7SOUT <= “0000110”;WHEN “001110” => LED7SOUT <= “0000110”;WHEN “001111” => LED7SOUT <= “0000110”;WHEN “010000” => LED7SOUT <= “0000110”;---16 10 WHEN “010001” => LED7SOUT <= “0111111”;WHEN “010010” => LED7SOUT <= “0111111”;WHEN “010011” => LED7SOUT <= “0111111”;WHEN “010100” => LED7SOUT <= “0111111”;WHEN “010101” => LED7SOUT <= “0111111”;---21 05 WHEN “010110” => LED7SOUT <= “0111111”;WHEN “010111” => LED7SOUT <= “0111111”;WHEN “011000” => LED7SOUT <= “0111111”;WHEN “011001” => LED7SOUT <= “0111111”;---25 01 WHEN OTHERS => NULL;END CASE;WHEN “001” =>---支綠主紅狀態 點亮支干道個位數字 OK CASE CNTIN IS WHEN “000001” => LED7SOUT <= “1101101”;---01 25 WHEN “000010” => LED7SOUT <= “1100110”;WHEN “000011” => LED7SOUT <= “1001111”;WHEN “000100” => LED7SOUT <= “1011011”;WHEN “000101” => LED7SOUT <= “0000110”;WHEN “000110” => LED7SOUT <= “0111111”;---06 20 WHEN “000111” => LED7SOUT <= “1101111”;WHEN “001000” => LED7SOUT <= “1111111”;WHEN “001001” => LED7SOUT <= “0000111”;WHEN “001010” => LED7SOUT <= “1111101”;WHEN “001011” => LED7SOUT <= “1101101”;---11 15 WHEN “001100” => LED7SOUT <= “1100110”;WHEN “001101” => LED7SOUT <= “1001111”;WHEN “001110” => LED7SOUT <= “1011011”;WHEN “001111” => LED7SOUT <= “0000110”;WHEN “010000” => LED7SOUT <= “0111111”;---16 10 WHEN “010001” => LED7SOUT <= “1101111”;WHEN “010010” => LED7SOUT <= “1111111”;WHEN “010011” => LED7SOUT <= “0000111”;WHEN “010100” => LED7SOUT <= “1111101”;WHEN “010101” => LED7SOUT <= “1101101”;---21 05 WHEN “010110” => LED7SOUT <= “1100110”;WHEN “010111” => LED7SOUT <= “1001111”;WHEN “011000” => LED7SOUT <= “1011011”;WHEN “011001” => LED7SOUT <= “0000110”;---25 01 WHEN OTHERS => NULL;END CASE;WHEN “010” =>---支綠主紅狀態 點亮主干道十位數字 OK CASE CNTIN IS WHEN “000001” => LED7SOUT <= “1001111”;---01 30 WHEN “000010” => LED7SOUT <= “1011011”;---02 29 WHEN “000011” => LED7SOUT <= “1011011”;WHEN “000100” => LED7SOUT <= “1011011”;WHEN “000101” => LED7SOUT <= “1011011”;WHEN “000110” => LED7SOUT <= “1011011”;---06 25 WHEN “000111” => LED7SOUT <= “1011011”;WHEN “001000” => LED7SOUT <= “1011011”;WHEN “001001” => LED7SOUT <= “1011011”;WHEN “001010” => LED7SOUT <= “1011011”;WHEN “001011” => LED7SOUT <= “1011011”;---11 20 WHEN “001100” => LED7SOUT <= “0000110”;WHEN “001101” => LED7SOUT <= “0000110”;WHEN “001110” => LED7SOUT <= “0000110”;WHEN “001111” => LED7SOUT <= “0000110”;WHEN “010000” => LED7SOUT <= “0000110”;---16 15 WHEN “010001” => LED7SOUT <= “0000110”;WHEN “010010” => LED7SOUT <= “0000110”;WHEN “010011” => LED7SOUT <= “0000110”;WHEN “010100” => LED7SOUT <= “0000110”;WHEN “010101” => LED7SOUT <= “0000110”;---21 10 WHEN “010110” => LED7SOUT <= “0111111”;WHEN “010111” => LED7SOUT <= “0111111”;WHEN “011000” => LED7SOUT <= “0111111”;WHEN “011001” => LED7SOUT <= “0111111”;---25 06 WHEN OTHERS => NULL;END CASE;WHEN“011” =>---支綠主紅狀態 點亮主干道個位數字 OK CASE CNTIN IS WHEN “000001” => LED7SOUT <= “0111111”;---01 30 WHEN “000010” => LED7SOUT <= “1101111”;---02 29 WHEN “000011” => LED7SOUT <= “1111111”;WHEN “000100” => LED7SOUT <= “0000111”;WHEN “000101” => LED7SOUT <= “1111101”;WHEN “000110” => LED7SOUT <= “1101101”;WHEN “000111” => LED7SOUT <= “1100110”;---07 24 WHEN “001000” => LED7SOUT <= “1001111”;WHEN “001001” => LED7SOUT <= “1011011”;WHEN “001010” => LED7SOUT <= “0000110”;WHEN “001011” => LED7SOUT <= “0111111”;WHEN “001100” => LED7SOUT <= “1101111”;---12 19 WHEN “001101” => LED7SOUT <= “1111111”;WHEN “001110” => LED7SOUT <= “0000111”;WHEN “001111” => LED7SOUT <= “1111101”;WHEN “010000” => LED7SOUT <= “1101101”;WHEN “010001” => LED7SOUT <= “1100110”;---17 14 WHEN “010010” => LED7SOUT <= “1001111”;WHEN “010011” => LED7SOUT <= “1011011”;WHEN “010100” => LED7SOUT <= “0000110”;WHEN “010101” => LED7SOUT <= “0111111”;WHEN “010110” => LED7SOUT <= “1101111”;---22 09 WHEN “010111” => LED7SOUT <= “1111111”;WHEN “011000” => LED7SOUT <= “0000111”;WHEN “011001” => LED7SOUT <= “1111101”;---25 06 WHEN OTHERS => NULL;END CASE;
WHEN OTHERS => NULL;END CASE;------------
WHEN “11” =>---支黃主紅狀態 OK CASE BITSEL IS WHEN “000” =>---支黃主紅狀態 點亮支干道十位數字 CASE CNTIN IS WHEN “000001” => LED7SOUT <= “0111111”;WHEN “000010” => LED7SOUT <= “0111111”;WHEN “000011” => LED7SOUT <= “0111111”;WHEN “000100” => LED7SOUT <= “0111111”;WHEN “000101” => LED7SOUT <= “0111111”;WHEN OTHERS => NULL;END CASE;WHEN “001” =>---支黃主紅狀態 點亮支干道個位數字 CASE CNTIN IS WHEN “000001” => LED7SOUT <= “1101101”;WHEN “000010” => LED7SOUT <= “1100110”;WHEN “000011” => LED7SOUT <= “1001111”;WHEN “000100” => LED7SOUT <= “1011011”;WHEN “000101” => LED7SOUT <= “0000110”;WHEN OTHERS => NULL;END CASE;WHEN “010” =>---支黃主紅狀態 點亮主干道十位數字 CASE CNTIN IS WHEN “000001” => LED7SOUT <= “0111111”;WHEN “000010” => LED7SOUT <= “0111111”;WHEN “000011” => LED7SOUT <= “0111111”;WHEN “000100” => LED7SOUT <= “0111111”;WHEN “000101” => LED7SOUT <= “0111111”;WHEN OTHERS => NULL;END CASE;WHEN “011” =>---支黃主紅狀態 點亮主干道個位數字 CASE CNTIN IS WHEN “000001” => LED7SOUT <= “1101101”;WHEN “000010” => LED7SOUT <= “1100110”;WHEN “000011” => LED7SOUT <= “1001111”;WHEN “000100” => LED7SOUT <= “1011011”;WHEN “000101” => LED7SOUT <= “0000110”;WHEN OTHERS => NULL;END CASE;
WHEN OTHERS => NULL;END CASE;
------------END CASE;END PROCESS;END behav;
第三篇:基于FPGA的智能交通燈
設計題目: 基于FPGA的交通燈控制系統設計
專 業:
學生姓名: 學 號:
起迄日期: 2014.8.22.--2014.9.22.指導教師: 教研室主任:
目錄
1.緒論..............................................................1 2.課題研究背景及意義................................................1 3.設計要求..........................................................1 4.設計方案..........................................................1 4.1方案比較....................................錯誤!未定義書簽。4.2 方案說明...................................錯誤!未定義書簽。5.VHDL語言介紹...................................錯誤!未定義書簽。6.系統仿真..........................................................3 6.1 系統電路框圖................................................4 6.2設計結果仿真.................................................4 7.心得體會..........................................................5 8.參考文獻..........................................................6 7.附件..............................................................6
摘要:針對現實中越來越嚴重的城市交通擁堵現象,提出了一種城市十字路口交通信號燈控制與FPGA實現的新方法。設計的智能交通控制系統利用對相向車道采用不同步的紅綠燈信號控制方法,能夠減少交通資源浪費,大幅提高十字路口的車輛通行效率。利用超高速硬件描述語言VHDL設計十字路口交通信號燈控制器,實現主干道和支干道的交通控制功能,并通過Quartus II完成綜合、仿真、進行管腳分配、繪出仿真波形及原理圖。
關鍵字:硬件描述語言VHDL;交通信號燈;智能控制
1.緒論
智能的交通燈指揮著人們和各種車輛的安全運行,實現紅、黃、綠燈的自動指揮是城鄉交通管理現代化的重要課題。在城鄉街道的十字交叉路口,為了保證交通秩序和行人的安全,一般在每條街道上各有一組紅、黃、綠交通信號燈,其中紅燈亮,表示該條道禁止通行;黃燈亮該條道路上未過停車線的停止通行,已過停車線的車輛繼續通行;綠燈亮,表示該條道路允許通行。交通燈自動控制十字路口兩組紅、黃、綠交通燈的狀態轉換,指揮各種車輛和行人安全通行。實現十字路口交通管理自動化。
DEA技術的發展和應用領域的擴大與深入,在電子信息,通信,自動,控制及計算機應用等領域的重要性日益突出,因此本論文研究基于FPGA的交通燈設計。FPGA中有大量實現組合邏輯的資源,可以完成較大規模的組合邏輯電路設計,而其中相當數量的存儲電路(觸發器)又可完成復雜的時序邏輯電路設計。通過使用各種EDA工具,用原理圖或硬件描述語言,可以很方便地將復雜的電路在FPGA中實現。像典型的數字系統分頻器,數字鐘,數字頻率計等等都可用FPGA完成。本文以QuartusII 軟件為開發平臺,通過VHDL硬件描述語言以及原理圖的輸入方式來設計交通燈。
2.課題研究背景及意義
隨著公路交通運輸的發展,交通擁擠、道路阻塞和交通事故頻繁發生等問題越來越嚴重地困擾著世界各大城市。相對于交通運輸工具的飛速發展,我國交通配套設施建設明顯滯后,道路安全網絡、道路標識、交通指揮中心仍然不足。單獨從車輛方面或道路方面考慮,均很難有效地解決交通問題。通過采用信息通信技術、電子技術以及其他科學技術把它們聯系起來,并實現智能化的交通控制才能解決根本問題,交通信息化需要融合科技力量才能使目前的交通問題得到改善。
在現代文明高速發展的社會,道路的高度發達使得整個社會進步的速度進一步的加快,交通燈的出現是社會發展的必然產物。交通燈在道路事業中占有舉足輕重的地位,它直接影響到公路以及市區內的通車質量。所以,智能交通燈的研究具有重大意義。
3.設計要求
主干道綠燈亮支干道紅燈亮時間是50秒,接下來黃燈閃爍5秒,此時主干道的綠燈和支干道的紅燈繼續亮;然后是主干道紅燈亮支干道綠燈亮,時間為20秒,再黃燈閃5秒同時主干道的紅燈和支干道的綠燈也繼續亮。
4.設計方案
首先根據系統的需要進行分析。系統要求主干道綠燈亮支干道紅燈亮時間是50秒,接下來黃燈閃爍5秒,此時主干道的綠燈和支干道的紅燈繼續亮,然后是 主干道紅燈亮支干道綠燈亮時間為20秒,再黃燈閃5秒同時主干道的紅燈和支干道的綠燈也繼續亮。
因此將整個系統分為計時模塊和控制模塊組成。計時模塊中秒模塊主要將50MHZ的時鐘進行分頻得到20ns的時鐘信號,再將信號50000000倍得到秒信號。控制模塊由交通燈控制模塊以及黃燈閃爍模塊構成。
Verilog HDL語言介紹 5.1 Verilog HDL特點
Verilog HDL語言不僅定義了語法,而且對每個語法結構都定義了清晰地模擬、仿真語義。使用這種語言編寫的模型可以方便地使用Verilog仿真器進行驗證。Verilog HDL從C語言繼承了多種操作符和結構。Verilog HDL提供了擴展的建模能力和擴展模塊。
Verilog HDL之所以成為和VHDL并駕齊驅的描述語言,以為它有如下特點:
(1)基本邏輯門,例如and、or和nand等都內置在語言中。
(2)用戶定義原語(UDP)創建的靈活性。用戶定義的原語既可以是組合邏輯原語,也可以是時序邏輯原語。
(3)開關級基本結構模型,例如pmos 和nmos等也被內置在語言中。(4)提供顯式語言結構指定設計中的端口到端口的時延及路徑時延和設計的時序檢查。
(5)可采用三種不同方式或混合方式對設計建模。這些方式包括:行為描述方式—使用過程化結構建模;數據流方式—使用連續賦值語句方式建模;結構化方式—使用門和模塊實例語句描述建模。
(6)Verilog HDL中有兩類數據類型:線網數據類型和寄存器數據類型。線網類型表示構件間的物理連線,而寄存器類型表示抽象的數據存儲元件。
(7)能夠描述層次設計,可使用模塊實例結構描述任何層次。設計能夠在多個層次上加以描述,從開關級、門級、寄存器傳送級(RTL)到算法級。
(8)設計的規模可以是任意的;語言不對設計的規模(大小)施加任何限制。Verilog HDL不再是某些公司的專有語言而是IEEE標準。人和機器都可閱讀Verilog 語言,因此它可作為EDA的工具和設計者之間的交互語言。
5.2Verilog HDL程序基本結構
模塊是Verilog HDL的基本描述單位,描述某個設計的功能或結構及與其他模塊通信的外部端口。一個模塊的基本語法如下:
module module_name//模塊名稱
(port_list);//輸入輸出信號列表//說明 reg//寄存器 wire//線網
parameter//參數 input//輸入信號 output//輸出信號 inout//輸入輸出信號 function//函數 task//任務 …//語句
Initial statement Always statement Module instantiation// Gate instantiation// UDP instantiation// Continuous assignment// Endmodule 說明部分用于定義不同的項,例如模塊描述中使用寄存器和參數、語句定義設計的功能和結構。說明部分和語句可以放置在模塊的任何地方,但是變量、寄存器、線網和參數等的說明部分必須在使用前出現。為了使模塊描述清晰和具有良好的可讀性,最好將所有的說明部分放在語句前。
6.系統仿真
本文的仿真是在QuartuslI上進行的。QuartuslI 是 Altera 提供的 FPGA/CPLD 開發集成環境,Altera 是世界上最大的可編程邏輯器件供應商之一。QimrtiisII在21世紀 初推出,是Altera前一代FPGA/CPLD集成開發環境MAX+plusII的更 新換代產品,其界面友好,使用便捷。QuartiisII提供了一種與結構 無關的設計環境,使設計者能方便地進行設計輸入、快速處理和器件 編程。
Altera的QuartusII提供了完整的多平臺設計環境,能滿足各 種特定設計的需要,也是單芯片可編程系統(SOPC)設計的綜合性環 境和SOPC開發的基本設計工具,并為Altera DSP開發包進行系統模 型設計提供了集成綜合環境。
QuartusII包括模塊化的編輯器。編輯器包括的功能模塊有分析 /綜合器、適配器、裝配器、時序分析器、設計輔助模塊、EDA網表 文件生成器、編輯數據接口等。可以通過選擇Start Compilation來運行所有的編輯器模塊,也可以選擇單獨運行各個模塊。
基于Quartus II的設計流程:
(1)建立工作庫文件夾和編輯設計文件(2)創建工程;(3)全程編譯工程;(4)時序仿真;(5)引腳鎖定;
(6)下載至硬件系統驗證。
6.1 系統電路框圖
系統整體電路設計采用原理圖輸入法,將各個模塊包括子模塊進行連接,得到系統的電路框圖如下圖所示。
圖三 系統整體電路圖
6.2設計結果仿真
利用Quartus II軟件對本設計的程序進行編譯,得到系統的仿真圖。
交通燈運行時時序仿真圖1
交通燈運行時時序仿真圖1
7.心得體會
在這次課程設計中,我再一次的體驗到了細心對一個編程者的重要性,和程序的規范性對于程序的重要性,這些平時我們忽略的問題,其實有時候關乎著我們編程的成功與否的。
在verilog語言中,我們必須注意其與C語言的異同,比如格式和變量定義,還有模塊的調用,和時鐘信號的應用。我覺得需要在以后多加練習,可以對以后的學習和工作帶來莫大的幫助。這次的
課程設計相對以前的較難,其實就是對我們的一次考核,也是一次考驗,它培養了學生綜合運用所學知識,發現,提出,分析和解決實際問題,鍛煉實踐能力的重要環節,是對我們實際工作能力的具體訓練和考察過程。然而從理論到實踐的轉化過程,我在做課程設計的近一個月時間里,有了更進一步的認識和了解,要想學知識要重在實踐,要通過不斷的實際操作才能更好地學習。
通過這次課程設計,我懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,從而提高自己的實際動手能力和獨立思考的能
力。在設計的過程中遇到問題,可以說得是困難重重,遇到了各種各樣的問題,同時在設計的過程中發現了自己的不足之處,對以前所學過的知解得不夠深刻,掌握得不夠牢固。實踐出真知,通過親自動手制作,使我們掌握的知識不再是紙上談兵。
8.參考文獻
(1)程云長.可編程邏輯器件與VHDL語言[M].北京:科學出版社,2005(2)黃智偉.全國大學生電子設計競賽系統設計[M].北京:北京航空航天大學出版社,2006(3)黃智偉.全國大學生電子設計競賽電路設計[M].北京:北京航空航天大學出版社,2006(4)黃智偉.全國大學生電子設計競賽 常用電路模塊制作[M].北京:北京航空航天大學出版社,2010(5)黃智偉等.基于NI multisim的電子電路計算機仿真設計與分析[M].北京:電子工業出版社,2007(6)黃智偉.印制電路板(PCB)設計技術與實踐[M].北京:電子工業出版社,2009(7)高吉祥等.電子技術基礎實驗與課程設計[M].北京:電子工業出版社,2002(8)潘松.EDA技術實用教程[M].科學出版社.2005
7.附件 原程序
`timescale 100ms / 1us //程序中的時間單位和仿真精度。module signal_led(clk, rst_n, traffic_signal_master_red, traffic_signal_master_green, traffic_signal_master_yellow, traffic_signal_slave_red, traffic_signal_slave_green, traffic_signal_slave_yellow);input clk;input rst_n;output reg
traffic_signal_master_red;// 交通信號燈主干道紅燈
output reg
traffic_signal_master_green;// 交通信號燈主干道綠燈
output reg
traffic_signal_master_yellow;// 交通信號燈主干道黃燈 output reg
traffic_signal_slave_red;// 交通信號燈次干道紅燈
output reg
traffic_signal_slave_green;// 交通信號燈次干道綠燈
output reg
traffic_signal_slave_yellow;// 交通信號燈次干道黃燈
reg signal_red_led;reg signal_green_led;reg signal_yellow_led;reg [31:0] traffic_signal_cnt;parameter
LED_ON
= 1'b0;// 1亮
parameter
LED_OFF
= 1'b1;// 0滅
parameter
TIME_CELL
= 32'd50000000;// 時間單元時間 = Time_cell * 20ns(50MHz主頻)parameter START = 32'd0;parameter MASTER_GREEN = TIME_CELL * 20;parameter MASTER_YELLOW_1 = TIME_CELL * 20 + TIME_CELL;parameter MASTER_YELLOW_2 = TIME_CELL * 20 + 2 * TIME_CELL;parameter MASTER_YELLOW_3 = TIME_CELL * 20 + 3 * TIME_CELL;parameter MASTER_YELLOW_4 = TIME_CELL * 20 + 4 * TIME_CELL;parameter MASTER_YELLOW_5 = TIME_CELL * 20 + 5 * TIME_CELL;parameter SLAVE_GREEN = TIME_CELL * 20 + 5 * TIME_CELL + TIME_CELL * 20;parameter SLAVE_YELLOW_1 = TIME_CELL * 20 + 5 * TIME_CELL + TIME_CELL * 20 + TIME_CELL;parameter SLAVE_YELLOW_2 = TIME_CELL * 20 + 5 * TIME_CELL + TIME_CELL * 20 + 2 * TIME_CELL;parameter SLAVE_YELLOW_3 = TIME_CELL * 20 + 5 * TIME_CELL + TIME_CELL * 20 + 3 * TIME_CELL;parameter SLAVE_YELLOW_4 = TIME_CELL * 20 + 5 * TIME_CELL + TIME_CELL * 20 + 4 * TIME_CELL;parameter TOTAL_TIME = TIME_CELL * 20 + 5 * TIME_CELL + TIME_CELL * 20 + 5 * TIME_CELL;
//******************************************************************* // 模塊名稱:時間計數種子 // 功能描述
//******************************************************************* always @(posedge clk or negedge rst_n)begin if(!rst_n)traffic_signal_cnt <= 32'h0;else if(traffic_signal_cnt == TOTAL_TIME)traffic_signal_cnt <= START;else traffic_signal_cnt <= traffic_signal_cnt+1;end //******************************************************************* // 模塊名稱:LED燈閃爍控制 // 功能描述
//******************************************************************* always @(posedge clk or negedge rst_n)begin if(!rst_n)
begin signal_red_led <= LED_OFF;signal_green_led <= LED_OFF;signal_yellow_led <= LED_OFF;end else begin case(traffic_signal_cnt)START
:
begin signal_red_led <= LED_OFF;signal_green_led <= LED_ON;signal_yellow_led <= LED_OFF;end MASTER_GREEN
:
begin signal_red_led <= LED_OFF;signal_green_led <= LED_ON;signal_yellow_led <= LED_ON;end MASTER_YELLOW_1 :
begin signal_red_led <= LED_OFF;signal_green_led <= LED_ON;signal_yellow_led <= LED_OFF;end MASTER_YELLOW_2 :
begin signal_red_led <= LED_OFF;signal_green_led <= LED_ON;signal_yellow_led <= LED_ON;end MASTER_YELLOW_3 :
begin signal_red_led <= LED_OFF;signal_green_led <= LED_ON;signal_yellow_led <= LED_OFF;end MASTER_YELLOW_4 :
begin signal_red_led <= LED_OFF;signal_green_led <= LED_ON;signal_yellow_led <= LED_ON;end MASTER_YELLOW_5 :
begin signal_red_led <= LED_ON;signal_green_led <= LED_OFF;signal_yellow_led <= LED_OFF;end SLAVE_GREEN
:
begin signal_red_led <= LED_ON;signal_green_led <= LED_OFF;signal_yellow_led <= LED_OFF;end SLAVE_YELLOW_1 :
begin signal_red_led <= LED_ON;signal_green_led <= LED_OFF;signal_yellow_led <= LED_ON;end SLAVE_YELLOW_2 :
begin signal_red_led <= LED_ON;signal_green_led <= LED_OFF;signal_yellow_led <= LED_OFF;end SLAVE_YELLOW_3 :
begin signal_red_led <= LED_ON;signal_green_led <= LED_OFF;signal_yellow_led <= LED_ON;end SLAVE_YELLOW_4 :
begin signal_red_led <= LED_ON;signal_green_led <= LED_OFF;signal_yellow_led <= LED_OFF;end endcase end end //******************************************************************* // 模塊名稱:主從LED輸出 // 功能描述:
//******************************************************************* always @(posedge clk or negedge rst_n)begin if(!rst_n)begin traffic_signal_master_red <= LED_OFF;traffic_signal_master_green <= LED_OFF;traffic_signal_master_yellow <= LED_OFF;traffic_signal_slave_red <= LED_OFF;traffic_signal_slave_green <= LED_OFF;traffic_signal_slave_yellow <= LED_OFF;end else begin traffic_signal_master_red <= signal_red_led;traffic_signal_master_green <= signal_green_led;traffic_signal_master_yellow <= signal_yellow_led;traffic_signal_slave_red <= ~signal_red_led;traffic_signal_slave_green <= ~signal_green_led;traffic_signal_slave_yellow <= signal_yellow_led;end end endmodule
第四篇:基于FPGA的交通燈控制器設計
數字系統課程設計
基于FPGA的交通控制燈設計
姓名:
學號:
班級:
摘要
隨著社會的發展,城市規模的不斷擴大,城市交通成為制約城市發展的一大因素。人口和汽車日益增長,市區交通也日益擁擠,人們的安全問題當然也日益重要。因此,紅綠交通信號燈成為交管部門管理交通的重要工具之一。有了交通燈,人們的安全出行也有了很大的保障。自從交通燈誕生以來,其內部的電路控制系統就不斷的被改進,設計方法也開始多種多樣,從而使交通燈顯得更加智能化。尤其是近幾年來,隨著電子與計算機技術的飛速發展,電子電路分析和設計方法有了很大的改進,電子設計自動化也已經成為現代電子系統中不可或缺的工具和手段,這些都為交通燈控制系統的設計提供了一定的技術基礎。本課程設計運用erilog HDL語言描述交通控制器,通過狀態機計數法,實現設計所要求的交通燈控制及時間顯示,并最后進行了軟件實現,達到了系統要求的功能。
設計原理
1.1設計要求
設計一個交通控制器,用LED顯示燈表示交通狀態,并以7段數碼顯示器顯示當前狀態剩余秒數 主干道綠燈亮時,支干道紅燈亮;反之亦然,二者交替允許通行,主干道每次放行35s,支干道每次放行25s。每次由綠燈變為紅燈的過程中,亮光的黃燈作為過渡,黃燈的時間為5s。能進行特殊狀態顯示,特殊狀態時東西、南北路口均顯示紅燈狀態。用LED燈顯示倒計時,并且能實現總體清零功能,計數器由初始狀態開始計數,對應狀態的顯示燈亮。能實現特殊狀態的功能顯示,1.2設計思路和原理
本次設計是針對十字路口,進行南北和東西直行情況下交通燈控制。設定東西方向為主干道方向,根據交通燈的亮的規則,在初始狀態下四個方向的都為紅燈亮啟,進入正常工作狀態后,當主干道上綠燈亮時,支干道上紅燈亮,持續35S后,主干道和支干道上的黃燈都亮啟,持續5S后,主干道上紅燈亮啟,支干道上綠燈亮啟持續25S,之后主干道和支干道上的黃燈都亮啟5s,一個循環完成。循環往復的直行這個過程。其過程如下圖所示:
0s主干道方向25s綠燈亮30s紅燈亮黃燈亮65s支干道方向0s紅燈亮35s綠燈亮黃燈亮60s65s
圖1.交通燈點亮時間控制說明
1.3實現方法
本次采用文本編輯法,即利用Verilog HDL語言描述交通控制器,通過狀態機計數法,實現設計所要求的交通燈控制及時間顯示。設計中用兩組紅黃綠LED模擬兩個方向上的交通燈,用4個7段數碼管分別顯示兩個方向上的交通燈剩余時間,控制時鐘由試驗箱上頻率信號提供。
Verilog HDL程序設計
2.1整體設計
根據上章設計原理,交通燈控制的關鍵是各個狀態之間的轉換和進行適當的時間延時,根據狀態機的設計規范,本次設計了三個狀態之間的循環轉化,其真值表及狀態轉化圖如下所示:
狀狀00狀狀00狀狀10狀狀11狀狀01狀狀01狀狀11狀狀10狀狀狀狀狀狀狀狀狀狀001狀狀狀狀狀010狀狀狀狀狀100狀狀狀狀狀010狀狀狀狀狀狀狀狀狀狀100狀狀狀狀狀010狀狀狀狀狀001狀狀狀狀狀010
圖2.交通燈控制狀態轉化
說明:該狀態圖為交通燈在正常情況下的狀態轉化圖,進入控制后,狀態00時主干道綠燈及支干道紅燈亮起,進入狀態01后兩路黃燈亮起,狀態11時主干道紅燈及支干道綠燈亮起。進入10狀態兩路黃燈亮起。結束一個循環,從00狀態重新開始循環。
為實現控制與顯示的功能,需要設計交通燈點亮順序控制程序,倒數計時程序,七段數碼管顯示程序,數碼管顯示掃描程序,其系統結構圖如下所示:
holdrst狀狀狀狀1Hz狀狀狀狀狀狀狀狀狀狀狀狀狀狀狀狀狀狀狀clk1KHz狀狀狀狀狀狀狀1Hz狀狀狀狀狀狀狀狀狀狀狀狀狀狀狀狀狀狀狀狀狀 圖3.交通燈控制系統結構圖
其中rst為復位信號,clk為時鐘信號,hold為特殊情況控制信號,輸入hold時兩個方向紅燈無條件亮起。
2.2 具體設計
根據整體設計要求,編寫各個功能部分Verilog HDL程序,設置各輸入輸出變量說明如下 clk: 為計數時鐘; qclk:為掃描顯示時鐘;
en: 使能信號,為1 的話,則控制器開始工作; rst: 復位信號,為1的話,控制及技術回到初始狀態;
hoid:特殊情況控制信號,為1的話,則兩個方向無條件顯示為紅燈;
light1: 控制主干道方向四盞燈的亮滅;其中,light1[0]~light[2],分別控制主干道方向的 綠燈、黃燈和紅燈;
light2: 控制支干道方向四盞燈的亮滅;其中,light2[0] ~ light2[2],分別控制支干道方向的 綠燈、黃燈和紅燈;
num1: 用于主干道方向燈的時間顯示,8 位,可驅動兩個數碼管; num2: 用于支干道方向燈的時間顯示,8 位,可驅動兩個數碼管; counter:用于數碼管的譯碼輸出; st1,st2:數碼管掃描信號。輸入輸出及中間變量設置如下:
module traffic(en,clk,qclk,rst,rst1,hold,num1,num2,light1,light2,counter,st1,st2);input en,clk,qclk,rst,hold,rst1;output st1,st2;output[7:0] num1,num2;output[6:0]counter;output[2:0] light1,light2;reg tim1,tim2,st1,st2;reg[1:0]state1,state2,ste;reg[2:0]light1,light2;reg[3:0]num;reg[6:0]counter;reg[7:0] num1,num2;reg[7:0] red1,red2,green1,green2,yellow1,yellow2;
1.二極管點亮控制
該部分程序的作用是根據計數器的計數值控制發光二極管的亮、滅,以及輸出倒計時數值給七段數碼管的譯碼電路。此外,當檢測到特殊情況(hold=‘1’)發生時,無條件點亮紅燈的二極管,當檢測到復位信號,兩個方向計數與控制回復到00狀態。因為主、支干道兩個方向二極管點亮的順序與延遲時間不同,顧編寫兩個獨立的部分來控制,具體程序如下: 1)主干道方向 always @(posedge clk)begin
if(rst)//復位與特殊情況控制
begin light1<=3'b001;num1<=green1;end else if(hold)begin light1<=3'b100;num1<=green1;end else if(en)
begin //使能有效開始控制計數
if(!tim1)//
begin //主干道交通燈點亮控制
tim1<=1;
case(state1)
2'b00:begin num1<=green1;light1<=3'b001;state1<=2'b01;end
2'b01:begin num1<=yellow1;light1<=3'b010;state1<=2'b11;end
2'b11:begin num1<=red1;light1<=3'b100;state1<=2'b10;end
2'b10:begin num1<=yellow1;light1<=3'b010;state1<=2'b00;end
default:light1<=3'b100;
endcase
end 2)支干道方向
always @(posedge clk)begin
if(rst)//復位與特殊情況控制
begin
light2<=3'b100;
num2<=red2;
end
else if(hold)
begin
light2<=3'b100;
num2<=red2;
end
else if(en)
begin
if(!tim2)
begin
tim2<=1;
case(state1)
2'b00:begin num2<=red2;light2<=3'b100;state2<=2'b01;end
2'b01:begin num2<=yellow1;light2<=3'b010;state2<=2'b11;end
2'b11:begin num2<=green2;light2<=3'b001;state2<=2'b10;end
2'b10:begin num2<=yellow2;light2<=3'b010;state2<=2'b00;end
default:light2<=3'b100;
endcase
end
2.倒數計時
該部分程序完成二極管發光時延的計數,并將計數結果送到數碼管顯示電路,每切換到一個狀態,計數器的初值都被重置,以實現不同顏色二極管不同的時延要求。本次設計直接用邏輯運算完成2位十進制數的計數,未采用分位器的設計。因為主、支干道上計數器的結構完全相同,顧只列出一路的程序,其具體程序如下所示:
always @(posedge clk)begin else begin //倒數計時
if(num1>0)
if(num1[3:0]==0)
begin
num1[3:0]<=4'b1001;
num1[7:4]<=num1[7:4]-1;
end
else num1[3:0]<=num1[3:0]-1;
if(num1==1)tim1<=0;
end
end
else
begin
light1<=3'b010;
num1=2'b00;
tim1<=0;
end end
3.數碼管的譯碼及掃描顯示
該段程序主要完成4個7段數碼管的譯碼顯示及掃描,使系統能正常顯示主、支干道兩個方向上的剩余時間。譯碼的時鐘頻率要低,為Hz級。掃描的時鐘頻率要高,最低不得小于人眼分辨頻率50Hz,具體程序如下所示: always @(posedge qclk)begin //數碼管掃描
if(rst1)
begin
st1=0;
st2=0;
end else
begin
case({st2,st1})
2'b00:begin num<=num1[3:0];{st2,st1}<=2'b01;end
2'b01:begin num<=num1[7:4];{st2,st1}<=2'b10;end
2'b10:begin num<=num2[3:0];{st2,st1}<=2'b11;end
2'b11:begin num<=num2[7:4];{st2,st1}<=2'b00;end
endcase
end end always @(posedge qclk)begin //數碼管譯碼顯示 case(num)4'b0000: counter<=7'b0111111;//0 4'b0001: counter<=7'b0000110;//1 4'b0010: counter<=7'b1011011;//2 4'b0011: counter<=7'b1001111;//3 4'b0100: counter<=7'b1100110;//4 4'b0101: counter<=7'b1101101;//5 4'b0110: counter<=7'b1111101;//6 4'b0111: counter<=7'b0000111;//7 4'b1000: counter<=7'b1111111;//8 4'b1001: counter<=7'b1101111;//9 default: counter<=7'b0111111;//0 endcase end endmodule 總體程序見程序清單所示
仿真與硬件調試
3.1 波形仿真
在QuartursⅡ軟件下創建工程,新建編輯設計文件,將程序輸入,整體編譯后,新建波形仿真文件。設置仿真時間,時鐘周期,輸入輸出端口,進行波形仿真。具體仿真波形圖及說明如下所示: 仿真截止時間:100us; 時鐘:clk 1us,qclk 0.1us 1.正常工作時波形仿真圖
圖4.正常工作時波形仿真圖
圖形說明
波形仿真主要完成了控制與計數以及數碼管顯示的波形圖。en為低電品時,計數器置初值,高電平時開始正常控制與計數。控制發光二極管首次輸出為“light1=001,light2=100”,表示主干道路綠燈亮,支桿道路紅燈亮,計數器num1和num2從“00110101”開始遞減計數,計數至“00000000”時,進入下一個狀態,控制輸出量為light=010,light2=010,表示主、支干道黃燈均亮起,計數器num1和num2從“00000101”開始計數遞減,計數至”00000000”時進入下一個狀態,light=100,light2=001,表示主干道路紅燈亮,支桿道路綠燈亮。Counter根據num1,num2變化隨時鐘上升沿輸出譯碼后的數據。由于屏幕顯示大小有限,未仿真出一個完整周期。
2.特殊情況仿真波形
圖5.特殊情況仿真波形
圖形說明
當hold輸入高電平時,在時鐘上升沿的控制下,light 1與light2被強制置位為”100”,表示兩路紅燈均亮起
3.復位情況仿真波形
圖6.復位情況仿真波形
圖形說明
當rst輸入高電平時,在時鐘上升沿控制下,計數與控制都回到00狀態,即light1=001,light2=100,計數器num1和num2從“00110101”開始遞減計數。3.2 硬件調試
完成時序仿真確認無誤后,進行實驗箱管腳設置,注意設置完成后一定要再進行一次全局仿真,使程序真正對應于硬件輸出輸出。具體連接說明如下所示
輸入變量:rst、clk、qclk、hold、en 其中en,hold,rst接”0-1”撥碼開關,以穩定的輸出可變化的電平。計數時鐘clk接實驗箱上1Hz時鐘,掃描顯示時鐘qclk接125Khz時鐘。
輸出變量:light1[2:0]、light2[2:0]、counter[6:0]、st1、st2 其中light1[0]、light2[0]分別接綠色的發光二極管;light1[1]、light2[1] 分別接黃色的發光二極管;light1[2]、light2[2]分別接紅色的發光二極管。counter[0]~counter[6],分別接七段數碼管的a~f,st1、st2分別接試驗箱上”4-16”譯碼器的低兩位。
完成接線后將程序燒寫到芯片上,開始功能調試。分辨改變使能信號,復位信號以及特殊情況信號,觀察數碼管以及發光二級管情況。
程序清單
module traffic(en,clk,qclk,rst,rst1,hold,num1,num2,light1,light2,counter,st1,st2);input en,clk,qclk,rst,hold,rst1;output st1,st2;output[7:0] num1,num2;output[6:0]counter;output[2:0] light1,light2;reg tim1,tim2,st1,st2;reg[1:0]state1,state2,ste;reg[2:0]light1,light2;reg[3:0]num;reg[6:0]counter;reg[7:0] num1,num2;reg[7:0] red1,red2,green1,green2,yellow1,yellow2;
always @(en)if(!en)begin //設置計數初值 green1<=8'b00110101;red1<=8'b00100101;yellow1<=8'b00000101;green2<=8'b00100101;red2<=8'b00110101;yellow2<=8'b00000101;end
always @(posedge clk)begin if(rst)//復位與特殊情況控制
begin
light1<=3'b001;num1<=green1;
end else if(hold)
begin
light1<=3'b100;
num1<=green1;
end
else if(en)
begin //使能有效開始控制計數
if(!tim1)//開始控制
begin //主干道交通燈點亮控制
tim1<=1;
case(state1)
2'b00:begin num1<=green1;light1<=3'b001;state1<=2'b01;end
2'b01:begin num1<=yellow1;light1<=3'b010;state1<=2'b11;end
2'b11:begin num1<=red1;light1<=3'b100;state1<=2'b10;end
2'b10:begin num1<=yellow1;light1<=3'b010;state1<=2'b00;end
default:light1<=3'b100;
endcase
end
else
begin //倒數計時
if(num1>0)
if(num1[3:0]==0)
begin
num1[3:0]<=4'b1001;
num1[7:4]<=num1[7:4]-1;
end
else num1[3:0]<=num1[3:0]-1;
if(num1==1)tim1<=0;
end
end
else
begin
light1<=3'b010;
num1=2'b00;
tim1<=0;
end
end
always @(posedge clk)begin
if(rst)//復位與特殊情況控制
begin
light2<=3'b100;
num2<=red2;
end
else if(hold)
begin
light2<=3'b100;
num2<=red2;
end
else if(en)
begin
if(!tim2)
begin
tim2<=1;
case(state1)
2'b00:begin num2<=red2;light2<=3'b100;state2<=2'b01;end
2'b01:begin num2<=yellow1;light2<=3'b010;state2<=2'b11;end
2'b11:begin num2<=green2;light2<=3'b001;state2<=2'b10;end
2'b10:begin num2<=yellow2;light2<=3'b010;state2<=2'b00;end
default:light2<=3'b100;
endcase
end
else
begin //倒數計時
if(num2>0)
if(num2[3:0]==0)
begin
num2[3:0]<=4'b1001;
num2[7:4]<=num2[7:4]-1;
end
else num2[3:0]<=num2[3:0]-1;
if(num2==1)tim2<=0;
end
end
else
begin
tim2<=0;
state2<=2'b00;
light2<=3'b010;
end
end
always @(posedge qclk)begin //數碼管掃描
if(rst1)
begin
st1=0;
st2=0;
end else
begin
case({st2,st1})
2'b00:begin num<=num1[3:0];{st2,st1}<=2'b01;end
2'b01:begin num<=num1[7:4];{st2,st1}<=2'b10;end
2'b10:begin num<=num2[3:0];{st2,st1}<=2'b11;end
2'b11:begin num<=num2[7:4];{st2,st1}<=2'b00;end
endcase
end end always @(posedge qclk)begin //數碼管譯碼顯示 case(num)4'b0000: counter<=7'b0111111;//0 4'b0001: counter<=7'b0000110;//1 4'b0010: counter<=7'b1011011;//2 4'b0011: counter<=7'b1001111;//3 4'b0100: counter<=7'b1100110;//4 4'b0101: counter<=7'b1101101;//5 4'b0110: counter<=7'b1111101;//6 4'b0111: counter<=7'b0000111;//7 4'b1000: counter<=7'b1111111;//8 4'b1001: counter<=7'b1101111;//9 default: counter<=7'b0111111;//0 endcase end endmodule
總結
在設計中采用V erilog HDL語言設計交通燈控制系統, 借助其功能強大的語言結構, 簡明的代碼描述復雜控制邏輯設計, 與工藝無關特性, 在提高工作效率的同時達到求解目的, 并可以通過V erilog HDL 語言的綜合工具進行相應硬件電路生成, 具有傳統邏輯設計方法所無法比擬的優越性。
在設計過程中,覺得最難的部分是波形仿真部分,雖然程序編譯通過但仿真出不了正確的波形,不是計數器無法正常計數,就是控制輸出無法進入到下一個狀態,每次出現問題就必須返回重新修改程序。實踐證明,在編寫一個較復雜的程序時,一開始一定要畫流程圖,弄清楚各個功能及實現它們的邏輯算法,做到心中有數后在開始下筆寫編寫程序。在編寫的時候要尤其要注意語言的規范,如本次設計中編寫的V erilog在Quartus8.1中可以正常生成時序圖,而在低版本的軟件中卻無法生成,原因就是語言使用不規范,在解決這個問題時我總結了一些經驗,首先程序要邏輯清晰,簡潔明了,避免不必要的嵌套與條用,其次要適當地給程序加上注解文字,提高可讀性,以方便之后的程序出錯時進行查找,最后充分利用仿真軟件提供的各項編譯工具與報錯消息,按圖索驥,有方向的完成程序調試。
完成仿真后進行,進行試驗箱上的硬件調試,該步驟主要是要求細心,按照引腳清單,逐一完成連線,本次設計用到兩個時鐘輸入,注意一定要選擇合適頻率的時鐘,以便達到期望的效果。注意觀察實物的現象,看是否滿足設計要求,不滿足時檢查是硬件問題還是程序問題,如果是程序問題,在修改完之后必須要重新編譯,重新燒入。不斷排查錯誤,直至達到滿意的效果。
通過這次課程設計,熟悉了簡單EDA設計的整個流程,加深了對Verilog HDL硬件描述語言的理解,提高了動手能力,并且鍛煉了自己的耐心,收獲頗豐,我會把在本次課程設計中學到的東西應用到今后的工作學習中。
參考資料
[1] 夏宇聞.復雜數字電路與系統的V erilog HDL設計技術 [M ].北京: 北京航空航天大學出版社, 1998 [2] 郭梯云.移動通信[M ].西安: 西安電子科技大學出版社, 1995 [3] [法]M ichelMouly, M arie Bernadet te Pautet1GSM 數字移動通信系統[M ].駱健霞, 顧龍信, 徐云霄譯.北京: 電子工業出版社, 1996 [4] 張毅剛, 喬立巖.虛擬儀器軟件開發環境L abW indow s?CV I 610 編程指南[M ].北京: 機械工業出版社, 2002 [5] 劉國權.GSM 手機的測試[J ].中國無線電管理, 2003 [6] 俞定玖, 劉湘慧.GSM 數字蜂窩移動交換系統測試[J ].電信科學, 2000 [7] 張明.V erilog HDL 實用教程[M ].成都: 電子科技大學出版社, 1999 [8] Hyde D C.Bucknell Handbook on V erilog HDL 1Computer Science Department, Bucknell U niversity L ew is burg, 1995 [9] 康華光.電子技術基礎(數字部分)[M ].北京: 高等教育出版社, 1988
第五篇:基于FPGA的交通燈控制電路的設計
編號:
EDA技術
實訓(論文)說明書
題 目: 交通燈控制電路的設計 院(系): 信息與通信學院 專 業: 電子信息工程 學生姓名: 學 號: 指導教師:
2013年月日
桂林電子科技大學實訓說明書用紙
摘要
EDA工具對于電子設計人員來說極其重要,它可以在電子設計的各個階段、層次進行計算機模擬驗證,確保設計的準確性,可縮短設計周期,降低設計成本。交通燈可以實現十字路口紅綠燈的自動控制。基于FPGA的交通燈設計系統具有可靠性強、實時快速擦寫、運算速度高、故障率低、電路簡單,且體積小的特點。本設計采用的是Altera公司CycloneII系列的EP2C5T144芯片作為核心最小系統,它可以方便嵌入到實際的交通燈應用系統中,可以完成簡單的邏輯控制、數據采集、信號處理、數學計算等功能;使用QuartusII軟件作為開發平臺;采用自頂向下的設計思路對系統進行模塊化設計和綜合,并通過波形仿真和硬件實現兩種方式實現并驗證交通燈的功能。關鍵詞:交通燈、EDA、FPGA
桂林電子科技大學實訓說明書用紙
Abstract EDA tools for electronic design personnel is very important, it can be in the electronic design of each stage, levels of computer simulation verification, to ensure the accuracy of the design, can shorten the design cycle, reduce design cost.The traffic light can realize intersection traffic light automatic control.Based on the FPGA of traffic light design system has the reliability, real-time fast operation speed is high, integration.it, low failure rate, circuit is simple, and the characteristics of small volume.This design USES is Altera company CycloneII series of EP2C5T144 chip as the core minimum system, it can be convenient to the actual traffic lights embedded application system, can complete the simple logic control, data acquisition, signal processing, mathematical calculations, etc;Use QuartusII software as a development platform, Using the top-down design idea of system modular design and comprehensive, and through the waveform simulation and hardware realization two ways to realize and verify the function of the traffic lights.Key words: traffic lights;EDA;FPGA
桂林電子科技大學實訓說明書用紙
引言
“EDA技術”是一門實踐性和實用性都很強的課程,學習的目的在于應用。本設計實訓是配合“EDA技術”課堂教學的一個重要的實踐教學環節,在本課程設計指導書中列舉了一些常用的小型設計系統,旨在起到鞏固課堂和書本上所學知識,加強綜合能力,提高系統設計水平,啟發創新思想的效果。
1設計任務與要求
1.1本綜合設計實訓任務的內容和要求
① 用EDA實訓儀上的4只八段數碼管分別顯示道路東西和南北通行和禁止的倒計時時間。
② 能設置道路東西和南北兩側通行和禁止的倒計時時間,最大設置時間為99秒,最小設置時間為1秒。
③ 交通燈用紅、綠、黃三種發光二極管(LED)顯示控制的結果。④ 紅、綠、黃燈顯示的次序應符合實際交通道路控制的要求。系統概述及設計原理
2.1 系統的主要功能
交通燈控制電路是用于城市交通疏導的管理系統,它是現代城市交通監控指揮系統中最重要的組成部分。交通信號燈指揮著人和各種車輛的安全運行,實現紅、黃、綠燈的自動指揮是城鄉交通管理現代化的重要課題。在城鄉街道的十字交叉路口,為了保證交通秩序和行人安全,一般在每條道路上各有一組紅、黃、綠交通信號燈。交通燈控制電路自動控制十字路口兩組紅、黃、綠交通燈的狀態轉換,指揮各種車輛和行人安全通行,實現十字路口城鄉交通管理自動化。設計一個十字路口交通控制器,方向分為東南西北四個方向。東西方向的紅綠燈狀態一樣,南北方向的紅綠燈狀態一樣。每個方向上,有四盞燈,分別是左轉燈、紅燈、綠燈和黃燈。左拐燈亮表示左轉車輛可以通行;紅燈亮表示左轉和直行車輛禁行;綠燈亮表示直行車輛和右轉的車輛可以通行;黃燈亮表示左轉和直行的車輛即將禁行。
本論文簡要介紹了FPGA器件的特點和設計意義,以QuartusII軟件為開發平臺,通過VHDL硬件描述語言以及原理圖的輸入方式來設計交通燈。交通燈控制器用于自動控制十字路口交通燈和計時器。
系統的主要功能模塊方框圖如圖2-1所示
桂林電子科技大學實訓說明書用紙
圖2-1 系統主要功能模塊
2.2交通燈的設計原理
交通燈控制電路的原理框圖如圖1.3所示。其中,clkgen是分頻器,將EDA實訓儀主板提供的20MHz的主頻經20000000分頻后,得到電路所需的1Hz(秒)時鐘。Cnt10de(兩個)是十進制減法計數器,產生道路東西和南北通行和禁止的倒計時時間。Contr是控制電路,控制整個系統的工作。控制器接收倒計時的結果,當倒計時歸0時,改變電路的控制模式,輸出倒計時的初始時間和交通燈亮滅控制信號。
圖2-2 交通燈控制電路的原理圖 系統各個模塊的的設計與仿真
3.1 分頻器模塊的設計
由于采用的FPGA芯片的時鐘頻率是50MHz,需要將其分頻為1Hz。該模塊即是實現50M的分頻,將頻率變為1Hz的脈沖波,從而得到周期為1s的脈沖波。如果要真正的實現分頻50M,在仿真結果圖中是很難觀察的,甚至是沒有辦法驗證的,故在仿真過程中,將分頻的倍數變小,變為20分頻,這樣從圖中可容易的得到并驗證對時鐘輸入信號的20分頻,如圖3-1所示,Reset是復位信號,CLK_50MHz是輸入時鐘頻率,CLK_1Hz是
桂林電子科技大學實訓說明書用紙
輸出時鐘頻率,從圖中可以看出,輸出頻率CLK_1Hz確實是輸入時鐘頻率CLK_50MHz的20分頻。
圖3-1 分頻器仿真圖
3.2 狀態控制模塊的設計
狀態控制模塊根據輸入CLK_1Hz的脈沖信號輸出不同的STATUS值,下游的模塊依據STATUS的值來確定紅綠燈的狀態;于此同時對倒計時信號賦初值。在狀態控制模塊仿真圖中,輸入信號CLK是一個頻率為1Hz的時鐘脈沖信號,RESET是復位信號;輸出信號STATUS是狀態轉換信號,控制著下游交通信號燈顯示模塊的顯示情況;LOAD_EW、LOAD_SN是東西、南北方向倒計時開始控制信號,DJS_EW、DJS_SN是東西、南北方向倒計時間信號。其仿真結果圖如圖3-2所示,由圖可得,STATUS共有000(S1)、001(S2)、010(S3)、011(S4)、100(S5)、101(S6)共6個狀態,80s為紅燈和左轉燈的倒計時間,45s為綠燈的倒計時間,5s是黃燈的倒計時間,和狀態轉換表的狀態一致。
圖3-2 狀態控制模塊仿真圖
3.3 交通燈信號燈顯示模塊的設計
交通信號燈顯示模塊根據輸入的STATUS信號,輸出對應的紅綠黃燈信號,并直接驅動交通信號燈的亮滅。在交通燈信號燈顯示模塊程序仿真結果圖中,STATUS為輸入信號,而它依賴于狀態控制模塊產生的信號STATUS信號,一種六種狀態,依次為000(S1)、001(S2)、010(S3)、011(S4)、100(S5)、101(S6);EW_LRGY(8位)是東西方向上交通信號燈的狀態,SN_LRGY(8位)是南北方向上交通信號燈的狀態,依次為左轉、紅、綠、黃,對應著EW_LRGY、SN_LRGY的前四位,‘1’表示點亮,‘0’表示熄滅,后四位均為0,表示四個燈的陰極接負極。例如,在STATUS為001時,對應的是東西方向紅燈亮,南北方向綠燈亮,仿真結果符合預期,完全正確。其仿真圖如3-3所示:
圖3-3 信號燈顯示模塊仿真圖
桂林電子科技大學實訓說明書用紙
3.4東西方向倒計時模塊設計
東西方向倒計時模塊用來接收狀態控制模塊的輸出并作為初值,每檢測到一個CLK脈沖信號,就進行減一動作,最后把減一結果輸出。在該模塊仿真圖中,CLK為1Hz的輸入信號,LOAD_EW為計數器的裝載信號,當其為高電平時,將輸入信號DJS_EW_IN的值裝載到計數器中,并開始進行減一操作,每遇一個CLK脈沖,進行一次減一操作,并將結果輸出,由于輸入的時鐘頻率是1Hz,所以顯示的時間間隔是1s,與現實生活中的時間保持一致。其仿真結果如圖3-4所示,由圖可得,該模塊首先將80秒的倒計時信號裝載進去,并進行減一操作。
圖3-4 東西方向倒計時仿真圖
3.5 南北方向倒計時模塊設計
南北方向倒計時模塊用來接收狀態控制模塊的輸出并作為初值,每檢測到一個CLK脈沖信號,就進行減一動作,最后把減一結果輸出。在該模塊仿真圖中,CLK為1Hz的輸入信號,LOAD_SN為計數器的裝載信號,當其為高電平時,將輸入信號DJS_SN_IN的值裝載到計數器中,并開始進行減一操作,每遇一個CLK脈沖,進行一次減一操作,并將結果輸出,由于輸入的時鐘頻率是1Hz,所以顯示的時間間隔是1s,與現實生活中的時間保持一致。其仿真結果如圖3-5所示,由圖可得,該模塊將45秒的倒計時信號裝載進去,并進行減一操作。
圖3-5南北方向倒計時仿真圖
3.6 譯碼模塊設計
譯碼模塊程序用來將輸入的兩位倒計時數值,分解成兩個整形數值,以此供后面的譯碼顯示模塊譯碼顯示。在譯碼程序TO_8421_BCD模塊仿真圖中,DJS_EW_OUT,DJS_SN_OUT為上一倒計時模塊的輸出信號,其范圍在0~80,所有倒計時的范圍都包含其內;DJS_EW_OUT_SW,DJS_EW_OUT_GW,DJS_SN_OUT_SW,DJS_SN_OUT_GW為輸出信號,其范圍為0~9,代表了各個方向的倒計時的十位和個位,且數碼管所有顯示數字的范圍均在其內。例如圖中DJS_EW_OUT的值不斷變化,相應的依次將其分解為十位(DJS_EW_OUT_SW)和個位(DJS_EW_OUT_GW),并依次遞減,仿真結果符合預期,完全正確。仿真結果如圖3-6所示:
桂林電子科技大學實訓說明書用紙
圖3-6 譯碼仿真結果圖
3.7 譯碼顯示模塊設計
譯碼顯示模塊將上一模塊譯碼模塊輸出的四個一位數譯碼成相對應的七位數碼管段碼,完成倒計時的譯碼和顯示。在譯碼顯示模塊仿真圖中,DJS_ EW_OUT_ SW,DJS_EW_OUT_GW,DJS_SN_OUT_SW,DJS_SN_OUT_GW是四位的輸入信號,也是上一模塊TO_8421_BCD的輸出信號,它們的范圍為數字0~9,DJS_EW_ OUT_SW1,DJS_ EW_ OUT_GW1,DJS_SN_OUT_SW1,DJS_SN_OUT_GW1對應的是相應的七位數碼管顯示段碼的值。圖中輸出信號的值隨著輸入信號的變化而相應的變化,例如DJS_EW_OUT_SW為7,DJS_EW_OUT_GW為5時,DJS_EW_OUT_SW1為00000111(a、b、c、d、e、f、g依次對應著1110000,最高位的0表示是數碼管的類型是共陰的),表示數碼管顯示7,DJS_EW_OUT_GW1為01101101,表示數碼管顯示5。仿真完全正確,符合預期。其仿真結果如圖3-7所示:
圖3-7 譯碼顯示模塊仿真圖
3.8 頂層文件模塊設計
頂層設計采用VHDL語言描述方式實現,并在工程文件仿真過后通過工具菜單自動生成原理圖文件,從而是設計原理更加清晰明朗。
在頂層設計VHDL描述中,共包含7個元件,分別是:
1、分頻器模塊,2、狀態控制模塊,3、交通信號燈顯示模塊,4、東西方向倒計時模塊設計,5、南北方向倒計時模塊設計,6、譯碼模塊設計,7、譯碼顯示模塊設計。這7個模塊經過程序設計、編譯仿真,結果均能夠達到設計要求。最后在頂層設計中,通過元件例化語句將這7個模塊連接起來,生成頂層文件。在頂層設計中,RESET是復位信號,輸入的時鐘頻率CLK是50MHz,經過分頻50M的分頻器后,變為頻率為1Hz的時鐘信號,周期為1s,用此時鐘信號來控制整個系統的步調,與現實生活中交通燈的步調保持一致。EW_LRGY、SN_LRGY分別為東西和南北方向上交通信號燈的狀態,EW_DJS_DISPLAY、SN_DJS_DISPLAY為東西
桂林電子科技大學實訓說明書用紙
和南北方向紅綠燈倒計時間。另外,所有的數碼管和二極管均為共陰極顯示。例如,在EW_LRGY為01000000(即東西方向紅燈亮)、SN_LRGY為10000000(即南北方向左轉燈亮)時,EW_DJS_DISPLAY的前八位表示倒計時的十位,后八位表示倒計時的個位;圖中EW_DJS_DISPLAY的前八位都是00000111表示7,后八位01111101表示6,后八位01101101表示5,后八位01100110表示4;SN_DJS_DISPLAY的前八位是01001111表示3,后八位01011011表示2,后八位00000110表示1,后八位00111111表示0,以上表明紅綠燈和倒計時時間顯示符合預期。仿真結果如圖3-8所示:
圖3-8 頂層文件波形仿真圖 實訓心得體會
本次EDA技術實訓的交通燈采用的是Altera公司CycloneII系列的EP2C5T144芯片作為核心最小系統,它可以方便嵌入到實際的交通燈應用系統中,可以完成簡單的邏輯控制、數據采集、信號處理、數學計算等功能;使用QuartusII軟件作為開發平臺;采用自頂向下的設計思路對系統進行模塊化設計和綜合,并通過波形仿真和硬件實現兩種方式實現并驗證交通燈的功能。為期兩周的實訓,我利用網絡和圖書館的有效資源,搜集并下載了大量的關于用FPGA做交通燈設計的資料;然后精心閱讀,在老師的指導督促下,并和周圍同學進行有效學習和溝通,最終確定了自己的設計方案;最后按照既定的設計方案,通過努力有步驟的實現了交通燈的設計。
通過此次實訓設計,讓我加深了FPGA的理解,更加熟練了VHDL語言,同時,我深深體會到了通過FPGA設計數字電路的方便、簡潔的特點,這讓我相信未來數字電路的應用必將更加廣泛。另外,我還體會到:從事開發設計工作,一定要保持個勤奮、踏實、嚴謹的工作態度,這樣才能更好的完成工作。最后,我覺得在交通燈控制系統設計中還可以增加一些實用功能,如:
1、針對弱視或色盲人群進行聲音提示;
2、在遇到突發狀況時,可以將紅綠燈改為緊急模式控制;
3、當有119、120等特種車輛通過時,系統可轉為特種車放行,其他車輛禁行。
但是這次實訓我也發現自己的很多不足之處。在設計過程中我發現自己考慮問題很不全面,自己的專業知識掌握的很不牢靠,所掌握的編程語句還不夠,很多程序都看不懂,我希望自己的這些不足之處能在今后的工作和學習中得到改善。而且,通過這次實訓,我懂得了學習的重要性,學會了堅持和努力,這將為以后的學習做出了最好的榜樣!
桂林電子科技大學實訓說明書用紙
還有光有知識是不行的,還得有能力、有技術,單干也是不行的,要適當尋求合作,那樣才能更好實現我們的價值。在實訓中及社會上,我們都要懂得虛心地向別人學習,即使你覺得自己很厲害,但總有一些東西你是不懂的,所以不懂要多向別人請教,這樣才能更好地提高自己的水平和能力,全面發展自己。
桂林電子科技大學實訓說明書用紙
謝 辭
在這短短的兩周EDA實訓中,在這期間同學們都在努力學習,認真做自己各自的實訓。在此我要特別感謝各位指導老師們對我的指導,還有各位同學對我的幫助,尤其感謝老師在百忙之中抽出時間為我們講解設計原理,同時,還要感謝和我一起努力的各位同學,在他們對我的幫助很我自己的努力下,我才能順利地完成這次實訓。
這次實訓我受匪頗多,但這多是得益于老師無微不至的關心和細心的教導。在實訓中,讓我學到了不少知識,給了我一次復習學過的知識的機會,鞏固了基礎知識。也多虧同學們的無私的幫助和支持,在我無助的時候還是他們伸出他們的友愛之手,幫我渡過難關,在此我也真心的多謝他們默默的幫助。最后再次對老師們說聲:謝謝!
桂林電子科技大學實訓說明書用紙
參考文獻
[1] 潘松,黃繼業.EDA技術實用教程(第三版).北京:科學出版社,2010.1 [2] 劉江海,涂傳威,陳瑋.EDA技術課程設計.武漢:華中科技大學出版社,2009.5 [3] 夏路易.基于EDA的電子技術課程設計.北京:電子工業出版社,2009.1 [4] 王金明,周順.數字系統設計與VHDL.北京:電子工業出版社,2010.5 [5] 鄒彥,莊嚴,鄒寧.EDA技術與數字系統設計.北京:電子工業出版社,2007.4 [6] 林明權,馬維旻.VHDL數字控制系統設計范例.北京:電子工業出版社,2003.1