原创 Altera教程里System Verilog 异步复位同步释放疑问

2009-11-16 12:25 5003 10 16 分类: FPGA/CPLD

在看System Verilog with QII的时候,有两个胶片介绍了异步复位同步释放,下图是原理图:


点击看大图


Altera官方教程给出的代码如下:



module reset_gen ( 


  output rst_sync_n, 


  input  clk, rst_async_n);



logic rst_s1, rst_s2;



always_ff @ (posedge clk, posedge rst_async_n)


  if (rst_async_n) begin         


  rst_s1 <= 1'b0;


  rst_s2 <= 1'b0;


  end


  else begin


  rst_s1 <= 1'b1;


  rst_s2 <= rst_s1;


  end


assign rst_sync_n = rst_s2; 


endmodule


 


经过这QuartusII软件中编译,其fit后map view如下:


点击看大图


上面两个图是一致的,但是问题是我之前了解的异步复位同步释放方法应该象下面代码描述一样:


 


 


module reset_gen ( 


  output rst_sync_n, 


  input  clk, rst_async_n);



logic rst_s1, rst_s2;



always_ff @ (posedge clk, posedge rst_async_n)


  if (rst_async_n) begin         


  rst_s1 <= 1'b1;


  rst_s2 <= 1'b1;


  end


  else begin


  rst_s1 <= 1'b0;


  rst_s2 <= rst_s1;


  end


assign rst_sync_n = rst_s2; 


endmodule


 


上面代码编译后的map view为:


点击看大图


 


个人觉得还是Altera教程里介绍有错误,欢迎高手来讨论!


 


~~~~~~~~~~~~~~~~~~~~~~~~


11:07:44 UTC+0800


 


更改代码的写法,以作为比较,ilove的建议很好,为了提高代码的可阅读性,一般原则reset表示复位是‘1’有效,reset_n表示复位是‘0’有效;不过,本文暂时不作区分,到底0有效还是1有效,以代码为准:


logic rst_s1, rst_s2;


always_ff @ (posedge clk, negedge rst_async_n)
 if (!rst_async_n) begin         
  rst_s1 <= 1'b0;
  rst_s2 <= 1'b0;
  end
 else begin
  rst_s1 <= 1'b1;
  rst_s2 <= rst_s1;
  end
assign rst_sync_n = rst_s2; 


上述代码编译后map view为:


点击看大图


从代码和map view都可以看出异步复位是‘1’有效。


 


当然参考前面两个代码也可以改成复位‘0’有效。


 


现在关心的问题是不管复位信号‘0’或者‘1’有效,进程里对于异步信号敏感列表的两种方式是否有区别?!


 


#########################################


 


把最后一种情况也写出来吧:


logic rst_s1, rst_s2;


always_ff @ (posedge clk, negedge rst_async_n)
 if (!rst_async_n) begin         
  rst_s1 <= 1'b1;
  rst_s2 <= 1'b1;
  end
 else begin
  rst_s1 <= 1'b0;
  rst_s2 <= rst_s1;
  end
assign rst_sync_n = rst_s2; 


Map View形式如下:


点击看大图


 


记得riple说过,为了符合Altera器件内D触发器清零端‘1’有效特性,建议复位信号一般‘1’有效。免得工具insert not gate。


 

文章评论6条评论)

登录后参与讨论

ilove314_323192455 2009-11-19 15:06

因为你这里是异步复位,所以当然应该如你的第3条所示。如果你的敏感表里不加上复位信号,那么就成了同步复位了。

ash_riple_768180695 2009-11-17 13:54

hah hah, 我不记得我说过“复位信号'1'有效”的事啊?我只是觉得,你的复位电路如果按照第一种写法,初始输出为‘0’会更可靠。只是猜想。

coyoo 2009-11-16 12:30

To riple: 是否我第三种写法应该是推荐写法?!

coyoo 2009-11-16 11:02

