1.具体要求
1.复位时,东西方向均是绿灯亮,南北方向是红灯亮。
2.复位后,东西方向先绿灯亮10秒,然后黄灯5秒,与此同时,南北方向为红灯15s。再之后,东西方向红灯15s,与此同时,南北方向先是绿灯亮10s,然后黄灯5s。
3.重复步骤2.
2.固定参数
1.clk 50mhz
2.rst_n 复位信号
3.led_east[2:0],led_west[2:0],led_north[2:0],led_south[2:0].其中1为亮,0为灭。
4.计数器 cnt,用来计数到50_000_000,也就是1秒。
5.time_30s,用来计数30s。
3.实现代码
module nanbeijiaotongdeng(
input clk ,
input rst_n ,
output [2:0] dout_east ,
output [2:0] dout_west ,
output [2:0] dout_north,
output [2:0] dout_south,
output [31:0] jishu,
output [4:0] sanshimiao
);
reg [2:0] led_east;
reg [2:0] led_west;
reg [2:0] led_south;
reg [2:0] led_north;
reg [31:0] cnt;
reg [4:0] time_30s;
parameter t = 50_000_000 - 1;
always@ (posedge clk or negedge rst_n)begin
if(!rst_n)
cnt <= 0;
else if (cnt == t)
cnt <= 0;
else
cnt <= cnt + 1;
end
always@ (posedge clk or negedge rst_n)begin
if(!rst_n)
time_30s <= 0;
else if (cnt == t)
if(time_30s == 29)
time_30s <= 0;
else
time_30s <= time_30s + 1;
end
//复位时,东西方向均是绿灯亮,复位后,东西方向先绿灯亮10秒,然后黄灯5秒,再之后,东西方向红灯15秒。//
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
led_east <= 3'b100;
led_west <= 3'b100;
end
else if(time_30s == 9)begin
led_east <= 3'b010;
led_west <= 3'b010;
end
else if(time_30s == 14)begin
led_east <= 3'b001;
led_west <= 3'b001;
end
else if(time_30s == 29)begin
led_east <= 3'b100;
led_west <= 3'b100;
end
end
assign dout_east = led_east;
assign dout_west = led_west;
//复位时,南北方向是红灯亮。复位后,东西方向先红灯15秒,之后绿灯10秒,再之后,黄灯5秒。
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
led_south <= 3'b001;
led_north <= 3'b001;
end
else if(time_30s == 14)begin
led_south <= 3'b100;
led_north <= 3'b100;
end
else if(time_30s == 24)begin
led_south <= 3'b010;
led_north <= 3'b010;
end
else if(time_30s == 29)begin
led_south <= 3'b100;
led_north <= 3'b100;
end
end
assign dout_south = led_south;
assign dout_north = led_north;
assign jishu = cnt;
assign sanshimiao = time_30s;
endmodule
4.仿真模块
module nanbeijiaotongdeng_m();
reg clk ;
reg rst_n ;
wire [2:0] dout_east ;
wire [2:0] dout_south ;
wire [2:0] dout_west ;
wire [2:0] dout_north ;
wire [31:0] jishu;
wire [4:0] sanshimiao;
initial begin
clk = 0;
rst_n = 0;
#200
rst_n = 1;
end
always #10 clk = ~clk;
nanbeijiaotongdeng nanbeijiaotongdeng_u(
.clk (clk),
.rst_n (rst_n),
.dout_east (dout_east),
.dout_west (dout_west),
.dout_north (dout_north),
.dout_south (dout_south),
.jishu (jishu),
.sanshimiao (sanshimiao)
);
endmodule
5.仿真结果
此次仿真所用软件为vivado,设置得计数个数为10,也就是cnt计数到10个时钟周期为1秒,时钟周期为20ns一个,则图中的20ns为1s。在图中可以看到,东西方向的交通灯绿灯先亮10秒,之后黄灯5秒,最后红灯15s。而南北方向的交通灯先红灯15s,再绿灯10s,最后黄灯5s。
作为一个刚刚接触fpga的小白,有很多的不足,如有错误,或者更好的办法,请大家指正,感谢!!!