FPGA——交通灯(含有转向灯)

module traffic(Clk_12M,Rst,LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2,led15,led16,led17);
  parameter S0 = 0;   //主路绿灯,支路红灯
  parameter S1 = 1;   //主路黄灯,支路红灯
  parameter S2 = 2;   //主路蓝灯,支路红灯
  parameter S3 = 3;   //主路黄灯,支路黄灯
  parameter S4 = 4;   //主路红灯,支路绿灯
  parameter S5 = 5;   //主路红灯,支路黄灯
  parameter S6 = 6;   //主路红灯,支路蓝灯
  parameter S7 = 7;   //主路黄灯,支路黄灯
  input Clk_12M,Rst;
  output LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2;
  output led15,led16,led17;
  reg LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2;
  reg Clk_1Hz;//分频器
  reg [31:0]Cnt_1Hz;//计数器
  /*分频器模块*/
  always@(posedge Clk_12M or negedge Rst)//频率对应的是12mhz
  begin
    if(!Rst)
      begin
        Cnt_1Hz<=1;
        Clk_1Hz<=1;  //分频器和计数器全部设置为初值1
      end
    else
      begin
        if(Cnt_1Hz>=6000000)//当计数器大于等于6的10的六次方
          begin
            Cnt_1Hz<=1;//计数器置一
            Clk_1Hz<=~Clk_1Hz;//分频器取反
          end
        else
          Cnt_1Hz<=Cnt_1Hz+1;
        end
      end
      
      /*计数器模块*/
      reg[7:0]Cnt60;
      always@(posedge Clk_1Hz or negedge Rst)
      begin
        if(!Rst)
          begin
            Cnt60<=0;
          end
        else
          begin
            if(Cnt60>=60)
              begin
                Cnt60<=0;//60清零
              end
            else
              Cnt60<=Cnt60+1;
            end
          end
          
          
          
              
              //状态转换
              reg [2:0] state;
              always@(posedge Clk_12M or negedge Rst)
              begin
                if(!Rst)
                  begin
                    LedR_1<=0;
                    LedG_1<=0;
                    LedB_1<=0;
                    LedR_2<=0;
                    LedG_2<=0;
                    LedB_2<=0;
                  end
                else
                  begin
                case(state)
                  S0://主路绿灯45s,辅路红灯45s
                  begin
                    if(Cnt60<=45)
                      begin
                        LedR_1<=1;
                        LedG_1<=0;
                        LedB_1<=1;
                        LedR_2<=0;
                        LedG_2<=1;
                        LedB_2<=1;
                      end
                    else
                      state<=S1;
                    end
                  S1://主路黄灯5s,辅路红灯5s
                  begin
                    if(Cnt60<=50)
                      begin
                        LedR_1<=0;
                        LedG_1<=0;
                        LedB_1<=1;
                        LedR_2<=0;
                        LedG_2<=1;
                        LedB_2<=1;
                      end
                    else
                      state<=S2;
                    end
                    
                    
                    S2://主路蓝灯5s,辅路红灯5s
                    begin
                      if(Cnt60<=55)
                        begin
                          LedR_1<=1;
                          LedG_1<=1;
                          LedB_1<=0;
                          LedR_2<=0;
                          LedG_2<=1;
                          LedB_2<=1;
                        end
                      else
                        state<=S3;
                      end
                      
                      
                    S3://主辅均5s黄
                      begin
                        if(Cnt60>=55)
                          begin
                          LedR_1<=0;
                          LedG_1<=0;
                          LedB_1<=1;
                          LedR_2<=0;
                          LedG_2<=0;
                          LedB_2<=1;
                        end
                      else
                        state<=S4;
                      end
                      
                      
                      S4://辅路绿35s,主路红灯20s
                    begin
                        if(Cnt60<=35)
                          begin
                          LedR_1<=0;
                          LedG_1<=1;
                          LedB_1<=1;
                          LedR_2<=1;
                          LedG_2<=0;
                          LedB_2<=1;
                        end
                      else
                        state<=S5;
                      end
                      
                      S5://辅路黄灯5s,主路红灯5s
                      begin
                        if(Cnt60<=40)
                          begin
                          LedR_1<=0;
                          LedG_1<=1;
                          LedB_1<=1;
                          LedR_2<=0;
                          LedG_2<=0;
                          LedB_2<=1;
                        end
                      else
                        state<=S6;
                      end
                      
                      
                      S6://辅路蓝灯15s,主路红灯15s
                      begin
                        if(Cnt60<=55)
                          begin
                          LedR_1<=0;
                          LedG_1<=1;
                          LedB_1<=1;
                          LedR_2<=1;
                          LedG_2<=1;
                          LedB_2<=0;
                        end
                      else
                        state<=S7;
                      end
                      
                      
                      
                      S7://主辅路均黄灯5s
                      begin
                        if(Cnt60<=60)
                          begin
                          LedR_1<=0;
                          LedG_1<=0;
                          LedB_1<=1;
                          LedR_2<=0;
                          LedG_2<=0;
                          LedB_2<=1;
                        end
                      else
                        state<=S0;
                        
                      end
                      
                  default 
                 begin
                    LedR_1<=0;
                    LedG_1<=0;
                    LedB_1<=0;
                    LedR_2<=0;
                    LedG_2<=0;
                    LedB_2<=0;
                  end
                endcase
              end
            end
              
              
              
             
            assign {led17,led16,led15}=state;
          endmodule
                        

