《西工大數(shù)電 課程設計——交通燈》由會員分享,可在線閱讀,更多相關《西工大數(shù)電 課程設計——交通燈(12頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、
西北工業(yè)大學
課 程 設 計 報 告
題 目:交通信號燈控制電路
學院: 航 海 學 院
班級: 03051001班
學生〔學號〕:
學生〔學號〕:
日期: 2013 年 1 月
摘要
Verilog HDL 作為一種規(guī)的硬件描述語言,被廣泛應用于數(shù)字電子系統(tǒng)設計。它允許設計者進展各種級別的邏輯設計,也可以進展數(shù)字邏輯系統(tǒng)的仿真驗證、時序分析、邏輯綜合操作。本文介紹了應用Verilog HD
2、L語言自頂向下的設計方法設計交通燈控制系統(tǒng),使其實現(xiàn)道路交通的正常運轉,突出了其作為硬件描述語言的良好的可讀性、可移植性和易理解等優(yōu)點。通過Quartus Ⅱ完成了程序的編寫、編譯與仿真,生成頂層文件后下載到芯片CycloneⅢ EP3C16F484C6芯片上,在DE0開發(fā)板上進展驗證。驗證結果明確,該設計可以完成交通燈控制的相關要求。
關鍵詞:交通信號燈控制 Verilog HDL Quartus Ⅱ DE0
目錄
一、課程設計目的
二、設計任務與要求
三、方案設計
四、模塊設計
五、程序代碼
六、開發(fā)板驗證
七、遇到問題與解決
3、方法
八、總結
九、參考文獻
十、附錄〔管腳對應關系〕
一、 課程設計目的
設計目的:
初步了解掌握硬件描述語言,體會自頂向下的設計思想,鍛煉查閱資料與知識應用的能力。
二、 設計任務與要求
設計任務:
設計一個十字路口的交通燈控制電路,要求甲車道和乙車道兩條交叉道路上的車輛交替運行
設計要求:
1、南北和東西方向各有一組綠、黃、紅燈用于指揮交通,綠燈、黃燈和紅燈的持續(xù)時間分別為20秒、5秒和25秒;
2、當有特殊情況〔如消防車、救護車等〕時,兩個方向均為紅燈亮,計時停止,當特殊情況完畢后,控制器恢復原來狀態(tài),繼續(xù)正常運行;
4、
3、用兩組數(shù)碼管,以倒計時方式顯示兩個方向允許通行的時間。
三、 方案設計
任務分析:
東西〔A車道〕和南北〔B車道〕方向各有一組綠、黃、紅燈用于指揮交通〔如圖1、2〕,綠燈、黃燈和紅燈的持續(xù)時間分別為 25秒、5 秒和 30 秒。
A
B
圖1 十字路口交通燈模型
25s 30s 55s 60s
A方向 綠燈亮 黃燈亮 紅
5、燈亮
B方向 紅燈亮 綠燈亮 黃燈亮
圖2 計數(shù)值與交通燈亮滅的關系
如果有特殊情況發(fā)生,兩個方向均亮紅燈,因此,可以設計如下五個狀態(tài),其關系為:
狀態(tài)
亮燈情況
車輛行駛狀況
持續(xù)時間〔秒〕
下一狀態(tài)
A車道
B車道
S0
紅亮
紅亮
特殊狀況,兩方向均禁止通行
S(?)
S1
綠亮
紅亮
A方向通行,B車道禁止通行
20
S2
S2
黃亮
紅亮
A車道緩行,B車道禁止通行
5
S3
S3
紅亮
綠亮
6、
A車道禁止通行,B車道通行
20
S4
S4
紅亮
黃亮
A車道禁止通行,B車道緩行
5
S1
S〔?〕即返回暫停前一狀態(tài)
正常工作 特殊情況
S2
S1
S0
S3
S4
設計思想:
根據(jù)設計要求,考慮用4個模塊實現(xiàn):基頻分頻模塊、60進制計數(shù)器、交通控制、分位譯碼顯示模塊。整個電路以一個50MHz的晶振為時鐘源,由分頻得到所需時鐘1Hz。設計一個技術圍是0~59的計數(shù)器和一個根據(jù)計數(shù)值做出相應反映的計數(shù)器,并且對于計數(shù)值以兩組數(shù)碼
7、管來顯示,這就需要相應的譯碼電路。對于特殊情況,要設計特殊的對待方式,當進入此方式時兩個方向的紅燈點亮。
四、 模塊設計
1〕分頻模塊
由于實驗板只能提供50MHz的時鐘信號,而電路中需要使用較低頻率的時鐘,經(jīng)分配產(chǎn)生1Hz頻率送給交通控制器和計數(shù)器。
2〕計數(shù)器
本設計主要是由計數(shù)器來實現(xiàn)交通燈的亮滅關系。當檢測到特殊情況時,計數(shù)器暫停。
3〕交通控制器
根據(jù)計數(shù)器的數(shù)值控制發(fā)光二級管亮滅,輸出倒計時數(shù)值給譯碼管的分位電路。
4〕分位譯碼顯示
交通燈時鐘輸出兩組時間,數(shù)碼管顯示。
五、 程序
8、代碼
module
trafficlight(clk50M,hold,RedA,GreenA,YellowA,RedB,GreenB,YellowB,AG,AL,BG,BL);
input clk50M,hold;
output reg RedA,GreenA,YellowA,RedB,GreenB,YellowB;
output reg[6:0]AG,AL,BG,BL;
// clk50M輸入時鐘信號
//hold突發(fā)情況信號
// RedA,GreenA,YellowA輸出A方向燈信號
// RedB,GreenB,YellowB輸出B方向燈信號
//AG、AL輸出A方
9、向倒計時十位與個位
//BG、BL輸出B方向倒計時十位與個位
wire[3:0]DispAG,DispAL,DispBG,DispBL;
reg[5:0]NumA,NumB;
integer num;
reg clk1;
integer count;
//分位子模塊
assign DispAG[3:0]=NumA/10, //A 方向十位
DispAL[3:0]=NumA%10; //A 方向個位
assign DispBG[3:0]=NumB/10, //B 方向十位
DispBL[3:0]=NumB%10; //B
10、方向個位
// 50MHz分頻為1Hz
always (posedge clk50M)
begin
if(num==50000000)num=0;
else num=num+1;
if(num>25000000)clk1=1;
else clk1=0;
end
//數(shù)碼管顯示輸出,低電平有效
always (DispAG)
case(DispAG)
11、
4'b0000:AG=7'b1000000;
4'b0001:AG=7'b1111001;
4'b0010:AG=7'b0100100;
4'b0011:AG=7'b0110000;
4'b0100:AG=7'b0011001;
4'b0101:AG=7'b0010010;
4'b0110:AG=7'b0000010;
4'b0111:AG=7'b1111000;
4'b1000:AG=7'b0000000;
4'b1001:AG=7'b00100
12、00;
endcase
always (DispAL)
case(DispAL)
4'b0000:AL=7'b1000000;
4'b0001:AL=7'b1111001;
4'b0010:AL=7'b0100100;
4'b0011:AL=7'b0110000;
4'b0100:AL=7'b0011001;
4'b0101:AL=7'b0010010;
4'b0110:AL=7'b0000010;
4'b0111:AL=7'b1111000;
4'b1000:AL
13、=7'b0000000;
4'b1001:AL=7'b0010000;
endcase
always (DispBG)
case(DispBG)
4'b0000:BG=7'b1000000;
4'b0001:BG=7'b1111001;
4'b0010:BG=7'b0100100;
4'b0011:BG=7'b0110000;
4'b0100:BG=7'b0011001;
4'b0101:BG=7'b0010010;
4'b0110:BG=7'b0000010;
4'b
14、0111:BG=7'b1111000;
4'b1000:BG=7'b0000000;
4'b1001:BG=7'b0010000;
endcase
always (DispBL)
case(DispBL)
4'b0000:BL=7'b1000000;
4'b0001:BL=7'b1111001;
4'b0010:BL=7'b0100100;
4'b0011:BL=7'b0110000;
4'b0100:BL=7'b0011001;
4'b0101:BL=7'b0010010;
15、 4'b0110:BL=7'b0000010;
4'b0111:BL=7'b1111000;
4'b1000:BL=7'b0000000;
4'b1001:BL=7'b0010000;
endcase
//60進制計數(shù)器
always ( posedge clk1)
begin
if(hold)count=count;
else if(count==59)count=0;
else count=count+1
end
//交
16、通燈控制
always (posedge clk1)
begin
if(hold)
begin
RedA=1'b1;GreenA=1'B0;YellowA=1'B0;
RedB=1'b1;GreenB=1'B0;YellowB=1'B0;
end
else if(count<25)
begin
NumA<=25-count;
NumB<=30-count;
R
17、edA=1'b0;GreenA=1'B1;YellowA=1'B0;
RedB=1'b1;GreenB=1'B0;YellowB=1'B0;
end
else if(count<30)
begin
NumA<=30-count;
NumB<=30-count;
RedA=1'b0;GreenA=1'B0;YellowA=1'B1;
RedB=1'b1;GreenB=1'B0;YellowB=1'B0;
18、
end
else if(count<55)
begin
NumA<=60-count;
NumB<=55-count;
RedA=1'b1;GreenA=1'B0;YellowA=1'B0;
RedB=1'b0;GreenB=1'B1;YellowB=1'B0;
end
else if(count<60)
begin
NumA<=60-c
19、ount;
NumB<=60-count;
RedA=1'b1;GreenA=1'B0;YellowA=1'B0;
RedB=1'b0;GreenB=1'B0;YellowB=1'B1;
end
end
endmodule
六、 程序仿真
仿真波形如圖1、2、3
圖1 交通燈控制
圖2 數(shù)碼管顯示
圖3 特殊情況
七、 開發(fā)板驗證
在程序在DE0板上實現(xiàn)了預期功能。
A方向:
紅燈〔LEDG0〕黃燈〔LEDG1〕綠燈
20、(LEDG2)
數(shù)碼管HEX1顯示倒計數(shù)十位,數(shù)碼管HEX0顯示倒計數(shù)個位
B方向:
紅燈 (LEDG9) 黃燈(LEDG8) 綠燈(LEDG7)
數(shù)碼管HEX3顯示倒計數(shù)十位,數(shù)碼管HEX2顯示倒計數(shù)個位
hold: SW[0]
〔后附管腳對應〕
八、 遇到問題與解決方法
1) 編程過程中,由于局部模塊代碼類似,進展了粘貼復制,不同處卻沒有修改,導致仿真不能得到預期波形。經(jīng)仔細檢查修改代碼后,問題得到了解決。
2) 程序下載到開發(fā)板后,發(fā)現(xiàn)數(shù)碼管全顯示“0〞,LED燈沒有亮滅變換,分析后發(fā)現(xiàn)原先代碼中的分頻模塊存在問題,沒有將頻率降至1Hz,修改相關
21、代碼后,問題得到解決。
九、 總結
通過本次設計,初步了解掌握了硬件描述語言,體會了自頂向下的設計思想,對FPGA的應用有了一定了解。同時,鍛煉了查閱資料與知識應用的能力,極提高了學習熱情。
另外,在課設過程中,通過對遇到問題的思考與解決,更加深了對相關知識的了解,也使自己更加的細心。
十、 參考文獻
【1】 賀敬凱,Verilog HDL數(shù)字設計教程 ,電子科技大學〔2010〕
【2】 夏宇聞,數(shù)字系統(tǒng)設計Verilog實現(xiàn),高等教育〔2002〕
十一、 附錄
管腳對應關系
12 / 12