
Сообщение от
Hunta
Мне помогало никогда не проверять на то значение, которое onehot.
тут речь немного о другом - изначально автомат обычный:
Код:
localparam STATE_STM_WAIT = 3'd0; // ждем =0 на STM_U_QBUS_IN_L
localparam STATE_STM_CLANK1= 3'd1; // антизвон
localparam STATE_STM_CLANK2= 3'd2; // антизвон
localparam STATE_STM_CLANK3= 3'd3; // антизвон
localparam STATE_STM_FLAG = 3'd4; // ждем установки флагов операции
localparam STATE_STM_DATA = 3'd5; // запоминаем данные для команды
localparam STATE_STM_OPER = 3'd6; // выполняем операцию
localparam STATE_STM_END = 3'd7; // ждем завершения - снятия синка
reg [2:0] state_stm /* synthesis syn_encoding="safe" */;
reg [2:0] next_state_stm;
always @ (posedge CLK)
begin
state_stm<=next_state_stm;
end
//
wire stm_sync=STM_DA_OUT[8];
always @ *
begin
case (state_stm)
STATE_STM_WAIT:
if(STM_U_QBUS_IN_L==0)
next_state_stm=STATE_STM_CLANK1;
else
next_state_stm=STATE_STM_WAIT;
STATE_STM_CLANK1:
next_state_stm=STATE_STM_CLANK2;
....
default:
next_state_stm=STATE_STM_WAIT;
endcase
end
но оптимизатор переделывает автомат в onehot
и если работать без /* synthesis syn_encoding="safe" */;
и так как управляющие сигналы - асинхронщина, то шанс влететь в запрещенное состояние становится очень большим
соответственно можно или сказать
/* synthesis syn_encoding="safe" */; - те сделать защитную логику
или вообще указать тип кодирования явно
да, собирая грабли я таки вычистил тормозящие куски и теперь оперативка на 130MHz полноценно пашет