基于FPGA含倒計(jì)時(shí)功能的交通燈設(shè)計(jì)(附完整源碼)
時(shí)間:2025-11-16 22:57:32
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
一、實(shí)驗(yàn)任務(wù)要求
1)實(shí)現(xiàn)一交通十字路口處紅綠燈的基本定時(shí)控制功能,要求東西方向燈色循環(huán)為綠燈45秒,黃燈5秒,左拐燈15秒,黃燈5秒,紅燈40秒,黃燈5秒;南北方向燈色循環(huán)為紅燈65秒,黃燈5秒,綠燈20秒,黃燈5秒,左拐燈15秒,黃燈5秒。2)實(shí)現(xiàn)東西方向和南北方向各種燈的倒計(jì)時(shí)數(shù)碼顯示功能。二、LED分模塊設(shè)計(jì)(用于調(diào)用使用)module LED (seg_data_1,seg_data_2,seg_led_1,seg_led_2); input [3:0] seg_data_1;//數(shù)碼管需要顯示0~9十個(gè)數(shù)字,所以最少需要4位輸入做譯碼 input [3:0] seg_data_2;//小腳丫上第二個(gè)數(shù)碼管 output [8:0] seg_led_1;//在小腳丫上控制一個(gè)數(shù)碼管需要9個(gè)信號(hào) MSB~LSB=DIG、DP、G、F、E、D、C、B、A output [8:0] seg_led_2;//在小腳丫上第二個(gè)數(shù)碼管的控制信號(hào) MSB~LSB=DIG、DP、G、F、E、D、C、B、A reg [8:0] seg [9:0]; //定義了一個(gè)reg型的數(shù)組變量,相當(dāng)于一個(gè)10*9的存儲(chǔ)器,存儲(chǔ)器一共有10個(gè)數(shù),每個(gè)數(shù)有9位寬 initial //在過程塊中只能給reg型變量賦值,Verilog中有兩種過程塊always和initial //initial和always不同,其中語句只執(zhí)行一次 begin seg[0] = 9'h3f; //對(duì)存儲(chǔ)器中第一個(gè)數(shù)賦值9'b00_0011_1111,相當(dāng)于共陰極接地,DP點(diǎn)變低不亮,7段顯示數(shù)字 0 seg[1] = 9'h06; //7段顯示數(shù)字 1 seg[2] = 9'h5b; //7段顯示數(shù)字 2 seg[3] = 9'h4f; //7段顯示數(shù)字 3 seg[4] = 9'h66; //7段顯示數(shù)字 4 seg[5] = 9'h6d; //7段顯示數(shù)字 5 seg[6] = 9'h7d; //7段顯示數(shù)字 6 seg[7] = 9'h07; //7段顯示數(shù)字 7 seg[8] = 9'h7f; //7段顯示數(shù)字 8 seg[9] = 9'h6f; //7段顯示數(shù)字 9 end assign seg_led_1 = seg[seg_data_1]; //連續(xù)賦值,這樣輸入不同四位數(shù),就能輸出對(duì)于譯碼的9位輸出 assign seg_led_2 = seg[seg_data_2]; endmodule三、主程序代碼
module traffic1(Clk_12M,Rst,LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2,Seg7_VH,Seg7_VL,led15,led16,led17,ledCntDis); parameter S0 = 0; //主路綠燈,支路紅燈 parameter S1 = 1; //主路黃燈,支路紅燈 parameter S2 = 2; //主路藍(lán)燈,支路紅燈 parameter S3 = 3; //主路黃燈,支路黃燈 parameter S4 = 4; //主路紅燈,支路綠燈 parameter S5 = 5; //主路紅燈,支路黃燈 parameter S6 = 6; //主路紅燈,支路藍(lán)燈 parameter S7 = 7; //主路黃燈,支路黃燈 input Clk_12M,Rst; output LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2; output [8:0]Seg7_VH,Seg7_VL; output led15,led16,led17; reg LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2; reg Clk_1Hz;//分頻器 reg [31:0]Cnt_1Hz;//計(jì)數(shù)器 output reg[3:0] ledCntDis;該模塊是一個(gè)交通信號(hào)燈的Verilog描述,通過控制LED燈和數(shù)碼管來顯示不同的交通信號(hào)狀態(tài)。以下是對(duì)該模塊的解釋:輸入:
- Clk_12M:12MHz的時(shí)鐘信號(hào)- Rst:復(fù)位信號(hào)輸出:- LedR_1, LedG_1, LedB_1:控制第一個(gè)交通信號(hào)燈的紅、綠、藍(lán)LED燈- LedR_2, LedG_2, LedB_2:控制第二個(gè)交通信號(hào)燈的紅、綠、藍(lán)LED燈- Seg7_VH, Seg7_VL:控制數(shù)碼管顯示的高位和低位數(shù)碼- led15, led16, led17:輔助LED燈輸出- ledCntDis:控制數(shù)碼管顯示的計(jì)數(shù)器輸出內(nèi)部變量:
- Clk_1Hz:1Hz的時(shí)鐘信號(hào),通過分頻器實(shí)現(xiàn)- Cnt_1Hz:1Hz的計(jì)數(shù)器,用于控制信號(hào)燈狀態(tài)的切換參數(shù):
- S0-S7:交通信號(hào)燈的不同狀態(tài),例如S0表示主路綠燈,支路紅燈該模塊通過時(shí)鐘信號(hào)進(jìn)行節(jié)拍控制,通過狀態(tài)機(jī)的方式實(shí)現(xiàn)交通信號(hào)燈的循環(huán)切換。通過適時(shí)改變LED燈和數(shù)碼管的輸出,實(shí)現(xiàn)不同狀態(tài)下的交通信號(hào)顯示。具體的狀態(tài)與信號(hào)燈顯示對(duì)應(yīng)關(guān)系是根據(jù)參數(shù)定義的。
在每個(gè)時(shí)鐘周期,計(jì)數(shù)器Cnt_1Hz會(huì)自增,并根據(jù)計(jì)數(shù)器的值切換交通信號(hào)燈的狀態(tài)和LED燈的輸出。同時(shí),數(shù)碼管和輔助LED燈也會(huì)根據(jù)需要進(jìn)行相應(yīng)的顯示。
需要注意的是,該模塊中的LedR_1, LedG_1等輸出信號(hào)使用reg聲明,表示它們是可寄存器的輸出信號(hào)。
/*分頻器模塊*/ always@(posedge Clk_12M or negedge Rst) begin if(!Rst) begin Cnt_1Hz<=1; Clk_1Hz<=1; //分頻器和計(jì)數(shù)器全部設(shè)置為初值1 end else begin if(Cnt_1Hz>=6000000)//當(dāng)計(jì)數(shù)器大于等于25的10的六次方 begin Cnt_1Hz<=1;//計(jì)數(shù)器置一 Clk_1Hz<=~Clk_1Hz;//分頻器取反 end else Cnt_1Hz<=Cnt_1Hz+1; end end這部分代碼描述了一個(gè)分頻器模塊,用于將輸入的12MHz時(shí)鐘信號(hào)分頻為1Hz的信號(hào)。以下是對(duì)代碼的解釋:
在`always @(posedge Clk_12M or negedge Rst)`的敏感列表中,當(dāng)輸入的時(shí)鐘信號(hào)Clk_12M上升沿或復(fù)位信號(hào)Rst的下降沿發(fā)生時(shí),會(huì)執(zhí)行下面的代碼塊。
根據(jù)復(fù)位信號(hào)Rst的狀態(tài),通過if-else語句進(jìn)行條件判斷和處理:
- 如果復(fù)位信號(hào)Rst為低電平(即復(fù)位有效),則在分頻器和計(jì)數(shù)器的初值都設(shè)置為1,表示初始狀態(tài)。- 如果復(fù)位信號(hào)Rst為高電平(即復(fù)位無效),則執(zhí)行下面的邏輯。在非復(fù)位狀態(tài)下,判斷計(jì)數(shù)器Cnt_1Hz是否大于等于6000000(即25 * 10^6),如果是,則表示達(dá)到了1Hz的分頻要求:
- 將計(jì)數(shù)器Cnt_1Hz重新置為1。- 將分頻器Clk_1Hz取反,實(shí)現(xiàn)1Hz的方波輸出。如果計(jì)數(shù)器Cnt_1Hz未達(dá)到指定值,則將計(jì)數(shù)器的值加1。
通過這段代碼,實(shí)現(xiàn)了將12MHz時(shí)鐘信號(hào)分頻為1Hz的功能,并且保持了分頻器和計(jì)數(shù)器的狀態(tài)在復(fù)位前后的一致性。分頻器的輸出Clk_1Hz可以作為其他模塊中需要1Hz時(shí)鐘信號(hào)的輸入。
/*計(jì)數(shù)器模塊*/ reg[7:0]Cnt70;//用于控制燈的變換 always@(posedge Clk_1Hz or negedge Rst) begin if(!Rst) begin Cnt70<=0; end else begin if(Cnt70>=115) begin Cnt70<=0;//復(fù)位 end else Cnt70<=Cnt70+1; end end /*計(jì)數(shù)器模塊*/ reg[7:0]Cnt10;//用于控制數(shù)碼管的變換 always@(posedge Clk_1Hz or negedge Rst) begin if(!Rst) begin Cnt10<=115; end else begin if(Cnt10<=0) begin Cnt10<=115;//復(fù)位 end else Cnt10<=Cnt10-1; end end這部分代碼描述了兩個(gè)計(jì)數(shù)器模塊,分別用于計(jì)數(shù)到特定的值并進(jìn)行復(fù)位操作。以下是對(duì)這兩個(gè)代碼塊的解釋:第一個(gè)計(jì)數(shù)器模塊:- 聲明了一個(gè)8位的寄存器變量Cnt70用于計(jì)數(shù)。- 在`always @(posedge Clk_1Hz or negedge Rst)`的敏感列表中,當(dāng)輸入的時(shí)鐘信號(hào)Clk_1Hz上升沿或復(fù)位信號(hào)Rst的下降沿發(fā)生時(shí),會(huì)執(zhí)行下面的代碼塊。- 如果復(fù)位信號(hào)Rst為低電平(即復(fù)位有效),則將計(jì)數(shù)器Cnt70置為0。- 如果復(fù)位信號(hào)Rst為高電平(即復(fù)位無效),則判斷計(jì)數(shù)器Cnt70是否大于等于115。如果是,表示計(jì)數(shù)器已經(jīng)達(dá)到了指定的值,將計(jì)數(shù)器Cnt70復(fù)位為0。- 如果計(jì)數(shù)器Cnt70未達(dá)到指定值,則將計(jì)數(shù)器的值加1。第二個(gè)計(jì)數(shù)器模塊:
- 同樣,聲明了一個(gè)8位的寄存器變量Cnt10用于計(jì)數(shù)。- 在`always @(posedge Clk_1Hz or negedge Rst)`的敏感列表中,當(dāng)輸入的時(shí)鐘信號(hào)Clk_1Hz上升沿或復(fù)位信號(hào)Rst的下降沿發(fā)生時(shí),會(huì)執(zhí)行下面的代碼塊。- 如果復(fù)位信號(hào)Rst為低電平(即復(fù)位有效),則將計(jì)數(shù)器Cnt10置為115。- 如果復(fù)位信號(hào)Rst為高電平(即復(fù)位無效),則判斷計(jì)數(shù)器Cnt10是否小于等于0。如果是,表示計(jì)數(shù)器已經(jīng)減到了指定的值,將計(jì)數(shù)器Cnt10復(fù)位為115。- 如果計(jì)數(shù)器Cnt10未減到指定值,則將計(jì)數(shù)器的值減1。通過這兩個(gè)計(jì)數(shù)器模塊,可以實(shí)現(xiàn)對(duì)計(jì)數(shù)值的控制和復(fù)位操作。這些計(jì)數(shù)器可用于控制特定時(shí)間、時(shí)序或事件需要的計(jì)數(shù)和復(fù)位功能。
/*數(shù)碼管模塊*/ reg[7:0]CntDis; reg[7:0]Cnt71; reg [7:0] Cnt61; always@(posedge Clk_12M)//BCD碼轉(zhuǎn)換 begin if(Cnt10>70) begin Cnt71[7:0]<=(Cnt10-70)/10; CntDis[7:4]<=Cnt71[3:0]; Cnt61[7:0]<=Cnt10-((Cnt10-70)/10)*10-70; CntDis[3:0]<=Cnt61[3:0]; end else if (Cnt10>65) begin Cnt71[7:0]<=(Cnt10-65)/10; CntDis[7:4]<=Cnt71[3:0]; Cnt61[7:0]<=Cnt10-((Cnt10-65)/10)*10-65; CntDis[3:0]<=Cnt61[3:0]; end else if (Cnt10>50) begin Cnt71[7:0]<=(Cnt10-50)/10; CntDis[7:4]<=Cnt71[3:0]; Cnt61[7:0]<=Cnt10-((Cnt10-50)/10)*10-50; CntDis[3:0]<=Cnt61[3:0]; end else if (Cnt10>45) begin Cnt71[7:0]<=(Cnt10-45)/10; CntDis[7:4]<=Cnt71[3:0]; Cnt61[7:0]<=Cnt10-((Cnt10-45)/10)*10-45; CntDis[3:0]<=Cnt61[3:0]; end else if (Cnt10>25) begin Cnt71[7:0]<=(Cnt10-25)/10; CntDis[7:4]<=Cnt71[3:0]; Cnt61[7:0]<=Cnt10-((Cnt10-25)/10)*10-25; CntDis[3:0]<=Cnt61[3:0]; end else if (Cnt10>20) begin Cnt71[7:0]<=(Cnt10-20)/10; CntDis[7:4]<=Cnt71[3:0]; Cnt61[7:0]<=Cnt10-((Cnt10-20)/10)*10-20; CntDis[3:0]<=Cnt61[3:0]; end else if (Cnt10>5) begin Cnt71[7:0]<=(Cnt10-5)/10; CntDis[7:4]<=Cnt71[3:0]; Cnt61[7:0]<=Cnt10-((Cnt10-5)/10)*10-5; CntDis[3:0]<=Cnt61[3:0]; end else if (Cnt10>0) begin Cnt71[7:0]<=Cnt10/10; CntDis[7:4]<=Cnt71[3:0]; Cnt61[7:0]<=Cnt10; CntDis[3:0]<=Cnt61[3:0]; end end always@(posedge Clk_12M) begin ledCntDis<=CntDis[3:0]; end //數(shù)碼管調(diào)用實(shí)例 LED hex(CntDis[3:0],CntDis[7:4],Seg7_VL,Seg7_VH);這部分代碼描述了一個(gè)數(shù)碼管模塊,它用于將計(jì)數(shù)器的值轉(zhuǎn)換為BCD碼,并將BCD碼通過數(shù)碼管進(jìn)行顯示。以下是對(duì)代碼的解釋:在第一個(gè)always塊中,通過對(duì)12MHz時(shí)鐘信號(hào)Clk_12M的上升沿進(jìn)行敏感監(jiān)聽,實(shí)現(xiàn)對(duì)計(jì)數(shù)器Cnt10值的轉(zhuǎn)換和BCD碼的生成。
- 根據(jù)不同的計(jì)數(shù)范圍,將Cnt10的值減去一個(gè)基準(zhǔn)并除以10,得到一個(gè)高位數(shù)。- 通過減法、除法和取余運(yùn)算,計(jì)算得到一個(gè)低位數(shù)。- 通過賦值操作,將高位數(shù)和低位數(shù)分別存儲(chǔ)到CntDis的7:4位和3:0位。在第二個(gè)always塊中,對(duì)12MHz時(shí)鐘信號(hào)Clk_12M的上升沿進(jìn)行敏感監(jiān)聽,將CntDis的低4位賦值給ledCntDis。這樣,ledCntDis可以作為控制數(shù)碼管顯示的信號(hào),通過連接到相應(yīng)的LED顯示模塊。最后,通過實(shí)例化一個(gè)名為hex的LED模塊,將CntDis的3:0位和7:4位分別連接到Seg7_VL和Seg7_VH輸入,從而實(shí)現(xiàn)數(shù)碼管的顯示。
通過這段代碼,可以將計(jì)數(shù)器的值轉(zhuǎn)換為BCD碼,并通過數(shù)碼管進(jìn)行顯示,實(shí)現(xiàn)實(shí)時(shí)的數(shù)值顯示功能。
//狀態(tài)轉(zhuǎn)換 reg [2:0] state; always@(posedge Clk_12M or negedge Rst) begin if(!Rst) begin LedR_1<=0; LedG_1<=0; LedB_1<=0; LedR_2<=0; LedG_2<=0; LedB_2<=0; end else begin case(state) S0://主路綠燈45s begin if(Cnt70<=45) begin LedR_1<=1; LedG_1<=0; LedB_1<=1; LedR_2<=0; LedG_2<=1; LedB_2<=1; end else state<=S1; end S1://主路黃燈5s begin if(Cnt70<=50) begin LedR_1<=0; LedG_1<=0; LedB_1<=1; LedR_2<=0; LedG_2<=1; LedB_2<=1; end else state<=S2; end S2://主路藍(lán)燈15s begin if(Cnt70<=65) begin LedR_1<=1; LedG_1<=1; LedB_1<=0; LedR_2<=0; LedG_2<=1; LedB_2<=1; end else state<=S3; end S3://主輔均5s黃 begin if(Cnt70<=70) begin LedR_1<=0; LedG_1<=0; LedB_1<=1; LedR_2<=0; LedG_2<=0; LedB_2<=1; end else state<=S4; end S4://輔路綠20s begin if(Cnt70<=90) begin LedR_1<=0; LedG_1<=1; LedB_1<=1; LedR_2<=1; LedG_2<=0; LedB_2<=1; end else state<=S5; end S5://輔路黃燈5s begin if(Cnt70<=95) begin LedR_1<=0; LedG_1<=1; LedB_1<=1; LedR_2<=0; LedG_2<=0; LedB_2<=1; end else state<=S6; end S6://輔路藍(lán)燈15s begin if(Cnt70<=110) begin LedR_1<=0; LedG_1<=1; LedB_1<=1; LedR_2<=1; LedG_2<=1; LedB_2<=0; end else state<=S7; end S7://主輔路均黃燈5s begin if(Cnt70>=111) begin LedR_1<=0; LedG_1<=0; LedB_1<=1; LedR_2<=0; LedG_2<=0; LedB_2<=1; end else state<=S0; end default begin LedR_1<=0; LedG_1<=0; LedB_1<=0; LedR_2<=0; LedG_2<=0; LedB_2<=0; end endcase end end assign {led17,led16,led15}=state; endmodule這段代碼是一個(gè)用Verilog描述的狀態(tài)轉(zhuǎn)換邏輯。它根據(jù)時(shí)鐘信號(hào)和復(fù)位信號(hào)來控制LED燈的狀態(tài)。具體邏輯如下:1. 如果復(fù)位信號(hào)(Rst)為低電平,則將所有LED燈的狀態(tài)置為0。
2. 如果復(fù)位信號(hào)為高電平,則根據(jù)當(dāng)前的狀態(tài)(state)執(zhí)行相應(yīng)的操作。3. 當(dāng)前有三種狀態(tài)(S0、S1、S2),對(duì)應(yīng)不同的燈光控制邏輯。 - S0狀態(tài):主路綠燈亮,持續(xù)45s。 - S1狀態(tài):主路黃燈亮,持續(xù)5s。 - S2狀態(tài):其他狀態(tài),可以在代碼中后續(xù)定義。 如此下去直到進(jìn)行循環(huán)。具體的操作是根據(jù)一個(gè)計(jì)數(shù)器(Cnt70)來控制。當(dāng)計(jì)數(shù)器的值小于等于給定的時(shí)間時(shí),對(duì)應(yīng)的LED燈亮起;否則,切換到下一個(gè)狀態(tài)。
這段代碼中只給出了S0和S1兩個(gè)狀態(tài)的邏輯,你可以繼續(xù)補(bǔ)充其他狀態(tài)的實(shí)現(xiàn)。另外,根據(jù)你的具體需求,你可能還需要定義和使用一些其他變量和邏輯來實(shí)現(xiàn)完整的狀態(tài)轉(zhuǎn)換控制。
module traffic1(Clk_12M,Rst,LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2,Seg7_VH,Seg7_VL,led15,led16,led17,ledCntDis); parameter S0 = 0; //主路綠燈,支路紅燈 parameter S1 = 1; //主路黃燈,支路紅燈 parameter S2 = 2; //主路藍(lán)燈,支路紅燈 parameter S3 = 3; //主路黃燈,支路黃燈 parameter S4 = 4; //主路紅燈,支路綠燈 parameter S5 = 5; //主路紅燈,支路黃燈 parameter S6 = 6; //主路紅燈,支路藍(lán)燈 parameter S7 = 7; //主路黃燈,支路黃燈 input Clk_12M,Rst; output LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2; output [8:0]Seg7_VH,Seg7_VL; output led15,led16,led17; reg LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2; reg Clk_1Hz;//分頻器 reg [31:0]Cnt_1Hz;//計(jì)數(shù)器 output reg[3:0] ledCntDis; /*分頻器模塊*/ always@(posedge Clk_12M or negedge Rst) begin if(!Rst) begin Cnt_1Hz<=1; Clk_1Hz<=1; //分頻器和計(jì)數(shù)器全部設(shè)置為初值1 end else begin if(Cnt_1Hz>=6000000)//當(dāng)計(jì)數(shù)器大于等于25的10的六次方 begin Cnt_1Hz<=1;//計(jì)數(shù)器置一 Clk_1Hz<=~Clk_1Hz;//分頻器取反 end else Cnt_1Hz<=Cnt_1Hz+1; end end /*計(jì)數(shù)器模塊*/ reg[7:0]Cnt70; always@(posedge Clk_1Hz or negedge Rst) begin if(!Rst) begin Cnt70<=0; end else begin if(Cnt70>=115) begin Cnt70<=0;//復(fù)位 end else Cnt70<=Cnt70+1; end end /*計(jì)數(shù)器模塊*/ reg[7:0]Cnt10; always@(posedge Clk_1Hz or negedge Rst) begin if(!Rst) begin Cnt10<=115; end else begin if(Cnt10<=0) begin Cnt10<=115;//復(fù)位 end else Cnt10<=Cnt10-1; end end /*數(shù)碼管模塊*/ reg[7:0]CntDis; reg[7:0]Cnt71; reg [7:0] Cnt61; always@(posedge Clk_12M)//BCD碼轉(zhuǎn)換 begin if(Cnt10>70) begin Cnt71[7:0]<=(Cnt10-70)/10; CntDis[7:4]<=Cnt71[3:0]; Cnt61[7:0]<=Cnt10-((Cnt10-70)/10)*10-70; CntDis[3:0]<=Cnt61[3:0]; end else if (Cnt10>65) begin Cnt71[7:0]<=(Cnt10-65)/10; CntDis[7:4]<=Cnt71[3:0]; Cnt61[7:0]<=Cnt10-((Cnt10-65)/10)*10-65; CntDis[3:0]<=Cnt61[3:0]; end else if (Cnt10>50) begin Cnt71[7:0]<=(Cnt10-50)/10; CntDis[7:4]<=Cnt71[3:0]; Cnt61[7:0]<=Cnt10-((Cnt10-50)/10)*10-50; CntDis[3:0]<=Cnt61[3:0]; end else if (Cnt10>45) begin Cnt71[7:0]<=(Cnt10-45)/10; CntDis[7:4]<=Cnt71[3:0]; Cnt61[7:0]<=Cnt10-((Cnt10-45)/10)*10-45; CntDis[3:0]<=Cnt61[3:0]; end else if (Cnt10>25) begin Cnt71[7:0]<=(Cnt10-25)/10; CntDis[7:4]<=Cnt71[3:0]; Cnt61[7:0]<=Cnt10-((Cnt10-25)/10)*10-25; CntDis[3:0]<=Cnt61[3:0]; end else if (Cnt10>20) begin Cnt71[7:0]<=(Cnt10-20)/10; CntDis[7:4]<=Cnt71[3:0]; Cnt61[7:0]<=Cnt10-((Cnt10-20)/10)*10-20; CntDis[3:0]<=Cnt61[3:0]; end else if (Cnt10>5) begin Cnt71[7:0]<=(Cnt10-5)/10; CntDis[7:4]<=Cnt71[3:0]; Cnt61[7:0]<=Cnt10-((Cnt10-5)/10)*10-5; CntDis[3:0]<=Cnt61[3:0]; end else if (Cnt10>0) begin Cnt71[7:0]<=Cnt10/10; CntDis[7:4]<=Cnt71[3:0]; Cnt61[7:0]<=Cnt10; CntDis[3:0]<=Cnt61[3:0]; end end always@(posedge Clk_12M) begin ledCntDis<=CntDis[3:0]; end //數(shù)碼管調(diào)用實(shí)例 LED hex(CntDis[3:0],CntDis[7:4],Seg7_VL,Seg7_VH); //狀態(tài)轉(zhuǎn)換 reg [2:0] state; always@(posedge Clk_12M or negedge Rst) begin if(!Rst) begin LedR_1<=0; LedG_1<=0; LedB_1<=0; LedR_2<=0; LedG_2<=0; LedB_2<=0; end else begin case(state) S0://主路綠燈45s begin if(Cnt70<=45) begin LedR_1<=1; LedG_1<=0; LedB_1<=1; LedR_2<=0; LedG_2<=1; LedB_2<=1; end else state<=S1; end S1://主路黃燈5s begin if(Cnt70<=50) begin LedR_1<=0; LedG_1<=0; LedB_1<=1; LedR_2<=0; LedG_2<=1; LedB_2<=1; end else state<=S2; end S2://主路藍(lán)燈15s begin if(Cnt70<=65) begin LedR_1<=1; LedG_1<=1; LedB_1<=0; LedR_2<=0; LedG_2<=1; LedB_2<=1; end else state<=S3; end S3://主輔均5s黃 begin if(Cnt70<=70) begin LedR_1<=0; LedG_1<=0; LedB_1<=1; LedR_2<=0; LedG_2<=0; LedB_2<=1; end else state<=S4; end S4://輔路綠20s begin if(Cnt70<=90) begin LedR_1<=0; LedG_1<=1; LedB_1<=1; LedR_2<=1; LedG_2<=0; LedB_2<=1; end else state<=S5; end S5://輔路黃燈5s begin if(Cnt70<=95) begin LedR_1<=0; LedG_1<=1; LedB_1<=1; LedR_2<=0; LedG_2<=0; LedB_2<=1; end else state<=S6; end S6://輔路藍(lán)燈15s begin if(Cnt70<=110) begin LedR_1<=0; LedG_1<=1; LedB_1<=1; LedR_2<=1; LedG_2<=1; LedB_2<=0; end else state<=S7; end S7://主輔路均黃燈5s begin if(Cnt70>=111) begin LedR_1<=0; LedG_1<=0; LedB_1<=1; LedR_2<=0; LedG_2<=0; LedB_2<=1; end else state<=S0; end default begin LedR_1<=0; LedG_1<=0; LedB_1<=0; LedR_2<=0; LedG_2<=0; LedB_2<=0; end endcase end end assign {led17,led16,led15}=state; endmodule以上是程序總代碼。





