2014-09-17 2 views
0

Я просматривал документ с сайта Microsemi (Actel HDL Code), и я нашел несколько реализаций триггера (синхронный, асинхронный и т. Д.). Во всех случаях автор смоделировал флип -flops с операторами блокировки.Правильный способ моделирования Flip Flop

Я хочу знать, являются ли эти реализации правильными, потому что я всегда использовал не блокирование для моделирования последовательной логики? Я что-то упустил или это просто способ моделирования только флип-флопа, а не последовательной схемы вообще?

// 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

Большинство инструментов синтеза будет генерировать флип-флоп для этих примеров, хотя блокирование назначений не являются общий для последовательной логики. Этот ответ даст вам более подробную информацию: http://stackoverflow.com/a/4774450/1383356 – Ari

ответ

1

Шлепанцы должны быть смоделированы с неблокируемой (<=), как вы думали ранее.

Если вы используете любую версию verilog после 1995, то ваши объявления порта могут быть немного подобраны. NB Я добавляю начальные концы для ясности и _n для обозначения активных низких сигналов.

нарастающий фронт флип-флоп с асинхронными Сброс

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 

нарастающий фронт флип-флоп с Синхронный сброс

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 
+0

Когда я код, я использую тот же стиль кодирования, что и ваш ответ. Я использую неблокирующие назначения для кода. Но так как автор в данной ссылке использует назначения блокировки, правилен ли стиль кодирования? Я должен был спросить, правильно ли это с сайта Microsemi – chitranna

+0

Нет, это не так. Неблокирование позволяет моделировать поведение триггеров, поэтому оно существует. Не использование правильной формы может привести к несоответствию модели RTL для уровня ворот. – Morgan