我在initial
块中有一些变量
initial
begin
i = 32'b0;
j = 32'b1;
end
每次按下按钮时,我都想用这样的初始值初始化它们
always @(posedge btn)
begin
i = 32'b0;
j = 32'b1;
end
这样做会产生错误“无法解析多个常量驱动程序”,我知道为什么会发生,但是还有另一种解决方法吗?
答案 0 :(得分:1)
听起来您正在创建可合成代码(根据您需要按下按钮的情况)。初始块不合成为逻辑,它们仅用于仿真。通常,您使用重置信号来设置初始值。
通常,您还希望将任何一个信号的逻辑保留在一个块中,而不是将其分成单独的块。 (同样,这是针对可合成的代码,对于仿真而言,这并不重要)
最后,您通常不希望使用外部异步信号来计时某些逻辑(除非您知道自己在做什么)。您应该编写类似以下代码:
//---- detect rising edge of btn ----
reg btn_prev;
wire rising_edge_btn;
always @(posedge clk)
btn_prev <= btn;
assign rising_edge_btn = ~btn_prev & btn;
// ---- i and j logic --------------
always @(posedge clk) begin
if( rst || rising_edge_btn) begin
i <= 0;
j <= 1;
end
else
//some other logic here
end
end
上面的代码使用同步复位信号“ rst”。您还可以找到具有异步复位的设计。最好将外部异步btn信号与2个触发器进行同步以避免亚稳态。