REL
и AMT
должны быть типа reg
. Поскольку они были выведены wire
типов, которые нельзя назначать всегда в блоках.
module Vending_FSM(
input [2:0] INPUT,
input CLK,
output reg REL,
output reg [3:0] AMT
);
также next_state
, REL
и AMT
являются предполагаемыми защелками, поскольку они не назначаются явно при INPUT
равно 3'b111 и state
вне S0
- S5
. Вы можете либо определить все случаи в операторе case, либо / и иметь присвоение по умолчанию над case
константе флопа. Пример:
always @* begin
// default assignment
next_state = state;
// update
case(state)
S0: case (INPUT) // WAIT
//... your existing code, maybe added 3'b111/default case
endcase
// S1..S5: ... your existing code, maybe added case 3'b111/default for INPUT
default : next_state = S0; // in case state not inside S0..S5
endcase
end
always @* begin
// default assignment
REL = 1'b0;
ATM = 4'b0000;
// update
case(state)
//... your existing code
endcase
end
Другие примечания:
always @(INPUT or state)
технически исправен, но больше не рекомендуется. Используйте always @*
или always @(*)
для автоматической чувствительности. Указание сигналов для списка чувствительности было необходимо для Verilog-1995. В Verilog-2001 добавлена автоматическая чувствительность, которая снижает риск неполных списков чувствительности; плюс сокращает ввод.
Для более чистых выходных сигналов и более простого анализа синхронизации я рекомендую переключать выходы. Пример:
always @* begin
// default assignment
next_REL = 1'b0;
next_AMT = 4'b0000;
// update
case(state)
//... your existing code but REL and AMT prefixed with next_
endcase
end
always @(posedge clk) begin
state <= next_state;
REL <= next_REL;
AMT <= next_AMT;
end