Существует небольшая ошибка в примере вашего вопроса должно быть:
always @ (posedge clk or negedge reset) begin
if (~reset) begin //<-- Reset when rest low
//Initialize the signals
end
else begin
//do something
end
end
negedge reset
срабатывает, когда сигнал будет низкой, поэтому вы хотите условие сброса, чтобы соответствовать. Это активный сброс низкого уровня. Для активного высокого сброса (Reset при reset == 1
) вы хотите:
always @ (posedge clk or posedge reset) begin //<--Posedge trigger reset
if (reset) begin //<-- Reset when rest high
//Initialize the signals
end
else begin
//do something
end
end
состояние сброса не должно быть 0. Это может быть что угодно, но это должно быть известно статическое значение. т.е. NOT next_state
или a+b
и т. д. Он связан с буфером сброса триггера, и именно поэтому мы сохраняем имя сбрасываем.
Активные низкие сбрасывания являются предпочтительными в ASIC, так как при отсутствии питания он не возвращается. когда начинается чип, вы часто синхронно отпускаете сброс в позе часы. часто для как минимум 2 posedges. Это позволяет избежать сбоев сброса в течение небольшого промежутка времени.
Потому что вы хотите, чтобы активный сброс низкого уровня был применен при включении чипа, поэтому при включении питания все находится в известном состоянии, мы используем асинхронные сбросы. С синхронными сбросами вы не представляете, каким будет первое состояние. Синхронные сбросы часто используются государственными машинами и фильтрами, которые должны очищать данные. Асинхронные сбросы используются для сброса мощности (POR) для установки известных значений.
Структура if (reset) else
используется так, чтобы инструменты синтеза могли пересчитать ее как триггер с асинхронным сбросом, попробовав другую структуру, которая может имитировать штраф, может даже синтезировать (неправильно), но вы можете легко получить аппаратные ошибки, которые делают не показывать в симуляции, что делает отладку очень сложной.
Возможно, вам будет интересно ознакомиться с set-reset flip-flops (SR Flip-Flop). Это просто JK с функцией Toggle.
Это может подразумеваться, используя следующее:
always @ (posedge clk or negedge reset or posedge set) begin
if (~reset) begin
//reset the signals
end
else if (set) begin
//set the signals
end
else begin
//do something
end
end