软件版本:无 操作系统:WIN10 64bit 硬件平台:适用所有系列FPGA 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 |
|