块RAM使用同步重置
RAM只有同步复位,块ram通过使用输出寄存器获得最小时钟输出时间。
非复位不可吗?
流水线的操作在几个周期内就会把垃圾数据给移走,所以在这里的设计进行复位是多余的。
但是有一些情况下,复位的释放后是很重要的。
比如独热码状态机。如果表示独热码状态的第一个触发器比第二个触发器早释放了一个时钟周期,那状态机的状态机会跳转到一个无效的状态。如果所有的表示独热码的寄存器无法在同一个周期内被释放,那状态机肯定会跳转到一个无效的状态。
其实当Xilinx FPGA配置或重新配置时,所有的单元都会被初始化。称为master reset,因为这可比你复位一些D触发器要强得多,它甚至初始化了片内RAM。
Xilinx的器件也有嵌入处理的系列,软核或硬核。在程序执行第一条指令前,程序和数据区域已经定义好了。有了上电复位,还用专门消耗逻辑资源去复位触发器是没有意义的。
通常可以将设计分为两部分,控制路径和数据路径
-至于数据路径,初始值并不重要。重置是不必要的。
-只在设计中需要获得有效帧信号或设计回到已知良好状态的部分使用外部复位
不复位是最好的!
总之就是能不用复位就尽量不用。
demo分享
demo1
优化前资源使用:
优化后:
资源节约的不是一点点阿…
全局复位和模块复位对比
高扇出
优化后你就说带不带劲哈哈哈哈。
复位总结
- 复位前考虑是否需要复位
- 尽量不用复位
- 使用初始化代码寄存器进行复位
- 使用异步复位时候要注意
使用异步复位,同步释放的方法。用内部定义复位信号的方法来复位触发器,而不是全都直接使用全局复位信号。当进行复位操作时,所有的触发器被预设为1。如上图,移位寄存器的最后一个触发器去操作模块内部定义的复位网络。当复位信号释放时,移位寄存器经过移位,当最后一个触发器由高电平变为低电平时,对本地的复位网络进行复位操作。也就是异步复位,同步释放。
异步复位,就是复位信号可以直接不受时钟信号影响,在任意时刻只要是低电平就能复位(假如约定低电平复位),也就是说,复位信号不需要和时钟同步。而同步释放就很有意思了,它的意思是让复位信号取消的时候,必须跟时钟信号同步,也就是说正好跟时钟同沿。
module Reset_test( input clk, input rst_nin, output reg rst_nout ); reg rst_mid; always@(posedge clk or negedge rst_nin) begin if(!rst_nin) begin rst_mid <= 0; rst_nout <= 0; end else begin rst_mid <= 1; rst_nout <= rst_mid; end end endmodule