uisrc 发表于 2024-1-7 13:39:43

16 Verilog语法_复位设计

软件版本:无操作系统:WIN10 64bit硬件平台:适用所有系列FPGA登录"米联客"FPGA社区-www.uisrc.com视频课程、答疑解惑!1概述本小节讲解Verilog语法的复位设计,需要掌握复位电路的同步复位、异步复位、异步复位同步化和异步复位同步释放。2复位电路简介为确保系统上电后有一个明确、稳定的初始状态,或系统运行状态紊乱时可以恢复到正常的初始状态,数字系统设计中一定要有复位电路模块。复位电路异常可能会导致整个系统的功能异常,所以在一定程度上,复位电路的重要性也不亚于时钟电路。复位电路可分类为同步复位、异步复位、异步复位同步化和异步复位同步释放。2.1 同步复位同步复位是指复位信号在时钟有效边沿到来时有效。如果没有时钟,无论复位信号怎样变化,电路也不执行复位操作。同步复位的代码描述如下:
module sync_reset(input       rst_n,input       clk,input       din,output regdout);
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 regdout);
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 regdout);
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的通过同步时钟采集的信号,既满足复位的要求,又满足同步时钟    endend
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 regdout);
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; //既满足异步时钟的产生要求,又可以延长异步时钟,让他满足一定的时钟周期再结束    endend
always@(posedge clk or negedge rst_n_f2)begin    if (!rst_n_f2)      dout <= 1'b0;    else                dout <= din;end
endmodule



页: [1]
查看完整版本: 16 Verilog语法_复位设计