每次都会在Verilog中执行始终阻止

时间:2018-12-11 09:04:30

标签: verilog fpga

弄清楚这个简单的代码,我一直遇到问题。

module diode(switch,led);
output led;
input switch;
reg led;
always@*
begin
led=1'b0;
end
endmodule

其背后的逻辑如下=按下按钮,LED点亮?

现在我面临的问题是这始终会阻塞。它的工作方式是,只要开关(我按下的按钮)发生变化,LED都应该点亮?但是,即使我什么都不按下,LED也会一直自动亮起,并始终进入阻止状态?解决此问题的唯一方法是,如果我始终将if / else语句置于阻塞状态,以使LED具有默认值(未打开时)。

我的主要问题是:当我什至不按FPGA板上的任何按钮时,为什么LED会得到值1'b0(将其打开)?

即使是使用以下代码,我也尝试在开始时就给LED设置基值:

module diode(switch,led);
output led;
input switch;
reg led=1'b0;
always@*
begin
led = 1'b1;
end
endmodule

由于在Always块中写入的内容,LED始终保持熄灭状态。我没来这里有什么收获?为什么会这样?

任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:0)

verilog设计用于“事件驱动”仿真。这意味着仅在发生输入事件时才执行每个始终块(和其他块)。信号值变化或边沿构成触发块执行的事件。

在经典Verilog中,对于始终块,事件触发信号在灵敏度列表中列出。在v2k中,always @*应该从块附带的代码中找出所有输入。

在您的情况下,always块没有 no 输入,因此永远不要执行它。 switch从未在Always块中使用。除了常量之外,没有其他输入无法更改且无法触发事件。

您需要提供一些逻辑,这些逻辑将使用您的switch使其起作用,即

always @*
    led = ~switch;

当开关为“ 1”(按下)时,它将打开您的LED,然后将其关闭。如果您需要更复杂的逻辑,则应该对其进行处理。如果要通过按下开关来切换LED的状态,则需要创建一个小型状态机。

答案 1 :(得分:0)

下面的代码可以工作

module diode(input  switch,
             output led);

  assign led = (switch)?(1'b0):(1'b1); //Since 1'b0 switches the LED on.

endmodule