我在 Quartus 中制作了计数器作为原理图文件。然后从该方案生成 Verilog 设计文件。我能够在 Modelsim 中配置和运行仿真,但计数器 (Q0..Q3) 的输出始终处于未定义状态。我对 Verilog 和 FPGA 非常陌生,但我认为在该方案中至少 Q0 应该改变每个时钟周期。
这是生成的代码:
module jk_counter_full(
clk,
JKFF0,
Q0,
Q1,
Q2,
Q3,
next
);
input wire clk;
input wire JKFF0;
output wire Q0;
output wire Q1;
output wire Q2;
output wire Q3;
output wire next;
reg in1;
wire in2;
wire in3;
wire SYNTHESIZED_WIRE_8;
reg JKFF_inst2;
reg JKFF_inst4;
reg JKFF_inst6;
assign Q1 = JKFF_inst2;
assign Q2 = JKFF_inst4;
assign Q3 = JKFF_inst6;
assign SYNTHESIZED_WIRE_8 = 1;
always@(posedge clk)
begin
in1 <= ~in1 & JKFF0 | in1 & ~JKFF0;
end
assign in2 = in1 & JKFF_inst2;
always@(posedge clk)
begin
JKFF_inst2 <= ~JKFF_inst2 & in1 | JKFF_inst2 & ~in1;
end
always@(posedge clk)
begin
JKFF_inst4 <= ~JKFF_inst4 & in2 | JKFF_inst4 & ~in2;
end
assign in3 = in2 & JKFF_inst4;
always@(posedge clk)
begin
JKFF_inst6 <= ~JKFF_inst6 & in3 | JKFF_inst6 & ~in3;
end
assign next = in3 & JKFF_inst6;
assign Q0 = in1;
endmodule
在测试平台中,我将第一个触发器 JKFF0 的输入设置为 1,并将 clk 信号设置为 10 ns 周期。
timescale 1 ps/ 1 ps
module jk_counter_full_vlg_tst();
reg JKFF0;
reg clk;
wire Q0;
wire Q1;
wire Q2;
wire Q3;
wire next;
jk_counter_full i1 (
.JKFF0(JKFF0),
.Q0(Q0),
.Q1(Q1),
.Q2(Q2),
.Q3(Q3),
.clk(clk),
.next(next)
);
initial
begin
clk = 0;
JKFF0 = 1;
end
always
#1000 clk = ! clk;
endmodule
您的输出未知 (x),因为您没有初始化某些信号。
例如,您将
in1
声明为 reg
类型。 reg
的默认值为 x。这意味着 in1
在模拟开始时(时间 0)为 x。它在整个模拟过程中保持 x,因为您的赋值语句在 RHS 上有未知数。
解决模拟问题的一种方法是初始化
in1
:
reg in1 = 0;
这消除了
Q0
上的 x。
JKFF_inst2
等也是如此
另一种方法是向模块添加复位输入信号。