Правильный способ моделирования флип-флоп
Я просматривал документ с веб-сайта Microsemi ( код Actel HDL) и обнаружил несколько реализаций триггера (синхронный, асинхронный и т. Д.). Во всех случаях автор моделировал триггеры с помощью операторов блокировки.
Я хочу знать, правильны ли эти реализации, потому что я всегда использовал неблокирование для моделирования последовательной логики? Я что-то упустил или это просто способ моделировать только триггер, а не последовательную схему вообще?
// Rising Edge Flip-Flop with Asynchronous Reset
module dff_async_rst (data, clk, reset, q);
input data, clk, reset;
output q;
reg q;
always @(posedge clk or negedge reset)
if (~reset)
q = 1'b0;
else
q = data;
endmodule
//Rising Edge Flip-Flop with Synchronous Reset
module dff_sync_rst (data, clk, reset, q);
input data, clk, reset;
output q;
reg q;
always @ (posedge clk)
if (~reset)
q = 1'b0;
else
q = data;
endmodule
ПРИМЕЧАНИЕ. Блокирующие назначения, используемые в блоке всегда для получения последовательной логики
1 ответ
Триггеры должны моделироваться с неблокирующими (<=
), как вы думали ранее.
Если вы используете какую-либо версию verilog после 1995 года, то ваши декларации портов могут быть немного приведены в порядок. NB Я добавлю начальные концы для ясности и _n
назначать активные низкие сигналы.
Триггер Rising Edge с асинхронным сбросом
module dff_async_rst (
input data,
input clk,
input reset_n,
output reg q //SystemVerilog logic is preferred over reg
);
always @(posedge clk or negedge reset_n) begin
if (~reset_n) begin
q <= 1'b0;
end
else begin
q <= data;
end
end
endmodule
Триггер Rising Edge с синхронным сбросом
module dff_sync_rst(
input data,
input clk,
input reset_n,
output reg q //SystemVerilog logic is preferred over reg
);
always @(posedge clk) begin
if (~reset_n) begin
q <= 1'b0;
end
else begin
q <= data;
end
end
endmodule