##一、实验任务要求
1)实现一交通十字路口处红绿灯的基本定时控制功能,要求东西方向灯色循环为绿灯45秒,黄灯5秒,左拐灯15秒,黄灯5秒,红灯40秒,黄灯5秒;南北方向灯色循环为红灯65秒,黄灯5秒,绿灯20秒,黄灯5秒,左拐灯15秒,黄灯5秒。
2)实现东西方向和南北方向各种灯的倒计时数码显示功能。
##二、LED分模块设计(用于调用使用)
module LED (seg_data_1,seg_data_2,seg_led_1,seg_led_2);
input [3:0] seg_data_1; //数码管需要显示0~9十个数字,所以最少需要4位输入做译码
input [3:0] seg_data_2; //小脚丫上第二个数码管
output [8:0] seg_led_1; //在小脚丫上控制一个数码管需要9个信号 MSB~LSB=DIG、DP、G、F、E、D、C、B、A
output [8:0] seg_led_2; //在小脚丫上第二个数码管的控制信号 MSB~LSB=DIG、DP、G、F、E、D、C、B、A
reg [8:0] seg [9:0]; //定义了一个reg型的数组变量,相当于一个10*9的存储器,存储器一共有10个数,每个数有9位宽
initial //在过程块中只能给reg型变量赋值,Verilog中有两种过程块always和initial
//initial和always不同,其中语句只执行一次
begin
seg[0] = 9'h3f; //对存储器中第一个数赋值9'b00_0011_1111,相当于共阴极接地,DP点变低不亮,7段显示数字 0
seg[1] = 9'h06; //7段显示数字 1
seg[2] = 9'h5b; //7段显示数字 2
seg[3] = 9'h4f; //7段显示数字 3
seg[4] = 9'h66; //7段显示数字 4
seg[5] = 9'h6d; //7段显示数字 5
seg[6] = 9'h7d; //7段显示数字 6
seg[7] = 9'h07; //7段显示数字 7
seg[8] = 9'h7f; //7段显示数字 8
seg[9] = 9'h6f; //7段显示数字 9
end
assign seg_led_1 = seg[seg_data_1]; //连续赋值,这样输入不同四位数,就能输出对于译码的9位输出
assign seg_led_2 = seg[seg_data_2];
endmodule
##三、主程序代码
module traffic1(Clk_12M,Rst,LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2,Seg7_VH,Seg7_VL,led15,led16,led17,ledCntDis);
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 [8:0]Seg7_VH,Seg7_VL;
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;//计数器
output reg[3:0] ledCntDis;
该模块是一个交通信号灯的Verilog描述,通过控制LED灯和数码管来显示不同的交通信号状态。以下是对该模块的解释:
输入:
- Clk_12M:12MHz的时钟信号
- Rst:复位信号
输出:
- LedR_1, LedG_1, LedB_1:控制第一个交通信号灯的红、绿、蓝LED灯
- LedR_2, LedG_2, LedB_2:控制第二个交通信号灯的红、绿、蓝LED灯
- Seg7_VH, Seg7_VL:控制数码管显示的高位和低位数码
- led15, led16, led17:辅助LED灯输出
- ledCntDis:控制数码管显示的计数器输出
内部变量:
- Clk_1Hz:1Hz的时钟信号,通过分频器实现
- Cnt_1Hz:1Hz的计数器,用于控制信号灯状态的切换
参数:
- S0-S7:交通信号灯的不同状态,例如S0表示主路绿灯,支路红灯
该模块通过时钟信号进行节拍控制,通过状态机的方式实现交通信号灯的循环切换。通过适时改变LED灯和数码管的输出,实现不同状态下的交通信号显示。具体的状态与信号灯显示对应关系是根据参数定义的。
在每个时钟周期,计数器Cnt_1Hz会自增,并根据计数器的值切换交通信号灯的状态和LED灯的输出。同时,数码管和辅助LED灯也会根据需要进行相应的显示。
需要注意的是,该模块中的LedR_1, LedG_1等输出信号使用reg声明,表示它们是可寄存器的输出信号。
/*分频器模块*/
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
这部分代码描述了一个分频器模块,用于将输入的12MHz时钟信号分频为1Hz的信号。以下是对代码的解释:
在`always @(posedge Clk_12M or negedge Rst)`的敏感列表中,当输入的时钟信号Clk_12M上升沿或复位信号Rst的下降沿发生时,会执行下面的代码块。
根据复位信号Rst的状态,通过if-else语句进行条件判断和处理:
- 如果复位信号Rst为低电平(即复位有效),则在分频器和计数器的初值都设置为1,表示初始状态。
- 如果复位信号Rst为高电平(即复位无效),则执行下面的逻辑。
在非复位状态下,判断计数器Cnt_1Hz是否大于等于6000000(即25 * 10^6),如果是,则表示达到了1Hz的分频要求:
- 将计数器Cnt_1Hz重新置为1。
- 将分频器Clk_1Hz取反,实现1Hz的方波输出。
如果计数器Cnt_1Hz未达到指定值,则将计数器的值加1。
通过这段代码