基於verilog的交通燈程式

2021-06-06 04:54:38 字數 3973 閱讀 6135

module traffic(clk,sm_bit,key,sm_seg,en,rst,hold,light1,light2);

input clk;//定義時鐘引腳

input rst,en; //定義復位和使能引腳

output [7:0]sm_bit;//定義數碼管位選引腳

output [7:0]sm_seg;//定義數碼管段選引腳

output[2:0]light1,light2;//定義兩個方向交通燈

reg [7:0]sm_bit_r;

reg [7:0]sm_seg_r;

reg [3:0]disp_dat;;//定義數碼管顯示資料暫存器

reg[24:0]count;//定義計數器暫存器

reg sec;//定義秒訊號暫存器

reg tim1,tim2,st1,st2;//定義

tim1

位倒計時是否到達的位標識

reg[1:0]state1,state2,ste;//定義一些狀態

reg[2:0]light1,light2;

reg[3:0]num;

reg[7:0]num1,num2;//num1和

num2

的值為倒計時的值

reg[7:0]red1,red2,green1,green2,yellow1,yellow2;//定義紅黃藍燈的一些狀態

assign sm_bit=sm_bit_r;

assign sm_seg=sm_seg_r;

always@(posedge clk)

begin

count=count+1'b1;

if(count==25'd25000000)//時間達到一秒

begin

count=25'd0;

sec=~sec;

end 

endalways@(posedge clk)

begin

case (count[17:15])

3'd0:disp_dat = num1[3:0];//秒個位

3'd1:disp_dat = num1[7:4]; //秒十位

3'd2:disp_dat = 4'ha; //顯示

"-"

3'd3:disp_dat = num2[3:0]; //分個位

3'd4:disp_dat = num2[7:4]; //分十位

3'd5:disp_dat = 4'ha; //顯示

"-"

endcase

case(count[17:15]) //選擇數碼管顯示位

3'd0:sm_bit_r = 8'b11111110; //選擇第乙個數碼管顯示

3'd1:sm_bit_r = 8'b11111101; //選擇第二個數碼管顯示

3'd2:sm_bit_r = 8'b11111011; //選擇第三個數碼管顯示

3'd3:sm_bit_r = 8'b11110111; //選擇第四個數碼管顯示

3'd4:sm_bit_r = 8'b11101111; //選擇第五個數碼管顯示

3'd5:sm_bit_r = 8'b11011111; //選擇第六個數碼管顯示

3'd6:sm_bit_r = 8'b10111111; //選擇第七個數碼管顯示

3'd7:sm_bit_r = 8'b01111111; //選擇第八個數碼管顯示

endcase

end 

always @(posedge clk)

begin

case(disp_dat)

4'h0:sm_seg_r = 8'hc0; //顯示0

4'h1:sm_seg_r = 8'hf9; //顯示1

4'h2:sm_seg_r = 8'ha4; //顯示2

4'h3:sm_seg_r = 8'hb0; //顯示3

4'h4:sm_seg_r = 8'h99; //顯示4

4'h5:sm_seg_r = 8'h92; //顯示5

4'h6:sm_seg_r = 8'h82; //顯示6

4'h7:sm_seg_r = 8'hf8; //顯示7

4'h8:sm_seg_r = 8'h80; //顯示8

4'h9:sm_seg_r = 8'h90; //顯示9

4'ha:sm_seg_r = 8'hbf; //顯示-

default:sm_seg_r = 8'hff; //不顯示

endcase

endalways@(en)

if(!en)

begin

green1<=8'b00110101;

red1<=8'b00100101;

yellow1<=8'b00000101;

green2<=8'b00100101;

red2<=8'b00110101;

yellow2<=8'b00000101;

endalways@(posedge sec)//南北方向

begin

if(!rst)//復位模組

begin

light1<=3'b001;

num1<=green1;

endif(!tim1)

begin

tim1<=1;

case(state1)

2'b00:begin num1<=green1;light1<=3'b110;state1<=2'b01;end

2'b01:begin num1<=yellow1;light1<=3'b101;state1<=2'b11;end

2'b11:begin num1<=red1;light1<=3'b011;state1<=2'b10;end

2'b10:begin num1<=yellow1;light1<=3'b101;state1<=2'b00;end//狀態機使三個狀態一直迴圈

default:light1<=3'b011;

endcase

end 

else 

begin

if(num1==1)tim1<=0;

else if(num1>0)

if(num1[3:0]==0)

begin

num1[3:0]<=4'b1001;//倒計時模組

num1[7:4]<=num1[7:4]-1;

endelse num1[3:0]<=num1[3:0]-1;

endend

always@(posedge sec)//東西方向

begin

if(!rst)//復位模組

begin

light2<=3'b100;

num2<=red2;

endif(!tim2)

begin

tim2<=1;

case(state2)

2'b00:begin  num2<=red2;light2<=3'b011;state2<=2'b01;end

2'b01:begin  num2<=yellow1;light2<=3'b101;state2<=2'b11;end

2'b11:begin  num2<=green2;light2<=3'b110;state2<=2'b10;end

2'b10:begin  num2<=yellow2;light2<=3'b101;state2<=2'b00;end

default:light2<=3'b011;

endcase

end 

else 

begin

if(num2==1)tim2<=0;

else if(num2>0)

if(num2[3:0]==0)

begin

num2[3:0]<=4'b1001;

num2[7:4]<=num2[7:4]-1;

endelse num2[3:0]<=num2[3:0]-1;

endend

endmodule

基於verilog的交通燈

狀態說明 1,初始化 東西南北的燈全亮 2,東西綠燈亮,南北紅燈亮 20秒 3,東西黃燈亮,南北紅燈亮 5秒 4,東西紅燈亮,南北綠燈亮 20秒 5,東西紅燈亮,南北黃燈亮 5秒 6,迴圈 2,3,4,5,如下 timescale 1ns 1ps company author gong create...

ewb交通燈報告和檔案 基於EWB的交通燈設計

本文著眼於目前普遍應用在城市道路上的交通燈控制系統,從課程設計的題目要求出發,設計了乙個十字路口主次街道的交通燈控制電路。首先進行交通燈狀態變換的分析和交通燈總體框架的設計,接著提出了2種電路設計方案,通過優劣比較後選定了方案2。電源電路由555定時器產生1hz的脈衝訊號 根據交通燈的四種執行狀態依...

交通燈控制

問題描述,十字路,東西方向和南北方向燈,綠20s黃5s紅25s,倒計時顯示時間,另外,警車救護車等特殊狀態,都顯紅燈,且時間顯示不斷閃爍,通過之後,恢復原狀態。以下是我編寫的源 library ieee use ieee.std logic 1164.all use ieee.std logic u...