[X]关闭

16 Verilog语法_复位设计

文档创建者:uisrc
浏览次数:1235
最后更新:2024-01-07
FPGA基础知识
FPGA基础: FPGA编程语言 » Verilog编程入门
软件版本:无
操作系统: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



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则