使用verilog中的计数器知识,设计一个南北交通灯

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的小白,有很多的不足,如有错误,或者更好的办法,请大家指正,感谢!!!

  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余味_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值