加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Verilog里的同步复位与异步复位(转)

(2010-03-22 18:35:13)
标签:

杂谈

分类: school~
1.同步复位(Synchronous Reset)

来看一个简单的同步复位的D触发器,Verilog代码如下:

module d_ff (
        clk,
        rst_n,
        datain,
        dataout
    );
    input        clk;
    input        rst_n;
    input        datain;
    ouput        dataout;
    reg            dataout;
    always @ (posedge clk)
    begin
        if (!rst_n)
            dataout    <= 1'b0;
        else
            dataout    <= datain;
    end
endmodule

综合后的RTL图表如下:

http://byfiles.storage.msn.com/y1pZnzkV7bhn4ta7qmakDQbNdjbHHV8v-L9SxbDaTq4ExbKNlet9-UTFnmmnOd4bA7tD_IUKPeXd6VozQfl-dt4Ig?PARTNER=WRITER

Altera的MAXII系列的CPLD中,register没有同步复位资源,所以同步复位信号需要通过额外的逻辑电路实现,

同步复位的优点:

1). 抗干扰性高,可以剔除复位信号中周期短于时钟周期的毛刺;

2). 有利于静态时序分析工具的分析;

3). 有利于基于周期的仿真工具的仿真。

同步复位缺点:

1). 占用更多的逻辑资源;

2). 对复位信号的脉冲宽度有要求,必须大于指定的时钟周期,由于线路上的延迟,可能需要多个时钟周期的复位脉冲宽度,且很难保证复位信号到达各个寄存器的时序;

3). 同步复位依赖于时钟,如果电路中的时钟信号出现问题,无法完成复位。

2. 异步复位(Asynchronous Reset)

来看一个简单的异步复位的D触发器,Verilog代码如下:

module prac (
        clk,
        rst_n,
        datain,
        dataout
    );
    input        clk;
    input        rst_n;
    input        datain;
    output        dataout;
    reg            dataout;
    always @ (posedge clk or negedge rst_n)
    begin
        if (!rst_n)
            dataout    <= 1'b0;
        else
            dataout    <= datain;
    end
endmodule

综合后的RTL图表如下:

http://byfiles.storage.msn.com/y1p9s9Pgoj5ONdv4qyKOhoHWS0ILsZOzbOvVB2wkDpoMnsri1Nsssz4JZeeu5pGp1DpsK2_p7-_IGfxP7v3D5L3ZA?PARTNER=WRITER

异步复位的优点:

1). 无需额外的逻辑资源,实现简单,而且CPLD有针对复位信号的全局不限资源,可以保证复位管脚到各个寄存器的clock skew最小(注意不是到各个寄存器的延迟最小);

2). 复位信号不依赖于时钟。

同步复位缺点:

1). 复位信号容易受到外界的干扰;

2). 复位信号释放的随机性,可能导致时序违规,使电路处于亚稳态,如下图。

http://byfiles.storage.msn.com/y1poHgBsXQ4HfSRtGPkRNSxPDXcVHAg10R4M7UgEu7EFTwtsL4UtmjB1xjUc4htdPM2ApUAbKSx6acPo-vxP3VHbg?PARTNER=WRITER

3. 异步复位同步释放(Asynchronous Reset Synchronous Release)

这种复位方式在文献中还有一种称谓:Synchronized Asynchronous Reset,这种称谓应该在国外的技术人员中比较流行,与Altera的工程师交流过程中,他们一直使用Synchronized Asynchronous Reset这种称谓(当然也可能是个人的习惯)。

来看一个Synchronized Asynchronous Reset例子,Verilog代码如下:

module prac (
        clk,
        reset_n,
        dataa,
        datab,
        outa,
        outb
    );
    input        clk;
    input        reset_n;
    input        dataa;
    input        datab;
    output        outa;
    output        outb;
    reg            reg1;
    reg            reg2;
    reg            reg3;
    reg            reg4;
    assign    outa    = reg1;
    assign    outb    = reg2;
    assign    rst_n    = reg4;
    always @ (posedge clk or negedge reset_n)
    begin
        if (!reset_n)
            begin
                reg3    <= 1'b0;
                reg4    <= 1'b0;
            end
        else
            begin
                reg3    <= 1'b1;
                reg4    <= reg3;
            end
    end

    always @ (posedge clk or negedge rst_n)
    begin
        if (!rst_n)
            begin
                reg1    <= 1'b0;
                reg2    <= 1'b0;
            end
        else
            begin
                reg1    <= dataa;
                reg2    <= datab;
            end
    end
endmodule

综合后的RTL图表如下:

http://byfiles.storage.msn.com/y1pTnTT_J6agL9zPj-epcLiX2SP1SbDE3YyPOzLERPe9faHsn54D92APKX9vNLvgrg1B2nL_s6xf2HXjA6jgJUZnA?PARTNER=WRITER

此文来源于《Implementation and Timing of Reset Circuits in Altera FPGAs》,例子程序可能代码与源代码略有出入,RTL图是用QuartusII 8.1综合的,与原文也有出入。

0

阅读 收藏 喜欢 打印举报/Report
前一篇:状态机(转)
后一篇:啥是小波
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有