【问题标题】:Verilog - Register being removed at synthesisVerilog - 寄存器在综合时被删除
【发布时间】:2017-04-27 16:00:38
【问题描述】:

我写了一小段 Verilog,它显示了 LED 的计数。我收到来自 Vivado 的警告:

[Synth 8-3332] Sequential element (led_reg[3]) is unused and will be removed from module top.

这是我的代码:

module top(
input   wire            reset,       //  ACTIVE LOW
input   wire            system_clk_p,//  200MHz DIFFERENTIAL CLOCK
input   wire            system_clk_n,//

//LED
output  reg    [3:0]   led
);

reg counter;
wire reset_p;

assign reset_p = ~reset;

clk_wiz_0 clocks
(
    .clock_200MHz_p(system_clk_p),    // Input Clock 200MHz p
    .clock_200MHz_n(system_clk_n),    // Input Clock 200MHz n
    .clock_125MHz(clock_125MHz),      // Output Clock 125MHz
    .reset(reset_p)
);

always @(posedge clock_125MHz or negedge reset)
begin
    if (!reset)
    begin
        counter <= 0;
        led <= 0;
    end
    else
    begin
        counter <= counter + 1;
        if (counter == 125000000)
        begin
            counter <= 0;
            led <= led + 1;
        end
    end
end

endmodule

我认为 LED 的寄存器是绝对需要的,因为我正在增加 LED 的值。

【问题讨论】:

    标签: verilog fpga vivado


    【解决方案1】:

    我想我会发布这个,因为我花了一点时间才意识到问题所在,而且通常很难只见树木不见森林:

    警告告诉我 LED 寄存器已被合成,因为它没有被使用;我的错误是认为这意味着 led_reg 是问题所在,而不是。

    问题在于counter 被声明为reg counter;,它只有一位宽。因为它是一位宽,所以在溢出之前它可以计数的最大数字是 1,这意味着它永远无法达到预期的 125000000,而这是需要 led 输出的地方。结果,合成器优化了led_reg,因为那段代码无法访问。

    为了解决这个问题,我将 counter 声明为 integer counter;,它的宽度足以数到 125000000。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多