Асинхронный синтез D FlipFlop

 module dff_async(clk,r1,r2,dout);
 input clk,r1,r2;
 output reg dout;

  always@(posedge clk or negedge r1)
  begin

    if(r2)
      dout<=1'b1;
    else
      dout<=1'b0;
  end

 endmodule

Приведенный выше код не синтезируется и имеет ошибку:

Назначение под несколькими одиночными ребрами не поддерживается для синтеза

введите здесь описание изображения

Согласно моей интерпретации, код должен был быть синтезирован, как показано на рисунке выше. Я не могу найти проблему. Что мешает синтезировать код?


person VIJETH ANCHATGERI    schedule 07.10.2015    source источник
comment
Это потому, что, поскольку у нас есть два асинхронных сигнала в списке чувствительности, то есть clk и r1, инструмент не может определить, какой из них должен быть тактовым сигналом? либо clk, либо r1?   -  person VIJETH ANCHATGERI    schedule 07.10.2015


Ответы (1)


Вам нужно асинхронно сбросить dout, когда r1 низкий:

module dff_async (clk,r1,r2,dout);
    input clk,r1,r2;
    output reg dout;

    always @(posedge clk or negedge r1) begin
        if (!r1) begin
            dout <= 1'b0;
        end
        else begin
            dout <= r2;
        end
    end
endmodule

Обратите внимание, что код для мультиплексора был упрощен.

person toolic    schedule 07.10.2015