#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