Модуль Verilog для детектора дыма и зуммера

У меня есть Altera DE2-115 FPGA, и я пытаюсь самостоятельно изучить Verilog. Я решил сделать детектор дыма, и всякий раз, когда появляется запах дыма, звонит зуммер (детектор дыма выдает цифровой сигнал).

Вот мое испытание:

module fire(flag,clock,reset,fire,fire_state,firealarm);
  input        clock, reset, flag, fire;
  output [2:0] fire_state;
  output       firealarm; 

  wire         fire;
  reg    [2:0] fire_state;

  assign firealarm = (fire_state == 1) ? (flag ? 0 : 1) : 0;

  always @ (posedge clock)
    fire_state<= fire ? 1: 0;

end module

Но он не запускается, и я думаю, что в этом коде много логических ошибок, помогите, пожалуйста? :)


person Karim Abdel-Qader    schedule 11.12.2014    source источник


Ответы (1)


endmodule это одно слово, нужно убрать пробел.

Почти все симуляторы в наши дни поддерживают Verilog-2001 или более позднюю версию, поэтому я бы рекомендовал использовать современный стиль переноса (ANSI), а не старый стиль Verilog 1995 года.

Ваш список портов идет от:

module fire(flag,clock,reset,fire,fire_state,firealarm);
input clock, reset, flag, fire;
output [2:0] fire_state;
output firealarm; wire fire;reg[2:0] fire_state;

to :

module fire(
  input            clock,
  input            reset,
  input            flag,
  input            fire,
  output reg [2:0] fire_state,
  output           firealarm
);

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

Вы часто использовали этот синтаксис (flag?0:1), когда вы используете логическое значение для выбора логического значения, в этом нет необходимости, и это затрудняет чтение. Если вам нужно инвертировать его, то это побитовая инвертация (~). Однако неясно, для чего вы используете флаг. для сравнений и назначений вы должны включать ширину.

assign firealarm = (fire_state == 3'b1)? (~flag) : 1'b0;

Это также можно записать в комбинаторном блоке always:

always @* begin
  if (fire_state==3'b001) begin
    firealaram = ~flag;
  else begin
    firealaram = 1'b0;
  end
end 

fire — 1 бит, fire_state — 3 бита.

always @ (posedge clock) begin
  fire_state <= {2'b0, fire};
end
person Morgan    schedule 11.12.2014