当我在 Modelsim 中模拟计数器时,输出未定义

问题描述 投票:0回答:1

我在 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
verilog modelsim quartus
1个回答
0
投票

您的输出未知 (x),因为您没有初始化某些信号。

例如,您将

in1
声明为
reg
类型。
reg
的默认值为 x。这意味着
in1
在模拟开始时(时间 0)为 x。它在整个模拟过程中保持 x,因为您的赋值语句在 RHS 上有未知数。

解决模拟问题的一种方法是初始化

in1
:

reg in1 = 0;

这消除了

Q0
上的 x。

JKFF_inst2
等也是如此

另一种方法是向模块添加复位输入信号。

© www.soinside.com 2019 - 2024. All rights reserved.