【问题标题】:Expecting a vector value and getting an array instead for a reg期望一个向量值并获取一个数组而不是一个 reg
【发布时间】:2021-10-21 19:09:12
【问题描述】:

我正在尝试创建允许 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_ 的否定之后给了我一个值 1。
  2. 我认为 LEDStateCount 应该是 28 位二进制长的向量;但是 ModelSim 似乎将它们视为 28x1 阵列。不管它是如何存储的,我认为它应该在 LEDStateCount 不等于存储的 Freq 值的情况下增加。
  3. 如果我不将其设置为按位递增,而是使用1,我的OFF 信号永远不会初始化,我不确定这是为什么。

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

【问题讨论】:

    标签: verilog modelsim


    【解决方案1】:

    第一个问题很棘手。您有一个不希望出现的分号。变化:

    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 的持续时间内保持它断言。这可以防止计数器递增。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-18
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 2017-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多