Verilog:错误引用标量线 'VALUE' 不是合法的 reg 或变量左值
Verilog : error Reference to scalar wire 'VALUE' is not a legal reg or variable lvalue
我受困于这段代码。我不明白为什么我的 VALUE
不能反转。
module PREDIV(
input wire QUARTZ,
output wire VALUE);
always @ (posedge QUARTZ)
assign VALUE= ~VALUE;
endmodule
有一些问题。
您不应在 always
块中使用 assign
关键字。
进行程序分配时(在 always
块内),您应该将信号声明为 reg
类型,而不是 wire
。这就是您的错误消息所指的内容。
对于顺序逻辑,您应该使用非阻塞赋值:<=
。
最后,一个reg
被初始化为未知(X
)。你需要一种方法来初始化VALUE
,否则它将保持X
。一种方法是添加 RESET
信号。
module PREDIV(
input wire QUARTZ, input RESET,
output reg VALUE);
always @ (posedge QUARTZ or posedge RESET)
if (RESET) begin
VALUE <= 0;
end else begin
VALUE <= ~VALUE;
end
endmodule
看起来代码在 always
块中使用了阻塞赋值。
always
块应该只使用非阻塞赋值。
代码应该是这样的:
always @(posedge QUARTS)
Value <= ~Value;
我受困于这段代码。我不明白为什么我的 VALUE
不能反转。
module PREDIV(
input wire QUARTZ,
output wire VALUE);
always @ (posedge QUARTZ)
assign VALUE= ~VALUE;
endmodule
有一些问题。
您不应在 always
块中使用 assign
关键字。
进行程序分配时(在 always
块内),您应该将信号声明为 reg
类型,而不是 wire
。这就是您的错误消息所指的内容。
对于顺序逻辑,您应该使用非阻塞赋值:<=
。
最后,一个reg
被初始化为未知(X
)。你需要一种方法来初始化VALUE
,否则它将保持X
。一种方法是添加 RESET
信号。
module PREDIV(
input wire QUARTZ, input RESET,
output reg VALUE);
always @ (posedge QUARTZ or posedge RESET)
if (RESET) begin
VALUE <= 0;
end else begin
VALUE <= ~VALUE;
end
endmodule
看起来代码在 always
块中使用了阻塞赋值。
always
块应该只使用非阻塞赋值。
代码应该是这样的:
always @(posedge QUARTS)
Value <= ~Value;