👆以上为总代码 

任务要求:


东西方向:绿灯45s,黄灯5s,左转灯5s,黄灯5s,红灯45s,黄灯5s

南北方向:红灯55s,黄灯5s,绿灯35s,黄灯5s,左转灯15s,黄灯5s

 

定义:

module traffic(Clk_12M,Rst,LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2,led15,led16,led17);
  parameter S0 = 0;   //主路绿灯,支路红灯
  parameter S1 = 1;   //主路黄灯,支路红灯
  parameter S2 = 2;   //主路蓝灯,支路红灯
  parameter S3 = 3;   //主路黄灯,支路黄灯
  parameter S4 = 4;   //主路红灯,支路绿灯
  parameter S5 = 5;   //主路红灯,支路黄灯
  parameter S6 = 6;   //主路红灯,支路蓝灯
  parameter S7 = 7;   //主路黄灯,支路黄灯
  input Clk_12M,Rst;
  output LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2;
  output led15,led16,led17;
  reg LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2;
  reg Clk_1Hz;//分频器
  reg [31:0]Cnt_1Hz;//计数器
  

描述了一个红绿灯控制器模块(traffic),该模块接收一个12MHz的时钟信号(Clk_12M)和一个复位信号(Rst)。同时,它还有一些控制信号(LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2,led15,led16,led17)用于控制红绿灯的亮灭。

代码中使用了几个参数(parameter)来定义不同状态下的红绿灯控制。每个状态用一个唯一的标识符(S0,S1,S2,...,S7)来表示。

在输入信号的部分,有两个输入信号:时钟信号(Clk_12M)和复位信号(Rst)。

输出信号部分包括三对红绿灯的控制信号(LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2)以及三个额外的LED控制信号(led15,led16,led17)。

在变量定义部分,使用了几个寄存器(reg)来存储输出信号的状态变化。其中,LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2用于控制红绿灯的亮灭,而Clk_1Hz和Cnt_1Hz则用于实现分频器和计数器。

这段代码实现了一个红绿灯控制器,通过不同的状态(S0到S7)控制红绿灯以及三个额外的LED的亮灭情况。根据时钟信号和计数器的变化,在适当的时刻切换不同的状态,并相应地改变输出信号的状态。

 

分频器模块设置:

always@(posedge Clk_12M or negedge Rst)
  begin
    if(!Rst)
      begin
        Cnt_1Hz<=1;
        Clk_1Hz<=1;  //分频器和计数器全部设置为初值1
      end
    else
      begin
        if(Cnt_1Hz>=6000000)//当计数器大于等于25的10的六次方
          begin
            Cnt_1Hz<=1;//计数器置一
            Clk_1Hz<=~Clk_1Hz;//分频器取反
          end
        else
          Cnt_1Hz<=Cnt_1Hz+1;
        end
      end
      
      /*计数器模块*/
      reg[7:0]Cnt60;
      always@(posedge Clk_1Hz or negedge Rst)
      begin
        if(!Rst)
          begin
            Cnt60<=0;
          end
        else
          begin
            if(Cnt60>=60)
              begin
                Cnt60<=0;//60清零
              end
            else
              Cnt60<=Cnt60+1;
            end
          end
          
          

