期望一个向量值并获取一个数组而不是一个 reg

Expecting a vector value and getting an array instead for a reg

我正在尝试创建允许 LED 以特定频率闪烁的 Verilog 代码。我有一个 reg 用作计数器,我认为它应该是一个向量,但在 ModelSim 中却说它是一个打包数组。

VERILOG 代码

module main(
    input wire clk,         //100MHz//
    input wire reset_,
    output LED1     //LED On/Off Two-States//
    );
    reg [27:0] LEDStateCount;   //LED Counter - 27 Bit Stored//
    reg OFF;            //State of LED//    
    localparam [27:0] Freq=50000000;    
    assign LED1 = OFF;         
    always @(posedge clk or negedge reset_)begin
        if (!reset_)begin
            LEDStateCount <= 28'b0;    //On startup, clear value//
            OFF <= 1'b1;
        end
        else if (LEDStateCount<Freq)begin
            LEDStateCount <= LEDStateCount + 1'b1;    //Accumulate to ~50,000,000//
        end 
    else if (LEDStateCount == Freq); begin
        OFF <= 1'b0;             //LED Off Until Value Reached//
        end
    end
endmodule

测试台

`timescale 1 ps/ 1 ps
module testbenchsaveme();
reg clk;
reg reset_;                                             
wire LED1;                              
main i1 (   
    .LED1(LED1),
    .clk(clk),
    .reset_(reset_)
);
initial 
begin 
#100000000 $stop;
end 
always
begin
    clk = 1'b0;
    clk = #5000 1'b1;
    #5000;
end  
initial
begin
    reset_ = 1'b1;
    reset_ = #100 1'b0;
end 
endmodule

有几点我很困惑。

  1. !reset_ 之后的这种情况下,我的 OFF 信号不应该设置为 1 吗?最初我在那个 reset_ 循环中将我的 OFF 设置为 1'b0,但是在 reset_.
  2. 的否定之后给了我一个值 1
  3. 我认为 LEDStateCount 应该是二进制 28 位长的向量;但是 ModelSim 似乎将它们视为 28x1 数组。不管它是如何存储的,我认为在 LEDStateCount 不等于存储的 Freq 值的情况下它仍然应该增加。
  4. 如果我不将其设置为按位值递增,而是使用 1,我的 OFF 信号永远不会初始化,我不确定为什么会这样。

我不确定这些问题是因为缺乏 ModelSim 经验、代码问题还是两者兼而有之。 clk 按预期运行,当强制作为一个值时,我可以获得 LED1 来产生我正在寻找的信号,即高或低。

第一个问题很棘手。你有一个分号,你不希望它是。变化:

else if (LEDStateCount == Freq); begin

至:

else if (LEDStateCount == Freq) begin

现在我看到 OFF 变成 1.


关于你的计数器不计数的第二个问题是由于复位信号。因为你的复位信号是低电平有效的,你想在你的测试台上以不同的方式驱动它:

initial
begin
    reset_ = 1'b0;
    reset_ = #100 1'b1;
end 

通常,您希望复位在时间 0 断言,然后在延迟后释放。在您的代码中,您在时间 100 断言它,然后在 sim 的持续时间内保持断言。这可以防止计数器递增。