我在initial
块中有一些变量
initial
begin
i = 32'b0;
j = 32'b1;
end
每次按下按钮时,我都想用这样的初始值来初始化它们
always @(posedge btn)
begin
i = 32'b0;
j = 32'b1;
end
这样做会导致错误"无法解决多个常量驱动程序",我知道为什么会发生这种情况,但是,有其他方法吗??
听起来像是在创建可合成的代码(根据您按下按钮的需要(。初始块不合成逻辑,它们仅用于模拟。通常使用重置信号来设置初始值。
此外,您通常希望将任何一个信号的逻辑保留在单个块中,而不是将其分离为单独的块。(同样,这是针对可合成代码的,对于模拟来说这并不重要(
最后,您通常不希望使用外部异步信号来为某些逻辑计时(除非您知道自己在做什么(。相反,你会编写一些代码,比如:
//---- 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个触发器同步以避免亚稳态也是一种很好的做法。