怎么使绿灯转换向的时候,绿灯每一秒闪一次,黄灯持续5s

JimSaul_zz 2017-06-18 10:00:59
module traffic_light(
input clk, S, clrn,
output reg HG, HY, HR, FG, FY, FR
);
reg [3:0] TimeH, TimeL; //定时器的寄存器
wire T1, Ts, Ty;
reg St;
reg [1:0] CurrentState, NextState; //控制寄存器
parameter S0=2'b00, S1=2'b01, S2=2'b11, S3=2'b10; //对状态进行编码
/*控制单元状态转换的描述*/
always @ (posedge clk, negedge clrn)
begin: statereg
if (~clrn)
CurrentState <= S0; //初始状态为S0
else CurrentState <= NextState;
end //statereg
always @ (S or CurrentState or T1 or Ts or Ty)
begin: fsm
case (CurrentState)
S0: begin
NextState = (T1 && S) ? S1 : S0;
St = (T1 && S) ? 1:0;
end
S1: begin
NextState = (Ty) ? S2 : S1;
St = (Ty) ? 1:0;
end
S2: begin
NextState = (Ts || ~S) ? S3 : S2;
St = (Ts || ~S) ? 1:0;
end
S3: begin
NextState = (Ty) ? S0 : S3;
St = (Ty) ? 1:0;
end
endcase
end //fsm
/*定时器工作的描述*/
always @ (posedge clk or negedge clrn)
begin: counter
if(~clrn)
{TimeH, TimeL} <= 8'b0;
else if(St)
{TimeH, TimeL} <= 8'b0;
else if((TimeH == 8) & (TimeL == 9))
begin {TimeH, TimeL} <= {TimeH, TimeL} ; end
else if (TimeL == 9)
begin TimeH <= TimeH + 1; TimeL <= 0; end
else
begin TimeH <= TimeH; TimeL <= TimeL + 1; end
end //counter
assign Ty = (TimeH == 0)&(TimeL == 4);
assign Ts = (TimeH == 2)&(TimeL == 9);
assign T1 = (TimeH == 8)&(TimeL == 9);
/*输出译码电路的描述*/
always @ (CurrentState)
begin
case(CurrentState)
S0: begin
{HG, HY, HR} = 3'b100; //主干道绿灯亮
{FG, FY, FR} = 3'b001; //支干道红灯亮
end
S1: begin
{HG, HY, HR} = 3'b010; //主干道黄灯亮
{FG, FY, FR} = 3'b001; //支干道红灯亮
end
S2: begin
{HG, HY, HR} = 3'b001; //主干道红灯亮
{FG, FY, FR} = 3'b100; //支干道绿灯亮
end
S3: begin
{HG, HY, HR} = 3'b001; //主干道红灯亮
{FG, FY, FR} = 3'b010; //支干道黄灯亮
end
endcase
end
endmodule
...全文
500 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

2,426

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 其他硬件开发
社区管理员
  • 其他硬件开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