精华内容
下载资源
问答
  • 交通灯verilog代码
    千次阅读
    2021-01-05 20:29:36

    数字电路设计@heyian910

    verilog数字电路实验 交通灯

    源码

    module main(
    		input clk,
    		input clr,
    		input start,
    		input stopa,
    		input stopb,
    		input pause,
    		output [3:0] AN,
    		output [7:0] SEG,
    		output reg [2:0] LA,LB//红 黄 绿
        );
    	 reg [1:0] state1,state2;
    	 reg newstart = 1'b1;  //
    	 reg [15:0] Data;
    	 reg [3:0] Data_4;
    	 wire [1:0] BIT_SEL;
    	 reg Increment;
    	 integer clk_num=0;
    	 delay_5ms uu1(clk,BIT_SEL);
    	 SMG uu2(Data_4,BIT_SEL,SEG,AN);
    	 
    	 initial begin Data <= 16'b0; Increment = 1'b0;end
    	 
    	 always@(posedge clk)
    	 begin
    		if(clk_num<25000000) //设置数字跳转频率
    		begin
    			clk_num = clk_num+1;
    			Increment = 1'b0;
    		end
    		else
    		begin
    			clk_num = 0;
    			Increment = 1'b1;
    		end
    	 end
    	 
    always@(posedge clr  or posedge Increment )
    if(clr)
    begin
       Data <= 16'b1010101010101010;//输出“----”
    	LA <= 3'b100;
    	LB <= 3'b100;
    	state1 <= 2'b00;
    	state2 <= 2'b00;
    	newstart = 1'b1;
    end		
    else if(stopa)
         begin
    		 Data <= 16'b1111111111111111;//熄灭
    		 LA <= 3'b100;
    		 LB <= 3'b001;
    	  end
    	  else if(stopb)
    	       begin
    		      Data <= 16'b1111111111111111;//熄灭
    		      LA <= 3'b001;
    		      LB <= 3'b100;
    	       end
    	       else if(start)                      //系统开始运行
    	            begin
    		           if(!pause)
    		           begin
    			          if(newstart==1'b1)
    			          begin
    				         Data <=16'b0010000000110000;//30s 40s          111111111111111111111111
    				         LA<=3'b001; //主绿 
    				         LB<=3'b100;  //次红
    				         newstart = 1'b0;
    			          end
    			          if(Data[3:0]==4'b0000)  //次道次位为0
    			          begin
    				         if(Data[7:4]==4'b0000)
    				         begin
    					        if(state2==2'b00)
    					        begin
    						       state2<=2'b01;
    						       Data[7:0]<=8'b00010101;//15s            33333333333333333333333333
    						       LB<=3'b001; //次绿
    					        end
    					        else if(state2==2'b01)
    					             begin
    						            state2<=2'b10;
    						            Data[7:0]<=8'b0000101;//5s               4444444444444444444444444
    						            LB<=3'b010; //次黄
    					             end
    					             else if(state2==2'b10)
    					                  begin
    						                 state2 <= 2'b00;
    						                 Data[7:0]<=8'b01000000;//40s
    						                 LB<=3'b100;  //次红·
    					                  end
    				         end
    				         else
    				         begin
    					        Data[3:0]<=4'b1001;
    					        Data[7:4]<=Data[7:4]-4'b0001;
    				         end
    			          end	
    			          else
    						 begin
    				         Data[3:0]<=Data[3:0]-4'b0001;
    						 end
    			          if(Data[11:8]==4'b0000) //主道次位为0
    			          begin
    				         if(Data[15:12]==4'b0000)
    				         begin
    					        if(state1==2'b00)
    					        begin
    						       state1<=2'b01;
    						       Data[15:8]<=8'b00010000;//10s             2222222222222222222222222
    						       LA<=3'b010; //主黄
    					        end
    					        else if(state1==2'b01)
    					             begin
    						            state1<=2'b10;
    						            Data[15:8] <=8'b00100000;//20s            3333333333333333333333333
    						            LA<=3'b100; //主红
    					             end
    					             else if(state1==2'b10)
    					                  begin
    						                 state1 <= 2'b00;
    						                 Data[15:8] <=8'b00110000;//30s
    						                 LA<=3'b001; //主绿
    					                  end
    				         end
    				         else
    				         begin
    					        Data[11:8]<=4'b1001;
    					        Data[15:12]<=Data[15:12]-4'b0001;
    				         end
    			          end
    			          else
    						 begin
    				         Data[11:8]<=Data[11:8]-4'b0001;
    						 end
    			        end
                   end
    
    always @(*)	// case(BIT_SEL)控制每个数码管显示对应位的数字
    	  //根据BIT_SEL,将要显示的4位十六进制数赋给Data_4
    	  begin
    			case(BIT_SEL)
    				2'b00:Data_4[3:0]<=Data[15:12];
    				2'b01:Data_4[3:0]<=Data[11:8];
    				2'b10:Data_4[3:0]<=Data[7:4];
    				2'b11:Data_4[3:0]<=Data[3:0];
    				default:Data_4[3:0]<=Data[3:0];
    			endcase
    	  end
    endmodule
    
    module delay_5ms(clk,BIT_SEL);
    	input clk;
    	output reg[1:0] BIT_SEL;
    	integer cnt=0;
    	initial begin BIT_SEL <= 2'b00;end
    	always@(posedge clk)
    	begin
    				cnt<=cnt+1;
    				if(cnt>50000)
    				begin
    					BIT_SEL<=BIT_SEL+2'b01;
    					cnt<=0;
    				end
    	end
    endmodule
    
    module SMG(
    		input wire[3:0] data,		 //要显示的数字
          input wire[1:0] bit_sel,    //数码管选择,00~11 最左到最右
          output reg[7:0] seg,		    //段选
          output reg[3:0] AN			 //位选
    );
    	always @(*)
    		begin
    			case(bit_sel)
    				2'b00:AN<=4'b1000;
    				2'b01:AN<=4'b1001;
    				2'b10:AN<=4'b1010;
    				2'b11:AN<=4'b1011;
    				default:AN<=4'b1111;
    			endcase
    		end
    	always @(*)
    		begin
    			case(data[3:0])
    				4'b0000:seg[7:0]<=8'b00000011;
    				4'b0001:seg[7:0]<=8'b10011111;
    				4'b0010:seg[7:0]<=8'b00100101;
    				4'b0011:seg[7:0]<=8'b00001101;
    				4'b0100:seg[7:0]<=8'b10011001;
    				4'b0101:seg[7:0]<=8'b01001001;
    				4'b0110:seg[7:0]<=8'b01000001;
    				4'b0111:seg[7:0]<=8'b00011111;
    				4'b1000:seg[7:0]<=8'b00000001;
    				4'b1001:seg[7:0]<=8'b00001001;
    				4'b1010:seg[7:0]<=8'b10111111;
    				default:seg[7:0]<=8'b11111111;
    			endcase
    		end
    endmodule
    

    测试样例(激励文件)

    initial begin
    		// Initialize Inputs
    		clk = 0;
    		clr = 0;
    		start = 0;
    		stopa = 0;
    		stopb = 0;
    		pause = 0;
            #100;
    		// Wait 100 ns for global reset to finish
    		
            
    		// Add stimulus here
    		clr=1;
    		#50;
    		
    		clr=0;
    		start=1;
    	 end
          always
    		begin
    			clk = ~clk;
    			#50;
    		end
    endmodule
    
    

    进行仿真的时候建议将源码中的clk_num和cnt所需满足的条件改小,然后让仿真波形图多跑一会

    管脚配置

    NET "AN[3]" LOC = L21;
    NET "AN[3]" IOSTANDARD = LVCMOS18;
    NET "AN[2]" LOC = M22;
    NET "AN[2]" IOSTANDARD = LVCMOS18;
    NET "AN[1]" LOC = M21;
    NET "AN[1]" IOSTANDARD = LVCMOS18;
    NET "AN[0]" LOC = N22;
    NET "AN[0]" IOSTANDARD = LVCMOS18;
    NET "SEG[7]" LOC = H19;
    NET "SEG[7]" IOSTANDARD = LVCMOS18;
    NET "SEG[6]" LOC = G20;
    NET "SEG[6]" IOSTANDARD = LVCMOS18;
    NET "SEG[5]" LOC = J22;
    NET "SEG[5]" IOSTANDARD = LVCMOS18;
    NET "SEG[4]" LOC = K22;
    NET "SEG[4]" IOSTANDARD = LVCMOS18;
    NET "SEG[3]" LOC = K21;
    NET "SEG[3]" IOSTANDARD = LVCMOS18;
    NET "SEG[2]" LOC = H20;
    NET "SEG[2]" IOSTANDARD = LVCMOS18;
    NET "SEG[1]" LOC = H22;
    NET "SEG[1]" IOSTANDARD = LVCMOS18;
    NET "SEG[0]" LOC = J21;
    NET "SEG[0]" IOSTANDARD = LVCMOS18;
    NET "clk" IOSTANDARD = LVCMOS18;
    NET "clk" LOC = H4;
    
    # PlanAhead Generated IO constraints 
    
    NET "LB[2]" IOSTANDARD = LVCMOS18;
    NET "LB[1]" IOSTANDARD = LVCMOS18;
    NET "LB[0]" IOSTANDARD = LVCMOS18;
    NET "LA[2]" IOSTANDARD = LVCMOS18;
    NET "LA[1]" IOSTANDARD = LVCMOS18;
    NET "LA[0]" IOSTANDARD = LVCMOS18;
    NET "clr" IOSTANDARD = LVCMOS18;
    NET "pause" IOSTANDARD = LVCMOS18;
    NET "start" IOSTANDARD = LVCMOS18;
    NET "stopa" IOSTANDARD = LVCMOS18;
    NET "stopb" IOSTANDARD = LVCMOS18;
    
    # PlanAhead Generated physical constraints 
    
    NET "LA[2]" LOC = R1;
    NET "LA[1]" LOC = P2;
    NET "LA[0]" LOC = P1;
    NET "LB[2]" LOC = N2;
    NET "LB[1]" LOC = M1;
    NET "LB[0]" LOC = M2;
    NET "pause" LOC = R4;
    NET "clr" LOC = T3;
    NET "start" LOC = U3;
    NET "stopa" LOC = T4;
    NET "stopb" LOC = V3;
    
    # PlanAhead Generated IO constraints 
    
    NET "clk" PULLDOWN;
    NET "clr" PULLDOWN;
    NET "pause" PULLDOWN;
    NET "start" PULLDOWN;
    NET "stopa" PULLDOWN;
    NET "stopb" PULLDOWN;
    
    
    更多相关内容
  • EDA交通灯verilog代码

    2018-07-07 17:50:22
    EDA课程实验交通灯代码,里面有实现的代码,以及操作步骤文档和仿真的文件,可以直接连接实验箱验证设计
  • quartus 完整工程。 工程 , 交通灯 , 源代码
  • 可以实现日常生活中的交通灯系统,实现简单的红,黄,绿转换附带有数码管显示
  • 这是一份基于Verilog交通灯设计工程文件,已经在QUARTUS II 8.0 (32-BIT)上测试通过,而关于十字路口交通灯控制系统的工作原理的资料建议自行到网上找一找。
  • verilog hdl 交通灯代码

    2014-03-27 15:21:57
    主要是一个关于红绿灯的一个简单地verilog hdl 代码
  • 代码需要用到EL-SOPC4000试验箱上交通灯模块中的发光二极管,即红、黄、绿各三个。依人们的交通常规,“红灯停,绿灯行,黄灯提醒”。其交通灯的亮灭规律为:初始态是两个路口的红灯全亮,之后东西路口的绿灯亮,...
  • 交通灯电路及verilog实现

    千次阅读 2022-03-28 10:04:30
    延时进入 S0 二、verilog实现 // Design Name: traffic_light // Module Name: traffic_light // Description: ↓ ↓ ↓ // Create Date: 2022/3/28 /* state: s0: main-green, branch-red, when x=1 s0->s1 s1: ...

    一、功能

    功能描述
    1 )默认主干道绿灯;
    2 )检测到支路有车 (X=1) ,主路黄灯亮,再主路
    红灯、支路红灯,再主路红灯、支路绿灯;
    3 )当支路没车(X=0),绿灯 黄灯 红灯,主干道绿灯;
    状态描述:
    S0: 主干道绿灯亮,支路红灯 ; 检测到支路有车 (X=1), 进入 S1;
    S1: 主干道黄灯亮,支路红灯 , 延时进入 S2
    S2: 主干道红灯亮,支路红灯 , 延时进入 S3
    S3: 主干道红灯亮,支路绿灯;没车进入 S4;
    S4: 主干道红灯亮,支路黄灯;延时进入 S0

     

     二、verilog实现

    
    // Design Name: traffic_light
    // Module Name: traffic_light               
    // Description:  ↓ ↓ ↓
    // Create Date: 2022/3/28
    
    /*
    
    state:
    s0: main-green,     branch-red,     when x=1    s0->s1
    s1: main-yellow,    branch-red,     delay       s1->s2
    s2: main-red,       branch-red,     delay       s2->s3
    s3: main-red,       branch-green,   when x=0    s3->s4
    s4: main-red,       branch-yellow,  delay       s4->s1
    
    port:
    input:  clk,rst_n,x
    output: main, branch
    
    */
    
    
    `timescale 1ns / 1ps
    
    module traffic_light(
        input   clk,
        input   rst_n,
        input   x,
        output  reg [1:0] main,
        output  reg [1:0] branch
    );
    
    parameter   green   = 2'd1,
               	yellow  = 2'd2,
    			red     = 2'd3;
    
    parameter   s0 = 3'd0,
                s1 = 3'd1,
                s2 = 3'd2,
                s3 = 3'd3,
                s4 = 3'd4;
    
    
    reg [3:0] state;
    reg [3:0] next_state;
    
    //state transfer
    always @(posedge clk or negedge rst_n) begin
        if(!rst_n)
            state <= s0;
        else
            state <= next_state;
    end
    
    //transfer logic
    always @(*)begin
        case(state)
            s0:                 next_state = x ? s1 : s0;
            s1:         #600    next_state = s2;
            s2:         #600    next_state = s3;
            s3:                 next_state = x ? s3 : s4;
            s4:         #600    next_state = s0;
            default:            next_state = state;
         endcase
    end
    
    //output
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            main    <= green;
            branch  <= red;
        end
        else begin
            case(state)
            s0:         begin       main <= green;        branch <= red;       end
            s1:         begin       main <= yellow;       branch <= red;       end
            s2:         begin       main <= red;          branch <= red;       end
            s3:         begin       main <= red;          branch <= green;     end
            s4:         begin       main <= red;          branch <= yellow;    end
            default:    begin       main <= green;        branch <= red;       end
            endcase
        end
    end
    
    endmodule
    

    tb文件:

    `timescale 1ns / 1ps
    
    module tb_traffic_light();
    
    parameter period = 10; //100mhz
    
    reg     clk;
    reg     rst_n;
    reg     x;
    wire    [1:0] main;
    wire    [1:0] branch;
    
    always #(period/2) clk = ~clk;
    
    initial begin
        clk = 1'b0;
        rst_n = 1'b0;
        x = 0;
        #60
        rst_n = 1'b1;
        #1234
        x = 1;
        #1234
        x = 0;
    end
    
    
    traffic_light u_traffic_light(clk,rst_n,x,main,branch);
    
    
    endmodule
    

     三、仿真&综合

    仿真结果:

    综合结果:

     

    展开全文
  • verilog交通灯仿真

    2022-05-24 16:58:20
    module traffic(en,clk,rst,num1,num2,light1,light2,out1,out2,out3,out4,in1,in2);... endcase end endmodule 软件是quartus,交通灯仿真不出波形,设置好输入后输出全是0 请问有人知道怎么设置吗
  • verilog编写实现交通灯的控制 实现红绿灯转换 并且用数码管进行计数 对于刚刚入门的人是个很好的选择 因为代码比较简单
  • verilog实现的交通灯,用状态机实现,七段数码管显示,包含详细讲解,注释,testbench,波形图以及实验报告!内部只写了单方向的交通灯,可以根据自己需要进行修改。
  • 基于basys3板子的交通灯控制系统,使用vavido进行编写
  • 用vivado软件编写的交通灯代码,模拟交通路口多个交通指示灯联合作用
  • 01 交通信号(附源码)

    千次阅读 多人点赞 2022-05-09 17:58:25
    FSM 四、Design and Functional Verification (1)RTL (2)Test Bench 五、Result (1)复位 (2)倒计时 (3)最终结果 一、Overview (1)Demand   设计一个交通信号控制器,东西和南北方向各有四盏,分别...

    完整程序(点击下载
    虚拟机:VMware -14.0.0.24051
    环 境:ubuntu 18.04.1
    脚 本:makefile(点击直达
    工 具:vcs 和 verdi



    一、Overview

    (1)Demand

      设计一个交通信号灯控制器,东西和南北方向各有四盏灯,分别为左拐灯绿灯黄灯和红灯。东西方向信号灯的时间为红灯55s,绿灯40s,黄灯5s,左拐灯15s;南北方向信号灯的时间为红灯65s,绿灯30s,黄灯5s,左拐灯15s.

    (2)Theory

    在这里插入图片描述


    二、Interface Description

    Signal NameWidthDirectionDescription
    clk1inputSystem clk signal, 1Hz
    rst_n1inputSystem reset signal
    light_ew_ZRYG4output东西方向的左转、红、黄、绿灯
    light_ns_ZRYG4output南北方向的左转、红、黄、绿灯
    time_ew_cnt6output东西方向的倒计时
    time_ns_cnt7output南北方向的倒计时

    三、EW_FSM

    在这里插入图片描述

    交通信号灯非常适合使用状态机实现,这个模块采用一个状态机,东西方向状态机一共有6个状态,其中南北方向和东西方向时间上是一个互补的状态。(为什么不使用两个状态机,因为它们时间上是互补的状态,只要其中一个方向的状态和倒计时已知,就可以控制另外一个方向的灯,在资源上,节省一个方向的状态机资源。


    四、Design and Functional Verification

    (1)RTL

    //-- modified by xlinxdu, 2022/05/08
    module traffic_lights 
    #(
    //-- time
      parameter G_TIME_EW = 6'd40,
      parameter Y_TIME_EW = 6'd5 ,
      parameter R_TIME_EW = 6'd55,
      parameter Z_TIME_EW = 6'd15,
      
      parameter G_TIME_NS = 7'd30,
      parameter Y_TIME_NS = 7'd5 ,
      parameter R_TIME_NS = 7'd65,
      parameter Z_TIME_NS = 7'd15
    )(
      input            clk_i        ,
      input            rst_n_i      ,
    
    //-- ew: east and west direction
    //-- ns: north-south direction
    //-- light,[3:0] green\yellow\red\left turn light
      output reg [3:0] light_ew_ZRYG,
      output reg [3:0] light_ns_ZRYG,
    
    //-- counter
      output reg [5:0] time_ew_cnt  ,
      output reg [6:0] time_ns_cnt
    );
    
    //FSM signal
      parameter G_LIGHT_EW  = 6'b00_0001;
      parameter Y_LIGHT_EW1 = 6'b00_0010;
      parameter R_LIGHT_EW  = 6'b00_0100;
      parameter Y_LIGHT_EW2 = 6'b00_1000;
      parameter Z_LIGHT_EW  = 6'b01_0000;
      parameter Y_LIGHT_EW3 = 6'b10_0000;
    
      reg [5:0] cur_state_ew;
      reg [5:0] nxt_state_ew;
      reg       ew_cnt_en   ;
      reg       ns_cnt_en   ;
    
    /*-----------------------------------------------\
     ------------------- ew counter  ----------------
    \-----------------------------------------------*/
    always @ (posedge clk_i or negedge rst_n_i) begin
      if (!rst_n_i) begin
        ew_cnt_en   <= 1'b1     ;
        time_ew_cnt <= 0;
      end
      else if (ew_cnt_en && (nxt_state_ew == R_LIGHT_EW)) begin
        time_ew_cnt <= R_TIME_EW;
        ew_cnt_en   <= 1'b0     ;
      end
      else if (ew_cnt_en && (nxt_state_ew == Y_LIGHT_EW1 )) begin
        time_ew_cnt <= Y_TIME_EW;
        ew_cnt_en   <= 1'b0     ;
      end
      else if (ew_cnt_en && (nxt_state_ew ==  Y_LIGHT_EW2 )) begin
        time_ew_cnt <= Y_TIME_EW;
        ew_cnt_en   <= 1'b0     ;
      end
      else if (ew_cnt_en && (nxt_state_ew ==  Y_LIGHT_EW3)) begin
        time_ew_cnt <= Y_TIME_EW;
        ew_cnt_en   <= 1'b0     ;
      end
      else if (ew_cnt_en && (nxt_state_ew == G_LIGHT_EW)) begin
        time_ew_cnt <= G_TIME_EW;
        ew_cnt_en   <= 1'b0     ;
      end
        else if (ew_cnt_en && (nxt_state_ew == Z_LIGHT_EW)) begin
        time_ew_cnt <= Z_TIME_EW; 
        ew_cnt_en   <= 1'b0     ;
      end
      else if(time_ew_cnt == 6'd2) begin
        ew_cnt_en   <= 1'b1;
        time_ew_cnt <= time_ew_cnt - 1'b1;
      end
      else  begin
        time_ew_cnt <= time_ew_cnt - 1'b1;
      end
    end
    
    /*-----------------------------------------------\
     -------------------- ns counter  ---------------
    \-----------------------------------------------*/
    always @ (posedge clk_i or negedge rst_n_i) begin
      if (!rst_n_i) begin
        ns_cnt_en   <= 1'b1     ;
        time_ns_cnt <= 0;
      end
      else if (ns_cnt_en && (nxt_state_ew == R_LIGHT_EW)) begin
        if(ew_cnt_en)                  time_ns_cnt <= G_TIME_NS;
        else if(time_ew_cnt ==  6'd26) time_ns_cnt <= Y_TIME_NS;
        else if(time_ew_cnt ==  6'd21) time_ns_cnt <= Z_TIME_NS;
        else if(time_ew_cnt ==  6'd6 ) time_ns_cnt <= Y_TIME_NS;
        ns_cnt_en   <= 1'b0     ;
      end
    
      else if (ns_cnt_en && (nxt_state_ew == Y_LIGHT_EW1)) begin
        time_ns_cnt <= R_TIME_NS;
        ns_cnt_en   <= 1'b0     ;
      end
    
      else if (ns_cnt_en && (nxt_state_ew == Y_LIGHT_EW3)) begin
        time_ns_cnt <= Y_TIME_NS;
        ns_cnt_en   <= 1'b0     ;
      end
    
      else if(time_ns_cnt == 7'd2) begin
        ns_cnt_en   <= 1'b1;
        time_ns_cnt <= time_ns_cnt - 1'b1;
      end
    
      else  begin
        time_ns_cnt <= time_ns_cnt - 1'b1;
      end
    end
    
    /*-----------------------------------------------\
     ---------------------  FSM  --------------------
    \-----------------------------------------------*/
    always @ (posedge clk_i or negedge rst_n_i) begin
      if (!rst_n_i) begin
        cur_state_ew <= R_LIGHT_EW;
      end
      else begin
        cur_state_ew <= nxt_state_ew;
      end
    end
    
    
    always @ (*) begin
      case(cur_state_ew)
        R_LIGHT_EW :if(time_ew_cnt == 1'b1) begin
                      nxt_state_ew = Y_LIGHT_EW1;
                    end
                    else begin
                      nxt_state_ew = R_LIGHT_EW ;
                    end
    
        Y_LIGHT_EW1:if(time_ew_cnt == 1'b1) begin
                      nxt_state_ew = G_LIGHT_EW ;
                    end
                    else begin
                      nxt_state_ew = Y_LIGHT_EW1;
                    end
    
        G_LIGHT_EW :if(time_ew_cnt == 1'b1) begin
                      nxt_state_ew = Y_LIGHT_EW2;
                    end
                    else begin
                      nxt_state_ew = G_LIGHT_EW ;
                    end
    
        Y_LIGHT_EW2:if(time_ew_cnt == 1'b1) begin
                      nxt_state_ew = Z_LIGHT_EW ;
                    end
                    else begin
                      nxt_state_ew = Y_LIGHT_EW2;
                    end
    
        Z_LIGHT_EW :if(time_ew_cnt == 1'b1) begin
                      nxt_state_ew = Y_LIGHT_EW3;
                    end
                    else begin
                      nxt_state_ew = Z_LIGHT_EW ;
                    end
    
        Y_LIGHT_EW3:if(time_ew_cnt == 1'b1) begin
                      nxt_state_ew = R_LIGHT_EW ;
                    end
                    else begin
                      nxt_state_ew = Y_LIGHT_EW3;
                    end
    
        default    :begin
                      nxt_state_ew = R_LIGHT_EW ;
                    end
      endcase
    end
    
    //-- ew out
    always @ (posedge clk_i or negedge rst_n_i) begin
      if (!rst_n_i) begin
        light_ew_ZRYG <= 4'b1111;
      end
      else if ((time_ew_cnt != 6'b1) && (cur_state_ew == R_LIGHT_EW)) begin
        light_ew_ZRYG <= 4'b0100;
      end
      else if ((time_ew_cnt != 6'b1) && (cur_state_ew == (Y_LIGHT_EW1 || Y_LIGHT_EW2 || Y_LIGHT_EW3))) begin
        light_ew_ZRYG <= 4'b0010;
      end
      else if ((time_ew_cnt != 6'b1) && (cur_state_ew == G_LIGHT_EW)) begin
        light_ew_ZRYG <= 4'b0001;
      end
      else if ((time_ew_cnt != 6'b1) && (cur_state_ew == Z_LIGHT_EW)) begin
        light_ew_ZRYG <= 4'b1000;
      end
    end
    
    //-- ns out
    always @ (posedge clk_i or negedge rst_n_i) begin
      if (!rst_n_i) begin
        light_ns_ZRYG <= 4'b1111;
      end
      else if ((time_ns_cnt != 6'b1) && (cur_state_ew == R_LIGHT_EW)) begin
        if     (time_ew_cnt >  6'd25) light_ns_ZRYG <= 4'b0001;
        else if(time_ew_cnt >  6'd20) light_ns_ZRYG <= 4'b0010;
        else if(time_ew_cnt >  6'd5 ) light_ns_ZRYG <= 4'b1000;
        else if(time_ew_cnt >= 6'd1 ) light_ns_ZRYG <= 4'b0010;
      end
      else if ((time_ns_cnt != 6'b1) && (cur_state_ew != (R_LIGHT_EW || Y_LIGHT_EW3))) begin
        light_ns_ZRYG <= 4'b0100;
      end
      else if ((time_ns_cnt != 6'b1) && (cur_state_ew == Y_LIGHT_EW3)) begin
        light_ns_ZRYG <= 4'b0010;
      end
    end
    endmodule
    

    (2)Test Bench

    `timescale 1ms/1ms
    
    module tb_traffic_lights;
      reg clk_i;
      reg rst_n_i;
      wire [3:0] light_ew_ZRYG;
      wire [3:0] light_ns_ZRYG;
    
      wire [5:0] time_ew_cnt  ;
      wire [6:0] time_ns_cnt  ;
    
    
    initial begin
      clk_i = 0 ;
      rst_n_i = 1;
    
      #10 rst_n_i = 0;
      #10 rst_n_i = 1;
    end
    always #500 clk_i = ~clk_i;
    
    traffic_lights tb(
                      .clk_i        (clk_i        ),
                      .rst_n_i      (rst_n_i      ),
                      .light_ns_ZRYG(light_ns_ZRYG),
                      .light_ew_ZRYG(light_ew_ZRYG),
                      .time_ew_cnt  (time_ew_cnt  ),
                      .time_ns_cnt  (time_ns_cnt  )
    );
    
    initial begin
      #200000  $finish;
      $fsdbDumpfile("traffic.fsdb");
      $fsdbDumpvars                ;
      $fsdbDumpMDA                 ;
    end
    
    endmodule
    

    五、Result

    (1)复位

    在这里插入图片描述

      设置初始状态为东西方向为红灯状态,南北方向设置为绿灯状态。在复位信号来临的时候,东西和南北方向的所有信号灯均亮起来,并且使能东西、南北方向的倒计时计数,波形正确。

    (2)倒计时

    在这里插入图片描述

    bug1:在东西方向红灯倒计时结束后,红灯没有立即变为黄灯,而是保持红灯状态,不符合要求。

    //-- ew out
    always @ (posedge clk_i or negedge rst_n_i) begin
      if (!rst_n_i) begin
        light_ew_ZRYG <= 4'b1111;
      end
      else if ((time_ew_cnt != 6'b1) && (cur_state_ew == R_LIGHT_EW)) begin
        light_ew_ZRYG <= 4'b0100;
      end
      else if ((time_ew_cnt != 6'b1) && (cur_state_ew == (Y_LIGHT_EW1 || Y_LIGHT_EW2 || Y_LIGHT_EW3))) begin
        light_ew_ZRYG <= 4'b0010;
      end
      else if ((time_ew_cnt != 6'b1) && (cur_state_ew == G_LIGHT_EW)) begin
        light_ew_ZRYG <= 4'b0001;
      end
      else if ((time_ew_cnt != 6'b1) && (cur_state_ew == Z_LIGHT_EW)) begin
        light_ew_ZRYG <= 4'b1000;
      end
    end
    
    

    定位:定位到东西方向的输出代码块,把输出的产生条件改为和倒计时产生的条件一致,输出结果正常

    //-- ew out
    always @ (posedge clk_i or negedge rst_n_i) begin
      if (!rst_n_i) begin
        light_ew_ZRYG <= 4'b1111;
      end
      else if (ew_cnt_en && (nxt_state_ew == R_LIGHT_EW)) begin
        light_ew_ZRYG <= 4'b0100;
      end
      else if (ew_cnt_en && (nxt_state_ew == Y_LIGHT_EW1)) begin
        light_ew_ZRYG <= 4'b0010;
      end
      else if (ew_cnt_en && (nxt_state_ew == Y_LIGHT_EW2)) begin
        light_ew_ZRYG <= 4'b0010;
      end
      else if (ew_cnt_en && (nxt_state_ew == Y_LIGHT_EW3)) begin
        light_ew_ZRYG <= 4'b0010;
      end
      else if (ew_cnt_en && (nxt_state_ew == G_LIGHT_EW)) begin
        light_ew_ZRYG <= 4'b0001;
      end
      else if (ew_cnt_en && (nxt_state_ew == Z_LIGHT_EW)) begin
        light_ew_ZRYG <= 4'b1000;
      end
    end
    

    在这里插入图片描述


    在这里插入图片描述

    bug2:由仿真波形可以知道,南北方向的亮灯输出与倒计时不匹配,延迟了一秒,不符合时序。

    //-- ns out
    always @ (posedge clk_i or negedge rst_n_i) begin
      if (!rst_n_i) begin
        light_ns_ZRYG <= 4'b1111;
      end
      else if ((time_ns_cnt != 6'b1) && (cur_state_ew == R_LIGHT_EW)) begin
        if     (time_ew_cnt >  6'd25) light_ns_ZRYG <= 4'b0001;
        else if(time_ew_cnt >  6'd20) light_ns_ZRYG <= 4'b0010;
        else if(time_ew_cnt >  6'd5 ) light_ns_ZRYG <= 4'b1000;
        else if(time_ew_cnt >= 6'd1 ) light_ns_ZRYG <= 4'b0010;
      end
      else if ((time_ns_cnt != 6'b1) && (nxt_state_ew != (R_LIGHT_EW || Y_LIGHT_EW3))) begin
        light_ns_ZRYG <= 4'b0100;
      end
      else if ((time_ns_cnt != 6'b1) && (cur_state_ew == Y_LIGHT_EW3)) begin
        light_ns_ZRYG <= 4'b0010;
      end
    end
    

    定位:定位到南北方向的信号灯输出代码块,发现输出逻辑的条件不对,改为和倒计时一致的条件,即可同步输出。

    //-- ns out
    always @ (posedge clk_i or negedge rst_n_i) begin
      if (!rst_n_i) begin
        light_ns_ZRYG <= 4'b1111;
      end
      else if (ns_cnt_en && (nxt_state_ew == R_LIGHT_EW)) begin
        if(ew_cnt_en)                 light_ns_ZRYG <= 4'b0001;
        else if(time_ew_cnt == 6'd26) light_ns_ZRYG <= 4'b0010;
        else if(time_ew_cnt == 6'd21) light_ns_ZRYG <= 4'b1000;
        else if(time_ew_cnt == 6'd6 ) light_ns_ZRYG <= 4'b0010;
      end
      else if (ns_cnt_en && (nxt_state_ew == Y_LIGHT_EW1)) begin
        light_ns_ZRYG <= 4'b0100;
      end
      else if (ns_cnt_en && (nxt_state_ew == Y_LIGHT_EW3)) begin
        light_ns_ZRYG <= 4'b0010;
      end
    end
    

    在这里插入图片描述

    (3)最终结果

    在这里插入图片描述
    在这里插入图片描述

    结论:倒计时和信号灯的状态都符合要求,并且两个方向实现了互补的状态。


    作者:xlinxdu
    版权:本文是作者原创,版权归作者所有。
    转载:未经作者允许,禁止转载,转载必须保留此段声明,必须在文章中给出原文连接。

    展开全文
  • Verilog交通灯控制程序

    2018-06-27 14:54:01
    Verilog交通灯控制程序,内含文档,简单方便 交通灯控制器
  • 交通灯Verilog代码

    2012-12-26 16:32:12
    交通灯Verilog代码 FPGA CPLD
  • (1)交通灯控制器的设计要求及其思路.doc //给出了本交通灯的设计指标和详细设计思路,给修改代码的朋友一定的参考; (2)文件夹:traffic //包含详细代码和版图模式,相信能给您带来帮助。
  • 交通灯 verilog

    2013-07-12 11:10:14
    交通灯控制系统 verilog代码完全正确!可试试
  • FPGA交通灯定时系统 EGO1开发板 Vivado工程 Verilog代码码 基于Xilinx FPGA FPGA交通灯定时系统 EGO1开发板 Vivado工程 Verilog代码码 基于Xilinx FPGA FPGA交通灯定时系统 EGO1开发板 Vivado工程 Verilog代码码 ...
  • 实现verilog设计控制交通灯

    千次阅读 2021-03-21 20:37:15
    本设计在ISB14.7环境下,也可以在...//交通灯控制器顶层文件 module top(clk,data,seg_cs,seg_scan,row,led_cs); input clk; input [1:0] row; output reg [7:0] data; output seg_cs; output [3:0] seg_scan; out.

    本设计在ISB14.7环境下,也可以在vivado或者quartusII中使用。

    工程截图和顶层设计如下所示:

     

    本设计顶层文件部分代码如下:

    `timescale 1ns / 1ps

    //交通灯控制器顶层文件
    module top(clk,data,seg_cs,seg_scan,row,led_cs);

    input clk;
    input [1:0] row;
    output reg [7:0] data;
    output seg_cs;
    output [3:0] seg_scan;
    output [1:0] led_cs;

    //数码管显示

    scan_ctrl scan_ctrl_inst (
        .rst(rst), 
        .clk(clk), 
        .key_cs(key_cs), 
        .seg_cs(seg_cs), 
        .seg_scan(seg_scan),  
        .led_cs1(led_cs1), 
        .led_cs2(led_cs2), 
        .clk_10k_pulse(clk_10k_pulse)
        );

    //LED灯控制模块

    led_ctrl  led_ctrl_inst(
       

    展开全文
  • verilog语言实现FPGA板的交通信号

    千次阅读 多人点赞 2021-03-28 14:46:56
    设计题目: 交通信号 专业班级: 学生姓名: 左轩Leo 学 号: 指导教师: 目录 一、概述 二、任务书(任务功能介绍) 三.系统设计 1.基本原理 2.系统设计框图 四、各单元设计(Verilog代码及仿真图) 五、总体...
  • Verilog实现交通灯(数电课设)----------旧

    万次阅读 多人点赞 2018-11-03 01:44:22
    这里是新写的交通灯Verilog实现交通灯(数电课设)----------新:https://blog.csdn.net/qq_41467882/article/details/86626507 里边又两个核心代码和数码管显示的新方法及对状态机的新理解。。 参考思路:...
  • fpga-verilog交通灯.zip

    2020-04-06 17:19:32
    本资源为用Verilog编写的交通灯代码,欢迎下载。本人采用的是Quarters,下载即可用,可编程逻辑器件类课程需要的有缘人可自行下载
  • 交通灯设计 verilog

    2013-07-25 11:03:52
    verilog编写的交通灯
  • Verilog实现交通灯及仿真

    千次阅读 2021-12-19 19:19:11
    要求实现一个简单功能十字路口交通灯 功能描述如下: S1状态25s,S2状态5s,S3状态25秒,S4状态5秒 一、源代码 状态机 module traffic2 ( input clk, input rst_n, output reg [2:0] light1, //[green, red, ...
  • 交通灯verilog

    2013-07-12 11:06:07
    交通灯控制 verilog代码!非常好!代码经过试验完全正确
  • 基于verilog交通灯,带有测试激励。
  • 模拟交通灯实验 程序实现的是模拟十字路口的交通灯自动控制系统。开始南北走向通行,即南北绿灯亮、东 西红灯亮;然后转到南北黄灯亮、东西红灯亮以及南北红灯亮、东西黄灯亮的延时状态;最 后进入东西走向通行,即...
  • 可以实现日常生活中的交通灯系统,实现简单的红,黄,绿转换正常计时功能
  • Verilog语言实现交通灯,硬件综合设计相关,数字逻辑上机实验

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 379
精华内容 151
关键字:

交通灯verilog代码