名稱:Quartus交通燈控制器Verilog代碼遠程云端平臺
軟件:Quartus
語言:Verilog
代碼功能:
設計要求:
由一條主干道和一條支干道匯合成十字路口,在每個人口處設置紅,綠、黃,左拐允許。
四盞信號燈,紅燈亮禁止通行,綠燈亮允許迪行,黃燈亮則給行駛中的車輛有時間停在禁行線外,左拐燈亮允許車轉向左拐彎。
信號燈變換次序為:主支干道交替通行,主干行亮5s黃燈讓行駛中的車輛有時間停到共行線外,左拐應行15,亮5s黃燈,支30s,亮5s黃燈,左拐放行15s,亮5黃訂、各計時電路為倒計時顯示。
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
本代碼已在遠程云端平臺驗證,遠程云端平臺如下,其他遠程云端平臺可以修改管腳適配:
演示視頻:
設計文檔:
1. 工程文件
2. 程序文件
3. 程序編譯
4. 管腳分配
5. 仿真圖
分頻模塊
控制模塊
顯示模塊
部分代碼展示:
//狀態(tài)機控制模塊 module?state_machine( input?clk_1Hz,//1Hz input?key,//復位 output?reg?main_red,//主干道紅燈 output?reg?main_green,//主干道綠燈 output?reg?main_yellow,//主干道黃燈 output?reg?main_left,//主干道左轉燈 output?reg?branch_red,//支干道紅燈 output?reg?branch_green,//支干道綠燈 output?reg?branch_yellow,//支干道黃燈 output?reg?branch_left,//支干道左轉燈 output?reg?[7:0]?main_cnt,//主路倒計時 output?reg?[7:0]?branch_cnt//支路倒計時 ); //狀態(tài)機控制模塊 reg?[3:0]?state=4'd0; //定義5個狀態(tài) parameter?S0=4'd0; parameter?S1=4'd1; parameter?S2=4'd2; parameter?S3=4'd3; parameter?S4=4'd4; parameter?S5=4'd5; parameter?S6=4'd6; parameter?S7=4'd7; parameter?S8=4'd8; reg?[7:0]?count_S0=8'd0;//定義計數器 reg?[7:0]?count_S1=8'd0;//定義計數器 reg?[7:0]?count_S2=8'd0;//定義計數器 reg?[7:0]?count_S3=8'd0;//定義計數器 reg?[7:0]?count_S4=8'd0;//定義計數器 reg?[7:0]?count_S5=8'd0;//定義計數器 reg?[7:0]?count_S6=8'd0;//定義計數器 reg?[7:0]?count_S7=8'd0;//定義計數器 wire?[7:0]?main_red_time;//主干道紅燈 wire?[7:0]?main_green_time;//主干道綠燈 wire?[7:0]?main_yellow_time;//主干道黃燈 wire?[7:0]?main_left_time;//主干道左轉燈 wire?[7:0]?branch_red_time;//主干道紅燈 wire?[7:0]?branch_green_time;//主干道綠燈 wire?[7:0]?branch_yellow_time;//主干道黃燈 wire?[7:0]?branch_left_time;//主干道左轉燈 assign?main_red_time=8'd55;//主干道紅燈 assign?main_green_time=8'd40;//主干道綠燈 assign?main_yellow_time=8'd5;//主干道黃燈 assign?main_left_time=8'd15;//主干道左轉燈 assign?branch_red_time=8'd65;//支干道紅燈 assign?branch_green_time=8'd30;//支干道綠燈 assign?branch_yellow_time=8'd5;//支干道黃燈 assign?branch_left_time=8'd15;//支干道左轉燈 //狀態(tài)機控制 always@(posedge?clk_1Hz?or?posedge?key) if(key==1) state<=S8;//復位 else case(state) S8: state<=S0; S0://主干道綠燈 if(count_S0>=main_green_time-1)//40s state<=S1; else state<=S0; S1://主干道黃燈 if(count_S1>=main_yellow_time-1)//5s state<=S2; else state<=S1; S2://主干道左轉燈 if(count_S2>=main_left_time-1)//15s state<=S3; else state<=S2; S3://主干道黃燈 if(count_S3>=main_yellow_time-1)//5s state<=S4; else state<=S3; S4://支干道綠燈 if(count_S4>=branch_green_time-1)//30s state<=S5; else state<=S4; S5://支干道黃燈 if(count_S5>=branch_yellow_time-1)//5s state<=S6; else state<=S5; S6://支干道左轉燈 if(count_S6>=branch_left_time-1)//15s state<=S7; else state<=S6; S7://支干道黃燈 if(count_S7>=branch_yellow_time-1)//5s state<=S0; else state<=S7; default:; endcase //主干道綠燈計時 always@(posedge?clk_1Hz) if(state==S0) count_S0<=count_S0+1;//計時 else count_S0<=8'd0; //主干道黃燈計時 always@(posedge?clk_1Hz) if(state==S1) count_S1<=count_S1+1;//計時 else count_S1<=8'd0; //主干道左轉燈計時 always@(posedge?clk_1Hz) if(state==S2) count_S2<=count_S2+1;//計時 else count_S2<=8'd0; //主干道黃燈計時 always@(posedge?clk_1Hz) if(state==S3) count_S3<=count_S3+1;//計時 else count_S3<=8'd0; //支干道綠燈計時 always@(posedge?clk_1Hz) if(state==S4) count_S4<=count_S4+1;//計時 else count_S4<=8'd0; //支干道黃燈計時 always@(posedge?clk_1Hz) if(state==S5)? count_S5<=count_S5+1;//計時 else count_S5<=8'd0; //支干道左轉燈計時 always@(posedge?clk_1Hz) if(state==S6) count_S6<=count_S6+1;//計時 else count_S6<=8'd0; //支干道黃燈計時 always@(posedge?clk_1Hz) if(state==S7) count_S7<=count_S7+1;//計時 else count_S7<=8'd0; //控制紅綠燈 always@(posedge?clk_1Hz) case(state) S0://主干道綠燈 begin main_red<=0; main_green<=1; main_yellow<=0; main_left<=0; branch_red<=1; branch_green<=0; branch_yellow<=0; branch_left<=0; end S1://主干道黃燈 begin main_red<=0; main_green<=0; main_yellow<=1; main_left<=0; branch_red<=1; branch_green<=0; branch_yellow<=0; branch_left<=0; end S2://主干道左轉燈 begin main_red<=0; main_green<=0; main_yellow<=0; main_left<=1; branch_red<=1; branch_green<=0; branch_yellow<=0; branch_left<=0; end S3://主干道黃燈 begin main_red<=0; main_green<=0; main_yellow<=1; main_left<=0; branch_red<=1; branch_green<=0; branch_yellow<=0; branch_left<=0; end S4://支干道綠燈 begin main_red<=1; main_green<=0; main_yellow<=0; main_left<=0; branch_red<=0; branch_green<=1; branch_yellow<=0; branch_left<=0; end S5://支干道黃燈 begin main_red<=1; main_green<=0; main_yellow<=0; main_left<=0; branch_red<=0; branch_green<=0; branch_yellow<=1; branch_left<=0; end S6://支干道左轉燈 begin main_red<=1; main_green<=0; main_yellow<=0; main_left<=0; branch_red<=0; branch_green<=0; branch_yellow<=0; branch_left<=1; end S7://支干道黃燈 begin main_red<=1; main_green<=0; main_yellow<=0; main_left<=0; branch_red<=0; branch_green<=0; branch_yellow<=1; branch_left<=0; end S8://復位 begin main_red<=1; main_green<=0; main_yellow<=0; main_left<=0; branch_red<=1; branch_green<=0; branch_yellow<=0; branch_left<=0; end default:; endcase //倒計時控制 always@(posedge?clk_1Hz) if(state==S0)begin//主干道綠燈 main_cnt=main_green_time-count_S0; branch_cnt=branch_red_time-count_S0; end else?if(state==S1)begin//主干道黃燈 main_cnt=main_yellow_time-count_S1; branch_cnt=branch_red_time-(main_green_time+count_S1); end else?if(state==S2)begin//主干道左轉燈 main_cnt=main_left_time-count_S2; branch_cnt=branch_red_time-(main_green_time+main_yellow_time+count_S2); end else?if(state==S3)begin//主干道黃燈 main_cnt=main_yellow_time-count_S3; branch_cnt=branch_red_time-(main_green_time+main_yellow_time+main_left_time+count_S3); end else?if(state==S4)begin//支干道綠燈 branch_cnt=branch_green_time-count_S4; main_cnt=main_red_time-count_S4; end else?if(state==S5)begin//支干道黃燈 branch_cnt=branch_yellow_time-count_S5; main_cnt=main_red_time-(branch_green_time+count_S5); end else?if(state==S6)begin//支干道左轉燈 branch_cnt=branch_left_time-count_S6; main_cnt=main_red_time-(branch_green_time+branch_yellow_time+count_S6); end else?if(state==S7)begin//支干道黃燈 branch_cnt=branch_yellow_time-count_S7; main_cnt=main_red_time-(branch_green_time+branch_yellow_time+branch_left_time+count_S7); end else?begin branch_cnt=8'd88; main_cnt=8'd88; end endmodule
點擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=364
閱讀全文