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

#verilog #flip-flop

#verilog #триггер

Вопрос:

Я делаю 1-битный Dflipflop с положительным краем. Все выходные данные должны назначаться только при наличии положительного фронта тактового сигнала. Q совпадает с D, Qbar является отрицанием D.

Это как-то работает, когда я пытаюсь сделать это с Qbar в качестве провода.

 assign Qbar = ~Q;
  

вне блока always . Но исходный код, приведенный ниже, выдает ошибку «Синтаксическая ошибка около =» и «Qbar — неизвестный тип»

Я пытался сделать назначение Qbar неблокирующим типом, но это не имеет никакого эффекта.

 module DFlipFlop(
    input D,
    input clk,
    output reg Qbar,
    output reg Q
    );
//assign Qbar = ~D;
always @(posedge clk)
     Q = D;
     Qbar = ~D; 
endmodule
  

Чего мне здесь не хватает? Я новичок в verilog.

Ответ №1:

Ваше сообщение об ошибке вызвано тем фактом, что в Verilog, если у вас есть более одного оператора в блоке always (и в других местах тоже), он должен быть заключен в begin end construct . Итак, вам это было нужно:

 module DFlipFlop(
    input D,
    input clk,
    output reg Qbar,
    output reg Q
    );

  always @(posedge clk) begin
     Q = D;
     Qbar = ~D; 
  end
endmodule
  

Однако это не очень хорошее решение, потому что

i) (если вы не знаете, что делаете) всегда используйте неблокирующие назначения для переменных, которые должны стать триггерами после синтеза и

ii) использование wire assign оператора and, вероятно, в любом случае является лучшим решением, потому что (по крайней мере, изначально), если вы присваиваете двум отдельным переменным внутри синхронизированного always блока, ваш синтезатор с выводом двух триггеров — один для Q и один для Qbar .

Это лучшее решение:

 module DFlipFlop(
    input D,
    input clk,
    output Qbar,
    output reg Q
    );

  always @(posedge clk)
     Q <= D;

  assign Qbar = ~Q;

endmodule