我是一名学生,正在学习verilog。我需要创建一个D闩锁模拟。我的代码和测试平台非常适合仿真。但是,当我将其实现到basys3板上时,我没有生成任何输出。
这是我的设计来源:
module D_latch_dataflow(
input D,
input Enable,
output wire Q,
output wire Qbar
);
wire D_i;
assign #2 D_i = ~D;
assign #2 Q = ~(Enable & D_i |Qbar);
assign #2 Qbar = ~(Enable & D |Q);
endmodule
我尝试更改
output wire Q,
output wire Qbar
到
output Q,
output Qbar
但是它仍然不起作用。有什么问题吗?
这是我的测试台:
module D_latch_dataflow_tb();
reg D;
reg Enable;
wire Q;
wire Qbar;
D_latch_dataflow DUT (.D(D), .Enable(Enable), .Q(Q), .Qbar(Qbar));
initial begin
#120 $finish;
end
initial begin
D = 0; Enable = 0;
#10 D = 1;
#10 Enable = 1;
#10 D = 0;
#10 D = 1;
#10 Enable = 0;
#10 D = 0;
#10 D = 1;
#10 D = 0;
#10 Enable = 1;
#10 D = 1;
#10 D = 0;
#20;
end
endmodule
这是我的模拟。 enter image description here
答案 0 :(得分:4)
assign #2 D_i = ~D;
延迟无法合成-FPGA中没有硬件可用于构建可预测的无时钟延迟。请勿在测试平台之外使用它们。
如果您确实想要D锁存器(并且不能使用FPGA原语),则需要使用always
块来描述其行为,例如
reg Q;
always @(D or Enable)
if (Enable)
Q <= D;
请注意,这将在许多综合工具中生成警告-闩锁被认为是不受欢迎的,因为它们经常会导致时序问题。