题解 | #异步复位同步释放#

异步复位同步释放

http://www.nowcoder.com/practice/9b892b6f75954267b4574b042f8a8d6a

1、确定题目要求

复位可以在任何时候发生,表面上看跟时钟没有关系,但真实情况是异步复位也需考虑时钟跳变沿,因为时钟沿变化和异步复位都可以引起Q端数据变化。同步复位虽然解决了当时钟的有效沿来临的时候rst的边沿也正好来临所出现的冒险与竞争。但是从综合的电路上可以看出,多了一个组合逻辑MUX。如果设计中所有的复位都是这样的,那会增加很多的资源,导致芯片面积很大,而异步复位同步释放机制可以解决这一问题。

异步复位同步释放的主要目的就是在减少资源损耗的同时避免毛刺的出现。其机制如下:

异步复位会出现亚稳态是因为无法保证clk的上升沿时,rst释放信号能够满足其建立保持时间,触发器无法判断rst有效还是无效,因而出现亚稳态;而同步释放的处理机制可以保证rst释放信号的建立时间点与clkposedge同步,在当前clkposedge检测到rst稳定的低电平,在下一个clkposedge可以检测到已经稳定的rst高电平,满足了rst的建立保持时间要求,从而不会出现亚稳态。

简单理解:

所谓“异步复位”是针对D触发器的复位端口,它是异步的,所谓“同步释放”,实际上是由于设计了同步逻辑电路,外部复位信号不会在出现释放时与clk信号竞争,整个系统将与全局时钟clk信号同步。


2、写出v代码

module ali16(

input  wire clk,

input  wire rst_n,

input  wire d,

output reg dout

 );

 

reg rst0,rst1;

always @ (posedge clk or negedge rst_n) begin

       if (!rst_n) begin

              rst0 <= 0;

           rst1 <= 0;

       end

       else begin

              rst0 <= 1;

              rst1 <= rst0;

       end

end

 

           

always @ (posedge clk or negedge rst1)begin

        if(!rst1) begin

                     dout <= 1'b0;

              end

        else begin

                    dout <= d;

              end       

end           


           

endmodule

仿真结果如下:


参考答案
`timescale 1ns/1ns


module ali16(
input  wire clk,
input  wire rst_n,
input  wire d,
output reg dout
 );
 
reg rst0,rst1;
always @ (posedge clk or negedge rst_n) begin
	if (!rst_n) begin
		rst0 <= 0;
	    rst1 <= 0;
	end
	else begin
		rst0 <= 1; 
		rst1 <= rst0; 
	end
end
 
            
always @ (posedge clk or negedge rst1)begin
        if(!rst1) begin
			dout <= 1'b0;
		end
        else begin 
 			dout <= d; 
		end		 
end            

            
endmodule 


如果关于此次题单有问题或者反馈意见,欢迎加入牛客用户反馈群沟通~

全部评论

相关推荐

02-07 12:06
已编辑
华侨大学 测试开发
最近看到很多&nbsp;92&nbsp;的,甚至是硕士,开始往测开赛道卷,说实话有点看不懂。先把话说清楚,大厂里的测开,绝大多数时间干的还是测试的活,只是写点自动化脚本、维护测试平台、接接流水线,真正像开发一样做系统、做架构、做核心平台的测开少得可怜,基本都集中在核心提效组,而且人很少,外面进去的大概率轮不到你,我想真正干过人都清楚。很多人被洗脑了,以为测开也是开,和后端差不多,只是更简单、更轻松、还高薪。现实情况是,测开和开发的职业路径完全不一样。开发的核心是业务和系统能力,测开的核心是稳定性和覆盖率,前者是往上走,后者天花板非常明显。你可以见到很多开发转测开,但你很少见到干了几年测开还能顺利转回开发的。更现实一点说,92&nbsp;的高学历如果拿来做测开,大部分时间就是在做重复性很强的杂活,这种工作对个人能力的放大效应非常弱。三年下来,你和一个双非的,甚至本科的测开差距不会太大,但你和同龄的后端、平台开发差距会非常明显。这不是努不努力的问题,是赛道问题。所谓测开简单高薪,本质上是把极少数核心测开的上限,当成了整个岗位的常态来宣传。那些工资高、技术强的测开,本身就是开发水平,只是挂了个测开的名。普通人进去,99%&nbsp;做的都是项目兜底型工作,而不是你想象中的平台开发。测开不是不能做,但它绝对不是开发的平替,也不是性价比最优解。如果你是真的不想做开发,追求稳定,那测开没问题。但如果你只是觉得测开比后端容易,还能进大厂,那我劝你冷静一点,这只是在用短期安全感换长期天花板。有92的学历,如果你连测开这些重复性工作都能心甘情愿接受,那你把时间精力用在真正的开发、系统、业务深度上,回报大概率比卷测开要高得多。想清楚再下场,别被岗位名和话术带偏了,就算去个前端客户端也是随便占坑的,测开是一个坑位很少赛道,反而大面积学历下放,不用想也能知道会是什么结果,我想各位在JAVA那里已经看到了
烤点老白薯:测测你的
点赞 评论 收藏
分享
评论
15
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务