Quartus需要根据always块内的if语句来判断同步时钟信号和异步控制信号,例如:
always @ (posedge clk or posedge rst1 or posedge rst2) begin
if ( rst1 || rst2 )
q <= 1'b0;
else
q <= d;
end
以上代码段是一个具有3个敏感事件的always块,敏感事件包含2个异步重置信号和1个时钟信号。Quartus通过if语句找到2个异步信号,进而推测出剩余的1个是同步时钟信号。
- 必须有一个if或else if完全是敏感事件表里的异步信号,不包含其他内容。
- if语句内的条件必须与触发边沿相符,posedge xxx用if(xxx),negedge xxx_n用if(!xxx_n)。
这是一个错误的示例:
always @ (posedge clk or posedge rst) begin
if ( rst || sync_rst )
q <= 1'b0;
else
q <= d;
end
Quartus无法在敏感时间表里匹配到“sync_rst ”这个信号,应该拆开写成以下形式:
always @ (posedge clk or posedge rst) begin
if (rst)
q <= 1'b0;
else if (sync_rst)
q <= 1'b0;
else
q <= d;
end