To ilove314: 从你的留言我可以先明确以下几点: 1、两个代码一个是复位0有效,一个是复位1有效; 2、我们先不区分reset和reset_n的区别; 3、基于以上两点,那么我们来讨论:如果复位信号是0有效的话,是不是敏感列表应该这么写“negedge reset”;而如果复位信号是1有效的话敏感列表必须这么写“posedge reset”. 4、好了这里引申出另外一个问题,因为我是一个Verilog的fresh man,所以在对于异步信号写入敏感列表一直没明白,因为此时均是电平触发,原则上跟沿没关系,在VHDL很好理解,敏感列表就是(clk,reset)即可;那么是不是在Verilog中碰到这样异步set或者reset必须要区分是0 or 1有效后再考虑进程的敏感列表的写法?

ash_riple_768180695 2009-11-15 15:55

“异步复位,同步撤除”是这一类电路的基本设计原则。有一点不知道你是否考虑过?如果器件上电后并没有外部的rst_async_n信号发挥复位的作用,这里的两个寄存器是什么初始状态?如果像文档里说的那样所有寄存器的初始状态都是0,那么在第一个时钟沿到来前,这个复位电路是否有效?如果也像文档里说的那样,通过not-gate push back功能,这两个寄存器可以在上电后被立即初始化为1,这个复位电路是否有效?如果也有效的话,我们是否还应该考虑一下not-gate push back电路的稳定性和可靠性,这一额外的电路是否会引入复位电路的毛刺?请coyoo朋友考虑后给大家一个解答。谢谢!

ilove314_323192455 2009-11-14 22:37

什么对不对的,就我看你这两个代码的区别就在于到底电路是高电平复位还是低电平复位。按常规,感觉你这两个代码都有点问题。你这两个代码似乎都有点矛盾, 有_n后缀一般表示低电平有效,而posedge rst_async_n则表示复位是高电平。 呵呵,具体问题具体分析吧,不要盯着所谓的教程看。

用户36516 2006-11-3 11:07

投一票说话,学习中...

我也请你去我的BLOG看看.

相关推荐阅读
coyoo 2024-12-10 13:28
Cyclone V GX FPGA设计TDC的优化问题
概述 通过前面的研究学习,已经可以在CycloneVGX器件中成功实现完整的TDC(或者说完整的TDL,即延时线),测试结果也比较满足,解决了超大BIN尺寸以及大量0尺寸BIN的问题,但是还是存在一些...
coyoo 2024-12-03 12:20
比较器检测模拟脉冲说明(四)
概述 说明(三)探讨的是比较器一般带有滞回(Hysteresis)功能,为了解决输入信号转换速率不够的问题。前文还提到,即便使能滞回(Hysteresis)功能,还是无法解决SiPM读出测试系统需要解...
coyoo 2024-11-16 13:54
不同ADC采样同一前端模拟信号时转换用时差异分析
概述 同一组前端模拟信号接入由不同型号ADC组成的模数转换电路时,采样后在FPGA中发现采样用时差异较大。本文主要分析这个时间差异形成的原因,并记录该差异产生对系统造成的影响。系统数字化简介 项目前端...
coyoo 2024-11-10 13:04
ALTERA Cyclone 10器件的使用-7:FPGA片内RAM资源利用率思考
概述 项目使用的FPGA目标器件为Cyclone 10 GX系列规模最大一颗料,由于功能升级增加了功能模块更多,发现器件片内RAM不够使用了。为了探索片内RAM使用的利用率问题,从代码RTL级与编译软...
coyoo 2024-11-10 12:30
转知乎:幽灵般的人体成像技术-PET
幽灵般的人体成像技术——PET - 知乎...
coyoo 2024-11-09 10:26
AD9633默认情况下调试记录(二)
概述 所谓默认情况,即如器件手册中图2所标示那样。对应AD9633的调试,除了涉及到ADC自身,还需要兼顾前端驱动器,系统中AD9633驱动器使用了差分运算放大器,这里不在赘述,笔者已有相关文章论述。...
我要评论
6
10
关闭 站长推荐上一条 /2 下一条