从开关驱动 LED
Driving an LED from a switch
我一直在用Altera的Quartus II结合terASIC DE10板学习Verilog,但现在发生了意想不到的事情。
为了调试,我通过一个开关驱动一个LED,在两者之间插入了一个模块:
switch-module-led
模块代码如下,其中变量to_led
的值在每次in_clock_counter[0]
变化时更新。
module in_out (
input [31:0] in_clock_counter,
input from_switch,
output reg to_led
);
always @ (posedge in_clock_counter)
begin
if (from_switch)
to_led <= 1'b1;
else
to_led <= 1'b0;
end
endmodule
我希望如果我按下开关,LED 就会点亮。但这种情况并非如此。
使用仿真波形编辑器,我可以看到 LED 值发生了变化。我做错了什么?
您可能会通过将多位向量传递给 posedge
敏感度列表来混淆该工具。这是一件非常不寻常的事情,所以我不会相信综合工具链有类似的东西。
在 FPGA 中使用逻辑输出作为时钟信号还存在其他复杂性。这不太可能是您的直接问题,因为您的模块很简单,但可能会给您带来问题。您应该考虑在那里使用普通时钟信号,并创建逻辑来检查计数器的值。
还要考虑一下,如果这个模块在模拟中工作,也许错误不在这个模块中。
and the system works as intended
很高兴你成功了。
isn't it a PLL block necessary to create a constant clock frequency? I thought so.
不,最好、最稳定的时钟是直接来自振荡器的时钟。
PLL 允许您从该时钟产生不同的频率(除了通常的:除以 2、除以 3 等)
例如,有些允许您制作像 23/3 时钟一样奇怪的东西。因此也有更高的频率。 (事实上 3GHz 处理器就是从那里获得时钟的。)但是抖动规格总是比你的 crystal 差。
但该代码仍应从 PLL 时钟运行,所以我怀疑还有其他问题。我建议您查看综合网表(原理图)。并检查所有连接的位置。
我一直在用Altera的Quartus II结合terASIC DE10板学习Verilog,但现在发生了意想不到的事情。
为了调试,我通过一个开关驱动一个LED,在两者之间插入了一个模块: switch-module-led
模块代码如下,其中变量to_led
的值在每次in_clock_counter[0]
变化时更新。
module in_out (
input [31:0] in_clock_counter,
input from_switch,
output reg to_led
);
always @ (posedge in_clock_counter)
begin
if (from_switch)
to_led <= 1'b1;
else
to_led <= 1'b0;
end
endmodule
我希望如果我按下开关,LED 就会点亮。但这种情况并非如此。 使用仿真波形编辑器,我可以看到 LED 值发生了变化。我做错了什么?
您可能会通过将多位向量传递给 posedge
敏感度列表来混淆该工具。这是一件非常不寻常的事情,所以我不会相信综合工具链有类似的东西。
在 FPGA 中使用逻辑输出作为时钟信号还存在其他复杂性。这不太可能是您的直接问题,因为您的模块很简单,但可能会给您带来问题。您应该考虑在那里使用普通时钟信号,并创建逻辑来检查计数器的值。
还要考虑一下,如果这个模块在模拟中工作,也许错误不在这个模块中。
and the system works as intended
很高兴你成功了。
isn't it a PLL block necessary to create a constant clock frequency? I thought so.
不,最好、最稳定的时钟是直接来自振荡器的时钟。
PLL 允许您从该时钟产生不同的频率(除了通常的:除以 2、除以 3 等)
例如,有些允许您制作像 23/3 时钟一样奇怪的东西。因此也有更高的频率。 (事实上 3GHz 处理器就是从那里获得时钟的。)但是抖动规格总是比你的 crystal 差。
但该代码仍应从 PLL 时钟运行,所以我怀疑还有其他问题。我建议您查看综合网表(原理图)。并检查所有连接的位置。