Во-первых, в таком случае было бы непросто придумать синтезируемую модель. Но вам не нужны никакие negedge logi c для реализации вашей модели. Также вы сделали несколько ошибок и нарушили многие общепринятые практики.
Теперь о некоторых проблемах в вашем коде.
- Используя неблокирующее назначение в строке часов, вы создали условие гонки в симуляция, которая, вероятно, приведет к неверным результатам симуляции:
always @(posedge CLK)
clockDivider <= clockDivider + 1; // <<< this is a red flag!
assign clock = clockDivider[23];
...
always @(posedge clk)
вы неправильно использовали nbas в своем всегда блоке
always(@state)
... counter <= conunter-1; // <<< this is a red flag again!
ваш конечный автомат не сброшен. Такие утверждения, как
reg state = IDLE;
, будут работать только в симуляции и в некоторых fpgas. Это вообще не синтезируется. Я предлагаю вам не использовать его, а вместо этого подать сигнал сброса.
Сказав это, я не знаю какой-либо методологии, которая использовала бы положительные и отрицательные фронты в таком случае. Так что не стоит. Вся ваша реализация может быть выполнена под постановкой, примерно так. Однако
always @(posedge clock) begin
if (reset) begin // i suggest that you use reset in some form.
state <= IDLE;
counter <= 0;
end
else begin
case (state)
IDLE: begin
if (dataReady) begin
state <= COUNTING;
counter <= counter - 1;
end
end
COUNTING: begin
if (counter == 0)
state <= IDLE;
else
counter <= counter - 1;
end
endcase
end
end
Надеюсь, я сделал все правильно, не тестировал.
Теперь вам вообще не нужны два других блока always.