Переменная типа регистра выдаёт ошибку: неизвестный тип - PullRequest
0 голосов
/ 10 апреля 2019

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

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

assign Qbar = ~Q;

за пределами всегда блока. Но оригинальный код, как показано ниже, выдает ошибку «Синтаксическая ошибка рядом =» и «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 Ответ

1 голос
/ 10 апреля 2019

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

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, вероятно, в любом случае является лучшим решением, поскольку (по крайней мере, изначально), если вы присваиваете две отдельные переменныев синхронизированном блоке always ваш синтезатор выводит два триггера - один для Q и один для Qbar.

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

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

  always @(posedge clk)
     Q <= D;

  assign Qbar = ~Q;

endmodule
...