基于Verilog的十字路口交通灯控制电路设计


一、设计要求

设计并实现一个简单的十字路口交通灯控制电路。以4个红色指示灯、4个绿色指示灯和4个黄色指示灯模拟路口东西南北4个方向的红绿黄交通灯。控制这些灯,使它们安下列规律亮灭。
1、东西方向绿灯亮,南北方向红灯亮。东西方向通车,时间30秒;
2、东西方向黄灯闪烁,南北方向红灯亮,时间2秒。
3、东西方向红灯亮,南北方向绿灯亮。南北方向通车,时间30秒;
4、东西方向红灯亮,南北方向黄灯闪烁,时间2秒。
5、返回1,继续运行。


二、设计方案

设计一个有五个状态的状态机,其中一个为初始状态。如下图:
在这里插入图片描述
在状态S1~S4中,计数器在每个时钟上升沿加一。

在这里插入图片描述


三、电路原理图

在这里插入图片描述

  • 对上图局部放大处理:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

四、代码实现

1. Verilog代码:

module traffic_light(clk,rst_n,light_east,light_west,light_north,light_south);
input clk,rst_n;
output [2:0]light_east,light_north,light_south,light_west;
reg[2:0] light_east,light_north,light_south,light_west;
parameter
			S0=0,
			S1=1,
			S2=2,
			S3=3,
			S4=4;		
reg [2:0]state;
reg [5:0]cnt;
always @(posedge clk or negedge rst_n )
		begin  
        if(!rst_n) 
			begin
          {light_east,light_north,light_south,light_west}=12'b0;
          cnt <= 0;
          state <= S0;
         end
        else
          begin
          case (state)
      S0: begin            
          {light_east,light_north,light_south,light_west}=12'b1;
          state  <= S1;
          end
          
      S1:                   
         if(cnt==30) begin
          state  <= S2;
          cnt    <= 0;
          end
         else  begin 
          cnt    <= cnt + 1'b1;
          {light_east,light_west,light_north,light_south}=12'b100_100_001_001;
          state  <= S1;
          end
                
      S2:               
         if(cnt==2) begin
          state  <= S3;
          cnt    <= 0;
          end
         else  begin 
          cnt    <= cnt + 1'b1;
          {light_east,light_west,light_north,light_south}=12'b010_010_001_001;
          state  <= S2;
          end
          
      S3:                 
         if(cnt==30) begin
          state  <= S4;
          cnt    <= 0;
          end
         else  begin 
          cnt    <= cnt + 1'b1;
          {light_east,light_west,light_north,light_south}=12'b001_001_100_100;
          state  <= S3;
          end   
       S4:               
         if(cnt==2) begin
          state  <= S1;
          cnt    <= 0;
          end
         else  
				begin 
          cnt   <= cnt + 1'b1;
          {light_east,light_west,light_north,light_south}=12'b001_001_010_010;
          state  <= S4;
          end   
        endcase
     end
end
endmodule              

2. Testbench代码

`timescale 1 ps/ 1 ps
module traffic_light_vlg_tst();
// constants                                           
// general purpose registers
reg eachvec;
// test vector input registers
reg clk;
reg rst_n;
// wires                                               
wire [2:0]  light_east;
wire [2:0]  light_north;
wire [2:0]  light_south;
wire [2:0]  light_west;

// assign statements (if any)                          
traffic_light i1 (
// port map - connection between master ports and signals/registers   
	.clk(clk),
	.light_east(light_east),
	.light_north(light_north),
	.light_south(light_south),
	.light_west(light_west),
	.rst_n(rst_n)
);
initial                                                
begin                                                  
clk=0;
rst_n=0;
#20 rst_n=1;
#1000 $stop;                                       
$display("Running testbench");                       
end                                                    
always                                                                   
begin                                                  
#1 clk=~clk;                                                                                                                        
// --> end                                             
end                                                    
endmodule

五、仿真结果

light_east, light_south, light_west, light_north分别为东、南、西、北的信号灯,高位至低位依次为绿灯、黄灯、红灯。
左边下面四个对应的变量名分别为light_east, light_north, light_south, light_west。
在这里插入图片描述
在这里插入图片描述

  • 20
    点赞
  • 211
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值