【发布时间】: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
我对一些事情感到困惑。
- 在这种情况下,
!reset_之后我的OFF信号不应该设置为 1 吗?最初我在那个 reset_ 循环中将我的OFF设置为 1'b0,但在reset_的否定之后给了我一个值 1。 - 我认为 LEDStateCount 应该是 28 位二进制长的向量;但是 ModelSim 似乎将它们视为 28x1 阵列。不管它是如何存储的,我认为它应该在 LEDStateCount 不等于存储的 Freq 值的情况下增加。
- 如果我不将其设置为按位递增,而是使用
1,我的OFF信号永远不会初始化,我不确定这是为什么。
我不确定这些问题是由于缺乏 ModelSim 经验、代码问题还是两者兼而有之。 clk 按预期运行,当强制作为一个值时,我可以让 LED1 产生我正在寻找的信号,即高或低。
【问题讨论】: