📄 traffic.v
字号:
/* 信号定义与说明:
CLK: 为同步时钟;
LAMPA: 控制A 方向3盏灯的亮灭;其中,LAMPA0 ~ LAMPA2,分别控制A 方向的
绿灯、黄灯和红灯;
LAMPB: 控制B 方向3盏灯的亮灭;其中,LAMPB0 ~ LAMPB2,分别控制B 方向的
绿灯、黄灯和红灯;
ACOUNT: 用于A 方向灯的时间显示,8 位,可驱动两个数码管;
BCOUNT: 用于B 方向灯的时间显示,8 位,可驱动两个数码管。
其中A方向即为城市公路,B方向为乡村公路 */
module traffic(CLK,EN,LAMPA,LAMPB,ACOUNT,BCOUNT);
output[7:0] ACOUNT,BCOUNT;
output[2:0] LAMPA,LAMPB;
input CLK,EN; //EN 为 1时表示乡村公路有车,可用作开关
reg[7:0] numa,numb;
reg tempa,tempb;
reg[2:0] counta,countb;
reg[7:0] ared,ayellow,agreen,bred,byellow,bgreen;
reg[2:0] LAMPA,LAMPB;
initial counta=0;
initial countb=0;
always @(EN)
if(!EN)
begin //设置各种灯的计数器的预置数
ared <=33; //21 秒转化为 2个4位BCD码的10进制表示
ayellow <=5; //5 秒转化为 2个4位BCD码的10进制表示
agreen <=37; //25 秒转化为 2个4位BCD码的10进制表示
bred <=48; //30 秒转化为 2个4位BCD码的10进制表示
byellow <=5; //5 秒转化为 2个4位BCD码的10进制表示
bgreen <=22; //16 秒转化为 2个4位BCD码的10进制表示
end
assign ACOUNT=numa;
assign BCOUNT=numb;
always @(posedge CLK) //该进程控制A 方向的3种灯
begin
if(EN)
begin
if(!tempa)
begin
tempa<=1;
case(counta) //控制亮灯的顺序,绿,黄,红
0: begin numa<=agreen; LAMPA<=1; counta<=1; end
1: begin numa<=ayellow; LAMPA<=2; counta<=2; end
2: begin numa<=ared; LAMPA<=4; counta<=0; end
default: LAMPA<=1;
endcase
end
else begin //倒计时
if(numa>1)
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;
end
end
else begin
LAMPA<=3'b001;
counta<=0; tempa<=0;
end
end
always @(posedge CLK) //该进程控制B 方向的3种灯
begin
if (EN)
begin
if(!tempb)
begin
tempb<=1;
case (countb) //控制亮灯的顺序,红,绿,黄
0: begin numb<=bred; LAMPB<=4; countb<=1; end
1: begin numb<=bgreen; LAMPB<=1; countb<=2; end
2: begin numb<=byellow; LAMPB<=2; countb<=0; end
default: LAMPB<=4;
endcase
end
else
begin //倒计时
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<=3'b100;
tempb<=0; countb<=0;
end
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -