【问题标题】:1 Second ClkDivider Simulation Not Working1 秒 ClkDivider 模拟不工作
【发布时间】:2022-01-24 03:00:11
【问题描述】:

我正在尝试使用 100 MHz clk 输入创建第二个 clk 计数器,但是当我模拟 clk 分频器时,即使 clk 输入正确,它也只会将输出显示为 X。我可能做错了什么?

1 秒时钟分频器:

module clkdiv(
    input clk,
    input [25:0] terminalcount,
    output reg clk_div
);

reg [25:0] count;
wire tc;

assign tc = (count == terminalcount);

always @ (posedge(clk)) begin
    if (tc) count <= 0;
    else count <= count + 1;
end

always @ (posedge(clk)) begin
    if (tc) clk_div = !clk_div;
end

endmodule

测试台:

module clockdivTB;

// inputs 
reg clk; // make 100 MHz -- T = 10 ns

// outputs
wire newclk;

// second clock -- connect test signals to clkdiv
clkdiv slowclkCUT (
    .clk(clk),
    .terminalcount(50000000-1), // 1 Hz
    .clk_div(newclk)
);

// initialize inputs
initial begin 
    clk = 0;    
    
    // create input clock 100MHz
    forever #5 clk = ~clk;
end

endmodule

结果:

【问题讨论】:

  • 听起来不错。您的 tc 仅在计数器达到特定值时才会激活。直到那时它是0。因此,counter 无法重置并停留在x。换句话说,它永远不会退出这个状态。您需要考虑在复位信号处复位计数器。

标签: verilog simulation fpga


【解决方案1】:

输出是 X,因为 reg 类型被初始化为 X(未知)。您需要将输出初始化为已知值。出于模拟目的,您可以将clk_divcount 设置为0,如下所示:

module clkdiv(
    input clk,
    input [25:0] terminalcount,
    output reg clk_div = 0
);

reg [25:0] count = 0;

但是,如果您想综合您的逻辑,您可能需要添加一个复位输入。您可以从测试台驱动输入。

module clkdiv(
    input reset,
    input clk,
    input [25:0] terminalcount,
    output reg clk_div
);

reg [25:0] count;
wire tc;

assign tc = (count == terminalcount);

always @ (posedge(clk)) begin
    if (reset) count <= 0;
    else if (tc) count <= 0;
    else count <= count + 1;
end

always @ (posedge(clk)) begin
    if (reset) clk_div <= 0;
    else if (tc) clk_div <= !clk_div;
end

endmodule

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 2017-05-21
    • 2012-08-11
    • 2015-12-12
    • 2014-10-15
    相关资源
    最近更新 更多