always块内if条件语句的规则

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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容