从开关驱动 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 时钟运行,所以我怀疑还有其他问题。我建议您查看综合网表(原理图)。并检查所有连接的位置。