📄
字号:
module tcl4(lampa,lampb,numah,numal,numbh,numbl,en,clk); /*模块说明*/
/*端口声明*/
output [3:0] lampa,lampb;/*分别控制A,B方向*/
output [3:0] numah,numal,numbh,numbl;
input en,clk;
/*数据类型说明*/
parameter green=4'b1000,yellow=4'b0100,
left =4'b0010,red=4'b0001;/*定义符号常量*/
reg [3:0] lampa,lampb;
reg [3:0] aredh,ayellowh,agreenh,alefth,
bredh,byellowh,bgreenh,blefth,
aredl,ayellowl,agreenl,aleftl,
bredl,byellowl,bgreenl,bleftl; /*存储预置值*/
/*当前计数器值*/
reg timeout_a,timeout_b; /*计时到*/
reg [2:0] state_a,state_b; /*当前状态*/
reg [3:0] numah,numal,numbh,numbl;
/*逻辑功能说明*/
always @ (en)
if(!en) /*为低时,复位*/
begin /*计数器预置值*/
aredh<=4'd5;aredl<=4'd5;
ayellowh<=4'd0;ayellowl<=4'h5;
agreenh<=4'd4; agreenl<=4'd0;
alefth<=4'd1;aleftl<=4'd5;
bredh<=4'd6;bredl<=4'd5;
byellowh <=4'd0;byellowl<=4'd5;
bgreenh<=4'd3;bgreenl<=4'd0;
blefth<=4'd1;bleftl <=4'd5;
end
always @ (posedge clk)
begin
if(en) /*en有效*/
begin
if(!timeout_a) /*计时到*/
begin
timeout_a<=1'b1;
case(state_a) /*绿一黄一左一黄一红*/
3'd0:begin numah<=agreenh;numal<=agreenl;lampa<=green;
state_a<=3'd1; /*绿灯*/
end
3'd1:begin numah<=ayellowh;numal<=ayellowl;lampa<=yellow;
state_a<=3'd2; /*黄灯*/
end
3'd2:begin numah<=alefth;numal<=aleftl;lampa<=left;
state_a<=3'd3; /*左拐灯*/
end
3'd3:begin numah<=ayellowh;numal<=ayellowl;lampa<=yellow;
state_a<=3'd4; /*黄灯*/
end
3'd4:begin numah<=aredh;numal<=aredl;lampa<=red;
state_a<=3'd0; /*红灯*/
end
default: lampa<=red;
endcase
end /*end if(!timeout_a) */
else begin /*减计数*/
if(numah>=1)
if(numal==0) /*BCD计数*/
begin numal<=4'b1001; /*低位为0*/
numah<=numah-1'b1;
end
else numal<=numal-1'b1;
else if ((numah==0)&&(numal>0))numal<=numal-1'b1;
else if((numal==0)&&(numah==0)) timeout_a<=1'b0; /*计时到*/
end /*end else */
end /*end if(en)*/
else begin /*关闭控制器*/
lampa<=red; state_a<=1'b0; timeout_a<=1'b0;
end
end /*end always */
always @ (posedge clk) /*控制B方向*/
begin
if(en) begin /*en有效*/
if(!timeout_b) begin /*计时到*/
timeout_b<=1'b1;
case(state_b) /*红一绿一黄一左一黄*/
3'd0:begin
numbh<=bredh;numbl<=bredl;lampb<=red;state_b<=3'd1;
end
3'd1:begin
numbh<=bgreenh;numbl<=bgreenl;lampb<=green;state_b<=3'd2;
end
3'd2:begin
numbh<=byellowh;numbl<=byellowl;lampb<=yellow;state_b<=3'd3;
end
3'd3:begin
numbh<=blefth;numbl<=bleftl;lampb<=left;state_b<=3'd4;
end
3'd4:begin
numbh<=byellowh;numbl<=byellowl;lampb<=yellow;state_b<=3'd0;
end
default: lampb<=red;
endcase
end /*end if(!timeout_b) */
else begin
if(numbh>=1)
if(numbl==0) begin
numbl<=4'b1001;
numbh<=numbh-1'b1;
end
else numbl<=numbl-1'b1;
else if((numbh==0)&&(numbl>0)) numbl<=numbl-1'b1;
else if((numbl==0)&&(numbh==0)) timeout_b<=1'b0; /*计时到*/
end /*end else */
end /*end if(en) */
else begin
lampb<=red;timeout_b<=1'b0;state_b<=1'b0;
end
end /*end always*/
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -