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