弄清楚这个简单的代码,我一直遇到问题。
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始终保持熄灭状态。我没来这里有什么收获?为什么会这样?
任何帮助将不胜感激。谢谢!
答案 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