Verilog 从按钮中记忆值

Verilog 从按钮中记忆值,verilog,Verilog,我正试图在Verilog中做到这一点: 当按下一个按钮(进入状态1)时,我需要将一个变量设置为1,并保持这样直到我更改它 我的代码是: always@(button) begin if(button==1) begin var1=1; end end 但我似乎得到的是,整个程序的var设置为1。 如何以不同的方式实现我的目标?您总是得到1的原因之一可能是,如果按钮在板上,并且您将其指定为输入,那么它们通常在未按下时输出高,在按下时输出低。如果是这种情况,请使用If(button==0)作为条件

我正试图在Verilog中做到这一点: 当按下一个按钮(进入状态1)时,我需要将一个变量设置为1,并保持这样直到我更改它

我的代码是:

always@(button)
begin
if(button==1) begin
var1=1;
end
end
但我似乎得到的是,整个程序的var设置为1。
如何以不同的方式实现我的目标?

您总是得到1的原因之一可能是,如果按钮在板上,并且您将其指定为输入,那么它们通常在未按下时输出高,在按下时输出低。如果是这种情况,请使用
If(button==0)
作为条件

正如您在命令中提到的,您正在使用另一个always块来更改变量的值,但是您不应该能够从两个不同的always块更改相同的变量。希望我们能找到解决您问题的方法

如果您的设计是同步和时钟的(通常在实际硬件设计中是这样),您可以有这样的设计(如果您的时钟的频率大于10Hz,则是实际的):

模块记忆\u pb(
输入时钟,
//对于代码的其余部分,您可以在此处输入其他内容
输入按钮
);
reg存储的_变量;
//其他寄存器(如果使用)
始终@(posedge clk)
开始
如果(按钮==1)开始//如果第一个原因不是这样

你说过:直到我改变它。你是怎么改变的?在您的示例中,没有重置“var”的代码。顺便说一句,不要使用“var”,它是系统verilog中的一个关键字。我在原始文件中使用了不同的标识符。整个代码太长,无法发布。我有另一个always块(一个长块),它在特定条件下将其设置为0。因为var1在上面的代码中没有替代值,所以它将始终被指定为1。例如,如果button==1,var1将被分配为1。现在假设button==0,“if”检查将失败,但您尚未为var1分配一个可选值,因此它仍保持为1(您已在此处推断出一个闩锁)。也就是说,一个按钮只能有两种状态。。。0或1。所以,如果你说当button==1时希望var1为1,当button==0时希望var1为0,这听起来像是:var1=button,但这并不重要,所以我怀疑我们缺少了上面代码的意图。请查看此链接了解显示完整但最小示例的含义。作为一般规则,您不应该在一个always块中将var1设置为特定值,然后在另一个always块中将其重置。这可能会导致一场比赛,我想你会的。始终在单个“始终”块中执行全套作业。同时停止使用带有灵敏度列表的始终块。改用
始终@*
。这样您就不会错过输入。
module memorize_pb(

input clk,
// you can have some other inputs here for the remaining part of your code
input button

);

reg stored_variable;
// other registers if used
always@(posedge clk)
begin
if(button == 1) begin //if the first reason is not the case
stored_variable <= 1'b1;
end
// other parts of your code and conditions which resets your variable
end //end of always block
endmodule