首先,本人查找了异步复位同步释放原理网络相关资料。大都没有讲清楚相关原理性的东西,使人困恼。html
现花时间进行原理性的解答:理解为何异步复位、同步释放可以实现?后端
首先要知道复位D触发器的工做原理,复位信号做用于最后端口也做用于触发器逻辑中间。网络
当复位端有效时(通常为1),复位信号直接做用于最后一级的SR锁存器(须要知道锁存器的原理以及触发器的原理,这个是电子的基础),此时触发器直接输出q为0。异步
当复位信号无效时(为0时),复位信号为0,不能驱动最后一级SR锁存器,此时输出q=输入的d,其中由时钟信号与复位信号共同进行控制数据的变化,使q=d。spa
该图为set,clr都为复位端的图,咱们理解时,使用单独set进行理解。3d
异步复位、同步释放。code
module code ( clk,rst_n,rst_n_out); input clk; input rst_n; output rst_n_out; //wire rst_n_out_n; //输入输出没定义类型,默认是wire型 reg rst_n1; reg rst_n2; always @(posedge clk or negedge rst_n) begin if(!rst_n) begin rst_n1 <= 1'b0; rst_n2 <= 1'b0; end else begin rst_n1 <= 1'b1; rst_n2 <= rst_n1; end end assign rst_n_out = rst_n2; endmodule
先以rst_n为0,复位端即为1(将此时为复位状态做起点),此时q1与q2同时由复位信号rst_n控制,直接输出为0。htm
当rst_n从0变为1过程当中时,此时复位端变为0,将没法直接做用与触发器的输出端。此时的状态,q1由d1决定,q2由d2肯定。此时因为q1有时钟上升沿与复位信号共同做用与第一触发器blog
,因为d1为1,q1输出将根据clk来决定,而此时因为时钟与复位信号已经做用与第二触发器,此时d2为以前q1=0的状态,因为d2为0,根据D触发器的原理,不管clk为何,q2=0,因而q2继续输出为0。input
当第一触发器不知足复位信号与时钟信号的恢复时间时,即不知足第一级触发器内部延时,这个时候,第一级触发器将发生亚稳态状态,而此时第二级触发器已经上升沿完毕,
须要等下一个上升沿才能继续改变q2数据。
当亚稳态时间过去以后(亚稳态时间不会超过一个周期,超过一个周期仍然会影响到第二级触发器),下一个周期时钟来临时,此时第一触发器已经可以正常的输出为1,而第二触发器也可以直接等于d2,这时输出rst_n_out = 1,完成复位。
也就是说异步复位、同步释放的本质就是,将本来由异步复位信号在有效时能直接做用于输出端,改成延后一个周期经过在复位信号无效时进行时钟控制,即同步释放。
原文出处:https://www.cnblogs.com/jevonFPGA/p/11295328.html