描述了一个时钟模块,其中包含了一个12MHz时钟信号(Clk_12M)和一个复位信号(Rst)。该代码的功能是生成一个1Hz的时钟(Clk_1Hz)和一个60Hz的计数器(Cnt60)。

首先,在时钟的上升沿或复位信号的下降沿发生时,进入了模块的主要过程部分(begin)。在复位信号为低电平(!Rst)时,执行以下操作:

1. 将一个名为Cnt_1Hz的变量置为1,表示1Hz的计数器的初始值。
2. 将一个名为Clk_1Hz的变量置为1,表示1Hz的时钟的初始值。

接着,在复位信号为高电平(Rst)时,执行以下操作:

1. 如果1Hz的计数器(Cnt_1Hz)的值大于等于6000000(表示经过了25的10的6次方个时钟周期),则执行以下操作:
   - 将1Hz的计数器(Cnt_1Hz)置为1,重新开始计数。
   - 将1Hz的时钟(Clk_1Hz)取反。

2. 否则,将1Hz的计数器(Cnt_1Hz)的值加1。

另外,代码中还包含了一个名为Cnt60的8位寄存器,用于实现60Hz的计数器功能。在1Hz的时钟(Clk_1Hz)的上升沿或复位信号的下降沿发生时,执行以下操作:

1. 如果复位信号为低电平(!Rst),则将60Hz的计数值(Cnt60)重置为0。

2. 否则,如果60Hz的计数值(Cnt60)大于等于60,则执行以下操作:
   - 将60Hz的计数值(Cnt60)重置为0,重新开始计数。

3. 否则,将60Hz的计数值(Cnt60)加1。

这段代码实现了两个计数器,一个是1Hz的计数器,另一个是60Hz的计数器,并且在每秒和每分钟的特定时刻触发相应的操作。

 

状态转换及输出模块:

reg [2:0] state;
              always@(posedge Clk_12M or negedge Rst)
              begin
                if(!Rst)
                  begin
                    LedR_1<=0;
                    LedG_1<=0;
                    LedB_1<=0;
                    LedR_2<=0;
                    LedG_2<=0;
                    LedB_2<=0;
                  end
                else
                  begin
                case(state)
                  S0://主路绿灯45s
                  begin
                    if(Cnt60<=45)
                      begin
                        LedR_1<=1;
                        LedG_1<=0;
                        LedB_1<=1;
                        LedR_2<=0;
                        LedG_2<=1;
                        LedB_2<=1;
                      end
                    else
                      state<=S1;
                    end
                  S1://主路黄灯5s
                  begin
                    if(Cnt60<=50)
                      begin
                        LedR_1<=0;
                        LedG_1<=0;
                        LedB_1<=1;
                        LedR_2<=0;
                        LedG_2<=1;
                        LedB_2<=1;
                      end
                    else
                      state<=S2;
                    end
                    
                    
                    S2://主路蓝灯15s
                    begin
                      if(Cnt60<=55)
                        begin
                          LedR_1<=1;
                          LedG_1<=1;
                          LedB_1<=0;
                          LedR_2<=0;
                          LedG_2<=1;
                          LedB_2<=1;
                        end
                      else
                        state<=S3;
                      end
                      
                      
                    S3://主辅均5s黄
                      begin
                        if(Cnt60>=55)
                          begin
                          LedR_1<=0;
                          LedG_1<=0;
                          LedB_1<=1;
                          LedR_2<=0;
                          LedG_2<=0;
                          LedB_2<=1;
                        end
                      else
                        state<=S4;
                      end
                      
                      
                      S4://辅路绿20s
                    begin
                        if(Cnt60<=20)
                          begin
                          LedR_1<=0;
                          LedG_1<=1;
                          LedB_1<=1;
                          LedR_2<=1;
                          LedG_2<=0;
                          LedB_2<=1;
                        end
                      else
                        state<=S5;
                      end
                      
                      S5://辅路黄灯5s
                      begin
                        if(Cnt60<=25)
                          begin
                          LedR_1<=0;
                          LedG_1<=1;
                          LedB_1<=1;
                          LedR_2<=0;
                          LedG_2<=0;
                          LedB_2<=1;
                        end
                      else
                        state<=S6;
                      end
                      
                      
                      S6://辅路蓝灯15s
                      begin
                        if(Cnt60<=40)
                          begin
                          LedR_1<=0;
                          LedG_1<=1;
                          LedB_1<=1;
                          LedR_2<=1;
                          LedG_2<=1;
                          LedB_2<=0;
                        end
                      else
                        state<=S7;
                      end
                      
                      
                      
                      S7://主辅路均黄灯5s
                      begin
                        if(Cnt60<=45)
                          begin
                          LedR_1<=0;
                          LedG_1<=0;
                          LedB_1<=1;
                          LedR_2<=0;
                          LedG_2<=0;
                          LedB_2<=1;
                        end
                      else
                        state<=S0;
                      end
                      
                  default 
                 begin
                    LedR_1<=0;
                    LedG_1<=0;
                    LedB_1<=0;
                    LedR_2<=0;
                    LedG_2<=0;
                    LedB_2<=0;
                  end
                endcase
              end
            end

