Verilog HDL基礎教程之:實(shí)例5 交通燈控制器
下面是交通燈的Verilog HDL源代碼及說(shuō)明。
module traffic(CLK,EN,LAMPA,LAMPB,ACOUNT,BCOUNT); //端口說(shuō)明
output[7:0] ACOUNT,BCOUNT;
output[3:0] LAMPA,LAMPB;
input CLK,EN; //內部信號說(shuō)明
reg[7:0] numa,numb; //ACOUNT和BCOUNT的內部信號
reg tempa,tempb;
reg[2:0] counta,countb; //方向A和方向B的燈的狀態(tài)
reg[7:0] ared,ayellow,agreen,aleft,bred,byellow,bgreen,bleft;
reg[3:0] LAMPA,LAMPB;
//設置各交通燈的持續時(shí)間初始化值,紅燈的值由另一個(gè)方向的黃燈和綠燈計算得出。
always @(EN)
if(!EN) begin //使能信號EN無(wú)效時(shí),對交通燈的計數值進(jìn)行初始化
ared =8'd55; //55 s , 30 + 5 + 15 + 5
ayellow =8'd5; //5 s
agreen =8'd40; //40 s
aleft =8'd15; //15 s
bred =8'd65; //65 s , 40 + 5 + 15 + 5
byellow =8'd5; //5 s
bleft =8'd15; //15 s
bgreen =8'd30; //30 s
end
assign ACOUNT=numa; //8位數碼管輸出
assign BCOUNT=numb; //8位數碼管輸出
//控制A方向4種燈的模塊
always @(posedge CLK) begin
if(EN) begin //使能有效時(shí),交通燈開(kāi)始工作
if(!tempa) begin
tempa=1;
case(counta) //控制燈狀態(tài)的順序
0: begin //狀態(tài)0
numa=agreen; //直行綠燈亮
LAMPA=2; //輸出0010
counta=1; //進(jìn)入下一個(gè)狀態(tài)
end
1: begin //狀態(tài)1
numa=ayellow; //黃燈亮
LAMPA=4; //輸出0100
counta=2; //進(jìn)入下一個(gè)狀態(tài)
end
2: begin //狀態(tài)2
numa=aleft; //左轉綠燈亮
LAMPA=1; //輸出0001
counta=3; //進(jìn)入下一個(gè)狀態(tài)
end
3: begin //狀態(tài)3
numa=ayellow; //黃燈亮
LAMPA=4; //輸出0100
counta=4; //進(jìn)入下一個(gè)狀態(tài)
end
4: begin //狀態(tài)4
numa=ared; //紅燈亮
LAMPA=8; //輸出1000
counta=0; //進(jìn)入下一個(gè)狀態(tài)(狀態(tài)0)
end
default: //默認狀態(tài)
LAMPA=8; //紅燈亮,輸出1000
endcase
end
else begin //每一個(gè)狀態(tài)的倒計時(shí)
if(numa>1) //判斷倒計時(shí)未歸零時(shí)分別對高地位進(jìn)行遞減
if(numa[3:0]==0) begin
numa[3:0]=4'b1001;
numa[7:4]=numa[7:4]-1;
end
else
numa[3:0]=numa[3:0]-1;
if (numa==2)
tempa=0; //倒計時(shí)結束,返回燈狀態(tài)變化判斷,將進(jìn)入下一個(gè)狀態(tài)
end
end
else begin
LAMPA=4'b1000; //使能無(wú)效時(shí),紅燈亮
counta=0; //返回方向A的狀態(tài)0(綠燈狀態(tài))
tempa=0; //進(jìn)入狀態(tài)變化判斷
end
end
//控制B方向4種燈的模塊,模塊的語(yǔ)言描述與方向A的描述基本一致,這里不再重復注釋
always @(posedge CLK) begin
if (EN) begin
if(!tempb) begin
tempb=1;
case (countb)
0: begin
numb=bred;
LAMPB=8;
countb=1;
end
1: begin
numb=bgreen;
LAMPB=2;
countb=2;
end
2: begin
numb=byellow;
LAMPB=4;
countb=3;
end
3: begin
numb=bleft;
LAMPB=1;
countb=4;
end
4: begin
numb=byellow;
LAMPB=4;
countb=0;
end
default:
LAMPB=8;
endcase
end
else begin //倒計時(shí)
if(numb>1)
if(!numb[3:0]) begin
numb[3:0]=9;
numb[7:4]=numb[7:4]-1;
end
else
numb[3:0]=numb[3:0]-1;
if(numb==2)
tempb=0;
end
end
else begin
LAMPB=4'b1000;
tempb=0;
countb=0;
end
end
endmodule
通過(guò)上面這個(gè)Verilog HDL模塊,基本實(shí)現了交通燈控制器的基本功能。讀者可將此設計應用于實(shí)際的硬件系統中,通過(guò)晶振、FPGA、開(kāi)關(guān)、LED燈及數碼管等資源即可完成硬件實(shí)現。
評論