期望一个向量值并获取一个数组而不是一个 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
有几点我很困惑。
- 在
!reset_
之后的这种情况下,我的 OFF
信号不应该设置为 1 吗?最初我在那个 reset_ 循环中将我的 OFF
设置为 1'b0,但是在 reset_
. 的否定之后给了我一个值 1
- 我认为 LEDStateCount 应该是二进制 28 位长的向量;但是 ModelSim 似乎将它们视为 28x1 数组。不管它是如何存储的,我认为在 LEDStateCount 不等于存储的 Freq 值的情况下它仍然应该增加。
- 如果我不将其设置为按位值递增,而是使用
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 的持续时间内保持断言。这可以防止计数器递增。
我正在尝试创建允许 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
有几点我很困惑。
- 在
!reset_
之后的这种情况下,我的OFF
信号不应该设置为 1 吗?最初我在那个 reset_ 循环中将我的OFF
设置为 1'b0,但是在reset_
. 的否定之后给了我一个值 1
- 我认为 LEDStateCount 应该是二进制 28 位长的向量;但是 ModelSim 似乎将它们视为 28x1 数组。不管它是如何存储的,我认为在 LEDStateCount 不等于存储的 Freq 值的情况下它仍然应该增加。
- 如果我不将其设置为按位值递增,而是使用
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 的持续时间内保持断言。这可以防止计数器递增。