问答 店铺
热搜: ZYNQ FPGA discuz

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

微信扫一扫 分享朋友圈

已有 34 人浏览分享

开启左侧

第十六课 Verilog 语法_复位设计

[复制链接]
34 0
AMD-FPGA课程
AMD课程: 04-FPGA语法和硬件基础 » X
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




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

本版积分规则

0

关注

10

粉丝

114

主题
精彩推荐
热门资讯
    网友晒图
      图文推荐
        
        • 微信公众平台

        • 扫描访问手机版