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

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

  • 一、设计要求
  • 二、设计方案
  • 三、电路原理图
  • 四、代码实现
      • 1. Verilog代码:
      • 2. Testbench代码
  • 五、仿真结果


一、设计要求

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


二、设计方案

设计一个有五个状态的状态机,其中一个为初始状态。如下图:
基于Verilog的十字路口交通灯控制电路设计_第1张图片
在状态S1~S4中,计数器在每个时钟上升沿加一。

基于Verilog的十字路口交通灯控制电路设计_第2张图片


三、电路原理图

基于Verilog的十字路口交通灯控制电路设计_第3张图片

  • 对上图局部放大处理:
    基于Verilog的十字路口交通灯控制电路设计_第4张图片
    基于Verilog的十字路口交通灯控制电路设计_第5张图片
    基于Verilog的十字路口交通灯控制电路设计_第6张图片
    基于Verilog的十字路口交通灯控制电路设计_第7张图片

四、代码实现

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。
在这里插入图片描述
基于Verilog的十字路口交通灯控制电路设计_第8张图片

你可能感兴趣的:(fpga开发)