Как я могу добавить статус огней "красно-желтый" в Verilog - PullRequest
0 голосов
/ 08 июля 2019

Я написал простой школьный проект светофора и Я хочу добавить новое состояние "красно-желтых" огней

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 голосов
/ 09 июля 2019

Вы написали кодировщик приоритетов здесь, где последнее условие применяется только в том случае, если ни одно из остальных не является действительным. Это часто медленнее реализовать (если инструмент синтеза не может оптимизировать отсутствие недоступного состояния), и его сложнее масштабировать (как вы обнаружили).

Также сложнее анализировать с точки зрения проверки того, что поток из каждого состояния корректен для всех возможных состояний.

Несмотря на то, что он может выглядеть менее оптимальным, более распространенным является запись конечного автомата как оператора case с использованием переменной состояния. Затем вы развертываете выражения «для каждого состояния, следующее условие состояния ...».

Используя кодировку, подразумеваемую в изображении , это было бы очевидным выражением

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

На основе состояния / следующего состояния вы также можете определить, какое поведение необходимо счетчику. Помните, что если у вас более одного счетчика, у вас есть некоторые неявные предположения о корреляции между состояниями счета и состояниями освещения.

Неочевидная часть этого вопроса заключается в том, что вам может не потребоваться последовательность из 4 состояний (как показано на схеме, где оси принимают «инвертированные» состояния), у вас есть до 16 потенциальных состояний, потому что у вас есть два набора огней. Вы должны сначала выбрать все возможные пути из одного из «стабильных» состояний, определив, каких состояний вам следует избегать (например, G / G). Это еще одна причина для отделения переменных состояния от выходов.

...