如何在Verilog中添加“红黄”灯的状态

时间:2019-07-08 19:59:56

标签: verilog

我写了一个简单的学校项目交通信号灯, 我要添加“红黄”灯的新状态

enter image description here

此图显示了它的外观

我不知道“ if-else”语句的样子。

预先感谢您的帮助

`timescale 1ns / 1ps
module Traffic
(
  input       reset,
  input       clk,
  input       NS_VEHICLE_DETECT,
  input       EW_VEHICLE_DETECT,
  output wire NS_RED,
  output wire NS_YELLOW,
  output wire NS_GREEN,
  output wire EW_RED,
  output wire EW_YELLOW,
  output wire EW_GREEN
);

reg [5:0] lights; //  {NS_RED, NS_YELLOW, NS_GREEN, EW_RED, EW_YELLOW, EW_GREEN}
reg [4:0] nsCounter;
reg [3:0] ewCounter;
reg [1:0] yellowCounter;


assign {NS_RED, NS_YELLOW, NS_GREEN, EW_RED, EW_YELLOW, EW_GREEN} = lights;


always @(posedge clk)
   if (reset)
      lights <= 6'b001100;
   else
     if (nsCounter == 31 & EW_VEHICLE_DETECT & NS_GREEN)
       lights <= 6'b010100;
     else
       if (ewCounter == 15 & EW_GREEN) 
         lights <= 6'b100010;
       else
         if (yellowCounter == 3 & NS_YELLOW)
           lights <= 6'b100001;
         else
           if (yellowCounter == 3 & EW_YELLOW) 
             lights <= 6'b001100;
//------------------------------------

always @(negedge clk)
  if (reset)
    begin
      nsCounter     <= 5'h0;
      ewCounter     <= 4'h0;
      yellowCounter <= 2'h0;
    end
  else
    begin
      nsCounter     <= nsCounter     + 1'b1;
      ewCounter     <= ewCounter     + 1'b1; 
      yellowCounter <= yellowCounter + 1'b1;
    end
//------------------------------------

endmodule
//====================================

1 个答案:

答案 0 :(得分:0)

您在此处编写了优先级编码器,其中最后一个条件仅在其他条件均无效时才适用。这通常执行起来较慢(除非综合工具可以优化无法访问的状态),并且难以扩展(如您所知)。

要检查来自每个状态的流量对于所有可能的状态是否正确,也很难进行分析。

尽管看起来可能不太理想,但使用状态变量将状态机编写为case语句更为常见。然后展开“对于每个状态,下一个状态条件是...”表达式。

使用图像中暗含的编码,这将是一个明显的案例表达方式

2'b01: nextState = (counter == 5'h0f) ? 2'b10 : 2'b01;

基于状态/下一个状态,您还可以确定计数器所需的行为。请记住,如果您有一个以上的计数器,您将对计数状态和亮状态之间的相关性有一些隐含的假设。

这个问题的不明显的部分是您可能不希望有4个状态序列(如图所示,其中的轴处于“反转”状态),您有多达16个潜在状态,因为您有两组的灯。首先由您决定从“稳定”状态之一中提取所有可能的路径,然后确定需要避免的状态(例如G / G)。这是将状态变量与输出解耦的另一个原因。