module traffic(Clk_12M,Rst,LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2,led15,led16,led17);
parameter S0 = 0; //主路绿灯,支路红灯
parameter S1 = 1; //主路黄灯,支路红灯
parameter S2 = 2; //主路蓝灯,支路红灯
parameter S3 = 3; //主路黄灯,支路黄灯
parameter S4 = 4; //主路红灯,支路绿灯
parameter S5 = 5; //主路红灯,支路黄灯
parameter S6 = 6; //主路红灯,支路蓝灯
parameter S7 = 7; //主路黄灯,支路黄灯
input Clk_12M,Rst;
output LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2;
output led15,led16,led17;
reg LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2;
reg Clk_1Hz;//分频器
reg [31:0]Cnt_1Hz;//计数器
/*分频器模块*/
always@(posedge Clk_12M or negedge Rst)//频率对应的是12mhz
begin
if(!Rst)
begin
Cnt_1Hz<=1;
Clk_1Hz<=1; //分频器和计数器全部设置为初值1
end
else
begin
if(Cnt_1Hz>=6000000)//当计数器大于等于6的10的六次方
begin
Cnt_1Hz<=1;//计数器置一
Clk_1Hz<=~Clk_1Hz;//分频器取反
end
else
Cnt_1Hz<=Cnt_1Hz+1;
end
end
/*计数器模块*/
reg[7:0]Cnt60;
always@(posedge Clk_1Hz or negedge Rst)
begin
if(!Rst)
begin
Cnt60<=0;
end
else
begin
if(Cnt60>=60)
begin
Cnt60<=0;//60清零
end
else
Cnt60<=Cnt60+1;
end
end
//状态转换
reg [2:0] state;
always@(posedge Clk_12M or negedge Rst)
begin
if(!Rst)
begin
LedR_1<=0;
LedG_1<=0;
LedB_1<=0;
LedR_2<=0;
LedG_2<=0;
LedB_2<=0;
end
else
begin
case(state)
S0://主路绿灯45s,辅路红灯45s
begin
if(Cnt60<=45)
begin
LedR_1<=1;
LedG_1<=0;
LedB_1<=1;
LedR_2<=0;
LedG_2<=1;
LedB_2<=1;
end
else
state<=S1;
end
S1://主路黄灯5s,辅路红灯5s
begin
if(Cnt60<=50)
begin
LedR_1<=0;
LedG_1<=0;
LedB_1<=1;
LedR_2<=0;
LedG_2<=1;
LedB_2<=1;
end
else
state<=S2;
end
S2://主路蓝灯5s,辅路红灯5s
begin
if(Cnt60<=55)
begin
LedR_1<=1;
LedG_1<=1;
LedB_1<=0;
LedR_2<=0;
LedG_2<=1;
LedB_2<=1;
end
else
state<=S3;
end
S3://主辅均5s黄
begin
if(Cnt60>=55)
begin
LedR_1<=0;
LedG_1<=0;
LedB_1<=1;
LedR_2<=0;
LedG_2<=0;
LedB_2<=1;
end
else
state<=S4;
end
S4://辅路绿35s,主路红灯20s
begin
if(Cnt60<=35)
begin
LedR_1<=0;
LedG_1<=1;
LedB_1<=1;
LedR_2<=1;
LedG_2<=0;
LedB_2<=1;
end
else
state<=S5;
end
S5://辅路黄灯5s,主路红灯5s
begin
if(Cnt60<=40)
begin
LedR_1<=0;
LedG_1<=1;
LedB_1<=1;
LedR_2<=0;
LedG_2<=0;
LedB_2<=1;
end
else
state<=S6;
end
S6://辅路蓝灯15s,主路红灯15s
begin
if(Cnt60<=55)
begin
LedR_1<=0;
LedG_1<=1;
LedB_1<=1;
LedR_2<=1;
LedG_2<=1;
LedB_2<=0;
end
else
state<=S7;
end
S7://主辅路均黄灯5s
begin
if(Cnt60<=60)
begin
LedR_1<=0;
LedG_1<=0;
LedB_1<=1;
LedR_2<=0;
LedG_2<=0;
LedB_2<=1;
end
else
state<=S0;
end
default
begin
LedR_1<=0;
LedG_1<=0;
LedB_1<=0;
LedR_2<=0;
LedG_2<=0;
LedB_2<=0;
end
endcase
end
end
assign {led17,led16,led15}=state;
endmodule
👆以上为总代码
任务要求:
东西方向:绿灯45s,黄灯5s,左转灯5s,黄灯5s,红灯45s,黄灯5s
南北方向:红灯55s,黄灯5s,绿灯35s,黄灯5s,左转灯15s,黄灯5s
定义:
module traffic(Clk_12M,Rst,LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2,led15,led16,led17);
parameter S0 = 0; //主路绿灯,支路红灯
parameter S1 = 1; //主路黄灯,支路红灯
parameter S2 = 2; //主路蓝灯,支路红灯
parameter S3 = 3; //主路黄灯,支路黄灯
parameter S4 = 4; //主路红灯,支路绿灯
parameter S5 = 5; //主路红灯,支路黄灯
parameter S6 = 6; //主路红灯,支路蓝灯
parameter S7 = 7; //主路黄灯,支路黄灯
input Clk_12M,Rst;
output LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2;
output led15,led16,led17;
reg LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2;
reg Clk_1Hz;//分频器
reg [31:0]Cnt_1Hz;//计数器
描述了一个红绿灯控制器模块(traffic),该模块接收一个12MHz的时钟信号(Clk_12M)和一个复位信号(Rst)。同时,它还有一些控制信号(LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2,led15,led16,led17)用于控制红绿灯的亮灭。
代码中使用了几个参数(parameter)来定义不同状态下的红绿灯控制。每个状态用一个唯一的标识符(S0,S1,S2,...,S7)来表示。
在输入信号的部分,有两个输入信号:时钟信号(Clk_12M)和复位信号(Rst)。
输出信号部分包括三对红绿灯的控制信号(LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2)以及三个额外的LED控制信号(led15,led16,led17)。
在变量定义部分,使用了几个寄存器(reg)来存储输出信号的状态变化。其中,LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2用于控制红绿灯的亮灭,而Clk_1Hz和Cnt_1Hz则用于实现分频器和计数器。
这段代码实现了一个红绿灯控制器,通过不同的状态(S0到S7)控制红绿灯以及三个额外的LED的亮灭情况。根据时钟信号和计数器的变化,在适当的时刻切换不同的状态,并相应地改变输出信号的状态。
分频器模块设置:
always@(posedge Clk_12M or negedge Rst)
begin
if(!Rst)
begin
Cnt_1Hz<=1;
Clk_1Hz<=1; //分频器和计数器全部设置为初值1
end
else
begin
if(Cnt_1Hz>=6000000)//当计数器大于等于25的10的六次方
begin
Cnt_1Hz<=1;//计数器置一
Clk_1Hz<=~Clk_1Hz;//分频器取反
end
else
Cnt_1Hz<=Cnt_1Hz+1;
end
end
/*计数器模块*/
reg[7:0]Cnt60;
always@(posedge Clk_1Hz or negedge Rst)
begin
if(!Rst)
begin
Cnt60<=0;
end
else
begin
if(Cnt60>=60)
begin
Cnt60<=0;//60清零
end
else
Cnt60<=Cnt60+1;
end
end
描述了一个时钟模块,其中包含了一个12MHz时钟信号(Clk_12M)和一个复位信号(Rst)。该代码的功能是生成一个1Hz的时钟(Clk_1Hz)和一个60Hz的计数器(Cnt60)。
首先,在时钟的上升沿或复位信号的下降沿发生时,进入了模块的主要过程部分(begin)。在复位信号为低电平(!Rst)时,执行以下操作:
1. 将一个名为Cnt_1Hz的变量置为1,表示1Hz的计数器的初始值。
2. 将一个名为Clk_1Hz的变量置为1,表示1Hz的时钟的初始值。
接着,在复位信号为高电平(Rst)时,执行以下操作:
1. 如果1Hz的计数器(Cnt_1Hz)的值大于等于6000000(表示经过了25的10的6次方个时钟周期),则执行以下操作:
- 将1Hz的计数器(Cnt_1Hz)置为1,重新开始计数。
- 将1Hz的时钟(Clk_1Hz)取反。
2. 否则,将1Hz的计数器(Cnt_1Hz)的值加1。
另外,代码中还包含了一个名为Cnt60的8位寄存器,用于实现60Hz的计数器功能。在1Hz的时钟(Clk_1Hz)的上升沿或复位信号的下降沿发生时,执行以下操作:
1. 如果复位信号为低电平(!Rst),则将60Hz的计数值(Cnt60)重置为0。
2. 否则,如果60Hz的计数值(Cnt60)大于等于60,则执行以下操作:
- 将60Hz的计数值(Cnt60)重置为0,重新开始计数。
3. 否则,将60Hz的计数值(Cnt60)加1。
这段代码实现了两个计数器,一个是1Hz的计数器,另一个是60Hz的计数器,并且在每秒和每分钟的特定时刻触发相应的操作。
状态转换及输出模块:
reg [2:0] state;
always@(posedge Clk_12M or negedge Rst)
begin
if(!Rst)
begin
LedR_1<=0;
LedG_1<=0;
LedB_1<=0;
LedR_2<=0;
LedG_2<=0;
LedB_2<=0;
end
else
begin
case(state)
S0://主路绿灯45s
begin
if(Cnt60<=45)
begin
LedR_1<=1;
LedG_1<=0;
LedB_1<=1;
LedR_2<=0;
LedG_2<=1;
LedB_2<=1;
end
else
state<=S1;
end
S1://主路黄灯5s
begin
if(Cnt60<=50)
begin
LedR_1<=0;
LedG_1<=0;
LedB_1<=1;
LedR_2<=0;
LedG_2<=1;
LedB_2<=1;
end
else
state<=S2;
end
S2://主路蓝灯15s
begin
if(Cnt60<=55)
begin
LedR_1<=1;
LedG_1<=1;
LedB_1<=0;
LedR_2<=0;
LedG_2<=1;
LedB_2<=1;
end
else
state<=S3;
end
S3://主辅均5s黄
begin
if(Cnt60>=55)
begin
LedR_1<=0;
LedG_1<=0;
LedB_1<=1;
LedR_2<=0;
LedG_2<=0;
LedB_2<=1;
end
else
state<=S4;
end
S4://辅路绿20s
begin
if(Cnt60<=20)
begin
LedR_1<=0;
LedG_1<=1;
LedB_1<=1;
LedR_2<=1;
LedG_2<=0;
LedB_2<=1;
end
else
state<=S5;
end
S5://辅路黄灯5s
begin
if(Cnt60<=25)
begin
LedR_1<=0;
LedG_1<=1;
LedB_1<=1;
LedR_2<=0;
LedG_2<=0;
LedB_2<=1;
end
else
state<=S6;
end
S6://辅路蓝灯15s
begin
if(Cnt60<=40)
begin
LedR_1<=0;
LedG_1<=1;
LedB_1<=1;
LedR_2<=1;
LedG_2<=1;
LedB_2<=0;
end
else
state<=S7;
end
S7://主辅路均黄灯5s
begin
if(Cnt60<=45)
begin
LedR_1<=0;
LedG_1<=0;
LedB_1<=1;
LedR_2<=0;
LedG_2<=0;
LedB_2<=1;
end
else
state<=S0;
end
default
begin
LedR_1<=0;
LedG_1<=0;
LedB_1<=0;
LedR_2<=0;
LedG_2<=0;
LedB_2<=0;
end
endcase
end
end
这部分代码定义了一个名为state的3位寄存器,用于存储红绿灯控制器的状态。在每个时钟上升沿或复位信号下降沿时,代码根据当前的状态进行操作。
在复位信号为低电平(!Rst)时,所有的LED控制信号被置零,表示将所有的红绿灯都关闭。
在复位信号为高电平(Rst)时,根据当前的状态(state),使用了一个case语句来进行不同状态的操作。
在S0状态下,主路的绿灯亮45秒。在该状态下,首先检查计数器的值(Cnt60是否小于等于45),如果是,则执行以下操作:
- LedR_1被置为1,表示主路红灯关闭。
- LedG_1被置为0,表示主路绿灯亮。
- LedB_1被置为1,表示主路蓝灯亮。
- LedR_2被置为0,表示支路红灯亮。
- LedG_2被置为1,表示支路绿灯亮。
- LedB_2被置为1,表示支路蓝灯亮。
如果计数器的值(Cnt60)超过了45,则将状态(state)切换至S1状态。
根据情况逐渐向下循环。