这部分代码定义了一个名为state的3位寄存器,用于存储红绿灯控制器的状态。在每个时钟上升沿或复位信号下降沿时,代码根据当前的状态进行操作。

在复位信号为低电平(!Rst)时,所有的LED控制信号被置零,表示将所有的红绿灯都关闭。

在复位信号为高电平(Rst)时,根据当前的状态(state),使用了一个case语句来进行不同状态的操作。

在S0状态下,主路的绿灯亮45秒。在该状态下,首先检查计数器的值(Cnt60是否小于等于45),如果是,则执行以下操作:

- LedR_1被置为1,表示主路红灯关闭。
- LedG_1被置为0,表示主路绿灯亮。
- LedB_1被置为1,表示主路蓝灯亮。
- LedR_2被置为0,表示支路红灯亮。
- LedG_2被置为1,表示支路绿灯亮。
- LedB_2被置为1,表示支路蓝灯亮。

如果计数器的值(Cnt60)超过了45,则将状态(state)切换至S1状态。

根据情况逐渐向下循环。

 

设计任务 (一)有一条主干道和一条支干道的汇合点形成十字交叉路口,主干道为东西向,支干道为南北向。为确保车辆安全,迅速地通行,在交叉道口的每个入口处设置了红,绿,黄3色信号灯。 (二)要求: (1)主干道绿灯亮时,支干道红灯亮,反之亦然,两者交替允许通行,主干道每次放行55s,支干道每次放行25s。每次由绿灯变为红灯的过程中,黄灯亮5s作为过渡。 (2)能实现正常的倒计时显示功能。 (3)能实现总体清零功能:计数器由初始状态开始计数,对应状态的指示灯亮。 (4)能实现特殊状态的功能显示:进入特殊状态时,东西、南北路口均显示红灯状态。 Verilog HDL作为一种规范的硬件描述语言,被广泛应用于电路的设计中。利用Verilog的设计描述可被不同的工具(包括验证仿真、时序分析、测试分析以及综合)所支持,可用不同器件来实现。而可编程器件的广泛应用,为数字系统的设计带来了极大的灵活性。由于可编程器件可以通过软件编程对硬件的结构和工作方式进行重构,使得硬件的设计可以如同软件设计那样快捷方便。 本文用Verilog HDL设计了一个交通灯控制系统,主干道交通灯按绿-黄-红变化,支干道交通灯按红-绿-黄变化。设计采用了自顶向下的设计方法,首先根据功能将电路分为div(包括div1和div2)、counter、controller、Fenwei(包括Fenwei1和Fenwei2)、demx模块,然后针对每个模块进行开发。利用QuartusII6.0中的仿真工具对每个模块进行仿真,保证功能正确。在此基础上,将所有模块连接起来,形成完整的设计,并用QuartusII6.0中的仿真工具再次仿真。仿真结果表明功能正确,符合设计要求。最后利用QuartusII6.0将程序下载到Altera FPGA芯片EP1C3T144C8中,实际结果表明电路工作正常,满足了设计要求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值