复位的几种类型

1、同步复位同步释放:(常用)

需要保持rst和a在同一时钟域下,且clk需要是持续稳定的。

always @(posedge clk ) begin
    if(rst)
        q <= 0 ;
    else 
        q <= a ;
end

2、异步复位异步释放:(存在 Recovering time)

没有时钟的情况下也能复位。但rst和a不在同一时钟域下,rst复位释放后,触发器会需要一点恢复时间才能采样数据a,称为Recovering time 。如果Recovering time后,a满足不了保持建立时间,则会出现亚稳态或者采样丢失。

always @(posedge clk or posedge rst) begin
    if (rst)
         q <= 0 ;
    else 
         q <= a;
end 

3、同步复位异步释放:(不推荐)

实际上是异步复位的同步化。虽然这样在Recovering time后能稳定采样a信号,但相比同步复位同步释放没啥优势且仍然需要稳定的clk。

    always @(posedge clk) begin
        reset_sync <= reset;
    end

    always @(posedge clk or posedge reset_sync) begin
        if (reset_sync) 
            q <= 0;    
        else 
            q <= a;       
    end

 4、异步复位同步释放:(推荐)

既能在没有时钟的情况下复位,又可以在复位释放后所有触发器同步开始采样。

也可以使用计数器产生rst_sync

//低电平有效


(* ASYNC_REG = “TRUE” *) reg rst_s1 ,rst_s2 
//把两个寄存器约束到一个slice里面,给亚稳态留足时间

always @ (posedge clk or  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; 

always @ (posedge clk or  negedge rst_sync_n)begin

    if (!rst_sync_n)
        q <= 0 ;
    else 
        q <= a ;
end 
//高电平有效
always @(posedge clk ) begin
    rst_sync <= {rst_sync[1:0],rst};
end

always @(posedge clk or posedge rst) begin
    if (rst)
         q <=0 ;
    else if (rst_sync[2])
         q <=0;
    else 
         q = a;
end

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值