16 Verilog语法_复位设计

发布时间 2024-01-07 12:41:22作者: 米联客(milianke)

软件版本:无

操作系统:WIN10 64bit

硬件平台:适用所有系列FPGA

登录"米联客"FPGA社区-www.uisrc.com视频课程、答疑解惑!

1概述

本小节讲解Verilog语法的复位设计,需要掌握复位电路的同步复位、异步复位、异步复位同步化和异步复位同步释放。

2复位电路简介

为确保系统上电后有一个明确、稳定的初始状态,或系统运行状态紊乱时可以恢复到正常的初始状态,数字系统设计中一定要有复位电路模块。复位电路异常可能会导致整个系统的功能异常,所以在一定程度上,复位电路的重要性也不亚于时钟电路。

复位电路可分类为同步复位、异步复位、异步复位同步化和异步复位同步释放。

2.1 同步复位

同步复位是指复位信号在时钟有效边沿到来时有效。如果没有时钟,无论复位信号怎样变化,电路也不执行复位操作。

同步复位的代码描述如下:

module sync_reset(

input       rst_n,  

input       clk,  

input       din,  

output reg  dout  

);

     

always @(posedge clk) //敏感列表只有时钟,没有时钟,复位也不会被执行

begin  

    if(!rst_n)   //该复位为clk时钟的同步时钟复位信号

        dout <= 1'b0 ;

    else      

        dout <= din ;

end

     

endmodule

同步复位的优点:信号间是同步的,能滤除复位信号中的毛刺,有利于时序分析。

同步复位的缺点:复位信号的宽度必须大于一个时钟周期,否则可能会漏掉复位信号。

2.2 异步复位

异步复位是指无论时钟到来与否,只要复位信号有效,电路就会执行复位操作。

异步复位的代码描述如下:

module async_reset(

input       rst_n,

input       clk,

input       din,

output reg  dout

);

     

always @(posedge clk or negedge rst_n) //敏感列表有时钟和复位,两者都能触发下列执行语句

begin

    if(!rstn)   //该复位可以为异步复位,同样符合敏感列表negedge rst_n要求,进行复位

        dout <= 1'b0 ;

    else      

        dout <= din ;

end

     

endmodule

异步复位的优点:异步复位信号不经过处理直接引用,设计相对简单,信号识别快速方便。

异步复位的缺点:复位信号与时钟信号无确定的时序关系,异步复位很容易引起时序上 removal 和 recovery 的不满足。且异步复位容易受到毛刺的干扰,产生意外的复位操作。

2.3 异步复位同步化

异步复位同步化是指先将复位信号进行同步化操作,同步后进行异步复位操作。例:

module async_reset_sync(

input       rst_n,  

input       clk,  

input       din,  

output reg  dout  

);

       

reg   rst_n_f1, rst_n_f2;

always@(posedge clk )

begin

    if (!rst_n)

    begin

        rst_n_f1 <= 1'b0;    

        rst_n_f2 <= 1'b0;  

    end

    else

    begin

        rst_n_f1 <= rst_n;     //使用同步时钟对异步复位进行采集

        rst_n_f2 <= rst_n_f1; //此时的rst_n_f2 为rst_n的通过同步时钟采集的信号,既满足复位的要求,又满足同步时钟

    end

end

   

always@(posedge clk or negedge rst_n_f2) //此处虽然依然为异步复位写法,但是rst_n_f2是同步时钟采集到的复位,已同步化

begin

    if (!rst_n_f2)

        dout <= 1'b0;

    else          

        dout <= din;

end

 

endmodule

2.4异步复位同步释放

大多数数字系统设计时都会使用异步复位电路。为消除异步复位的缺点,复位电路往往会采用异步复位同步释放的设计方法。即复位信号到来时不受时钟信号的同步,复位信号释放时需要进行时钟信号的同步。

异步复位同步释放的代码描述如下:

module async_reset_sync_release(

input       rst_n,  

input       clk,  

input       din,  

output reg  dout  

);

       

reg   rst_n_f1, rst_n_f2;

always@(posedge clk or negedge rst_n)

begin

    if (!rst_n)

    begin

        rst_n_f1 <= 1'b0;    //异步复位到来时,也是同样采用低电平

        rst_n_f2 <= 1'b0;    //异步复位到来时,也是同样采用低电平

    end

    else

    begin

        rst_n_f1 <= 1'b1;     //异步复位结束时,由同步时钟进行一定的延时,产生两拍的延时信号

        rst_n_f2 <= rst_n_f1; //既满足异步时钟的产生要求,又可以延长异步时钟,让他满足一定的时钟周期再结束

    end

end

   

always@(posedge clk or negedge rst_n_f2)

begin

    if (!rst_n_f2)

        dout <= 1'b0;

    else          

        dout <= din;

end

 

endmodule