FPGA学习笔记(八)同步/异步信号的打拍分析处理及亚稳态分析
系列文章目录
一、FPGA学习笔记(一)入门背景、软件及时钟约束
二、FPGA学习笔记(二)Verilog语法初步学习(语法篇1)
三、FPGA学习笔记(三) 流水灯入门FPGA设计流程
四、FPGA学习笔记(四)通过数码管学习顶层模块和例化的编写
五、FPGA学习笔记(五)Testbench(测试平台)文件编写进行Modelsim仿真
六、FPGA学习笔记(六)Modelsim单独仿真和Quartus联合仿真
七、FPGA学习笔记(七)verilog的深入学习之任务与函数(语法篇3)
文章目录
- 系列文章目录
- 前言
- 一、打拍是什么?
- 二、为什么要打拍
- 三、常见的打拍要求
- 四、常见的复位过程
- 1.异步复位
- 2.同步复位
- 3.异步复位,同步释放(两次打拍,复位亚稳态常见处理方法)
- 五.常见的打拍理解
- 1.打拍两次
- 2.打拍三次
- 六. FIFO进行异步跨频数据处理
- 七、总结
前言
在学习FPGA串口通信的过程中,遇到了串口接收中打拍处理的问题,有的人打两拍,有的打三拍,于是决定分析一下到底打几拍才是最好的。
提示:以下是本篇文章正文内容,下面案例可供参考
一、打拍是什么?
always@(posedge sys_clk or negedge sys_rst_n)begin if(!sys_rst_n)begin uart_rx_d1 <= 1'b0;uart_rx_d2 <= 1'b0;uart_rx_d3 <= 1'b0;endelse beginuart_rx_d1 <= uart_rxd;uart_rx_d2 <= uart_rx_d1;uart_rx_d3 <= uart_rx_d2;end
end
如程序中所写,打拍就是把信号进行记录保存,同时带有一定延后性。
uart_rx_d1 这里存放的最新的数据
uart_rx_d2 存放的是前一个数据
uart_rx_d3 存放的上上一个数据
同时这里使用的是非阻塞赋值,所以这几个值只能赋值后的下一个周期才能判断。
要注意的是这里的打拍只能从慢时钟域到快时钟域才能实现。
二、为什么要打拍
首先是因为可能出现亚稳态的现象,其次是为了判断上升沿和下降沿。
亚稳态现象:
当时钟信号上升沿到来的时候正好采样的数据也在发生变化,但是如果想要采样得到一个稳定值,在clk的上升沿的前一段时间有一个建立时间TSU和在clk的上升沿的后一段时间有一个保持时间Th,如果在这两个时间段内采样的信号发生跳变的话,输出的信号就会出现0,1之间跳变的不稳定、不确定状态。这里要注意最后会稳定下来,但是稳定值是0或1不确定,与输入值无关。
亚稳态的危害:
亚稳态如果不解决,那么他会一直向下传播,不知道会传播多少级,如果后面是组合逻辑,那么亚稳态无法消除,那么会严重影响我们的数据提取与数据处理!
亚稳态的处理方法:
1.降低系统时钟频率
2.用反应更快的FF
3.引入同步机制,防止亚稳态传播(加两级D触发器)。
4.改善时钟质量,用边沿变化快速的时钟信号
三、常见的打拍要求
1.全局时钟的跳变沿最可靠。
2.来自异步时钟域的输入需要寄存一次以同步化,再寄存一次以减少亚稳态带来的影响。
3.不需要用到跳变沿的来自同一时钟域的输入,没有必要对信号进行寄存。
4.需要用到跳变沿的来自同一时钟域的输入,寄存一次即可。
5.需要用到跳变沿的来自不同时钟域的输入,需要用到3个触发器,前两个用以同步,第3个触发器的输出和第2个的输出经过逻辑门来判断跳变沿。
四、常见的复位过程
1.异步复位
一般复位采用的是异步复位:
always @ (posedge clk or negedge rst_n) beginif (!rst_n)xxxx;else if (xx) beginxxxx;xxxx;endend
这里收到复位的下降沿就程序执行,但是当由低到高释放时,应该会出现亚稳态。
2.同步复位
always @ (posedge clk) beginif (!rst_n)xxxx;end
即如果复位信号有效,则只能在时钟上升沿让电路复位。同样有亚稳态的现象的可能性。
3.异步复位,同步释放(两次打拍,复位亚稳态常见处理方法)
异步复位,同步释放(复位信号):在rst_n信号为低时,立刻进行复位,而rst_n信号由低到高释放时,为了防止亚稳态的出现,将rst_n信号用DFF向后延一周期,达到与时钟clk边沿同步的目的。
input clk ;
input rst_n ;
output reg rst_s2;
reg rst_s1;always @ (posedge clk or negedge rst_n) beginif (!rst_n) beginrst_s1 <= 1'b0;rst_s2 <= 1'b0;endelse beginrst_s1 <= 1'b1 ;rst_s2 <= rst_s1 ;end
end
五.常见的打拍理解
1.打拍两次
常见的串口接收时,寄存三次:(一般一个时钟周期内,亚稳态会稳定,这里稳定到1为例)
如上图所示,一般用reg2和reg3来判断上升沿/下降沿,这就是寄存三次的时序图,但是看这个图,好像reg3没有必要,因为亚稳态一个周期内稳定后,是可以用reg2和reg1判断上下升降沿
2.打拍三次
第一级寄存器产生亚稳态并经过自身后可以稳定输出的概率为 70%~80%左右,第二级寄存器可以稳定输出的概率为 99%左右。
所以一般第二级的寄存器自身肯定能稳定,图上就是第一级没有稳定,第二级稳定了,然后再加一级就可以判断上升沿和下降沿。
六. FIFO进行异步跨频数据处理
除了上面的异步复位,同步释放、打拍两次/三次,还有利用FIFO。
当数据流从一个时钟域到另一个时钟域的时候,绝大多数情况下都采用FIFO来作为中间缓冲,采用双时钟对数据缓冲,就可以避免亚稳态的发生。
这里还没有了解学习,之后补充、
七、总结
这里要对前面的内容进行一些补充:
1.D触发器不是在时钟信号上升沿到来后才有信号输出吗,那么这一周期不应该是亚稳态状态吗?
D触发器在亚稳态期间会0-1波动,但之后会慢慢稳定下来,就像上面的图,最后是一个确定值(但是结果未知,和输入无关),所以这也就是为什么要加多级寄存器,目的是让亚稳态过渡过去。(一开始以为D触发器只会在时钟上升沿的时候输出信号,所以一遇到亚稳态就一整个周期都信号不确定了,所以不明白为什么会有第二级寄存器采集到是一个确定值,原来慢慢会自己稳定)
2.亚稳态稳定值未知,那么上面的图不就是错的吗?
上面的图显示如果最后亚稳态的稳定值和输入一样,显然一切都正确,如果不一样
可以看到,最后还是可以用这段代码判断的。所以这里的亚稳态为什么要处理,就是怕一直往下传播,如果你对这个reg1在亚稳态的时候程序中用了很多次,那么这个亚稳态将传播的到处都是。
FPGA学习笔记(八)同步/异步信号的打拍分析处理及亚稳态分析相关推荐
- FPGA学习笔记(八):ASK调制解调的仿真
笔记八是ASK调制解调的仿真实现. ASK调制解调的实现原理:首先使用MATLAB产生存储基带波形的coe文件,再让ROM读取coe文件输出基带波形,然后DDS产生正弦波信号作为载波信号,接下来使用乘 ...
- FPGA学习笔记(十二)IP核之FIFO的学习总结
系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...
- 小梅哥FPGA学习笔记
小梅哥FPGA学习笔记 一.38译码器 功能: 译码器其任一时刻的稳态输出,仅仅与该时刻的输入变量的取值有关,它是一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的对象(如逻辑电平等).38 ...
- FPGA学习笔记(1)简单的时序逻辑电路——流水灯
FPGA学习笔记(1)简单的时序逻辑电路--流水灯 编程语言为Verilog HDL 原理 (1)设计一个计数器,使开发板上的4个LED状态每500ms翻转一次.开发板上的晶振输出时钟频率为50MHz ...
- FPGA学习笔记_UART串口协议_串口接收端设计
FPGA学习笔记 1. UART串口协议以及串口接收端设计 1 原理图 2 Verilog 代码 3 Modelsim仿真 4. FPGA板级验证 1.1 串口协议接收端设计 目标:FPGA接收其他设 ...
- 【opencv学习笔记八】创建TrackBar轨迹条
createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...
- FPGA学习笔记(七): DSB调制解调的仿真
笔记七是DSB调制解调的仿真实现. DSB调制解调的实现原理:首先使用DDS产生低频正弦波信号作为调制信号,再用DDS产生高频信号作为载波信号,然后使用乘法器将两者相乘产生DSB信号,DSB信号与载波 ...
- ZooKeeper学习笔记(八):ZooKeeper集群写数据原理
写数据原理 写流程直接请求发送给Leader节点 这里假设集群中有三个zookeeper服务端 ACK (Acknowledge character)即是确认字符,在数据通信中,接收站发给发送站的一种 ...
- MongoDB 学习笔记八 复制、分片、备份与恢复、监控
MongoDB 学习笔记八 复制.分片.备份与恢复.监控 MongoDB复制(副本集) 什么是复制? MongoDB 复制原理 MongoDB 副本集设置 副本集添加成员 MongoDB 分片 分片 ...
最新文章
- oracle表中怎么去重复,oracle去掉表重复数据
- Js 拦截全局ajax请求
- [Leetcode] Simplify Path
- Anaconda 环境下 对Tushare进行测试
- 最大公约数 数学,结论 第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛
- python关系图谱_文本分析之制作网络关系图
- ghelper怎么在手机上用_当长时间不用手机玩《崩坏3》、《战双》
- Python小白的数学建模课-10.微分方程边值问题
- linux shell之case用法
- 伯努利分布方差_学计量经济学,你应该知道的六种6个概率分布
- 【元胞自动机】基于matlab元胞自动机模拟交通流【含Matlab源码 355期】
- C/C++操作注册表键值添加/查询/删除详解
- MMDetection2.XX-Necks之FPN源码解析
- 关于Dev C++等软件突然提示16位应用程序不兼容的问题
- Java打印一个正三角形
- dumprep 0 -k引起的重启问题
- 基于Gin+Vue+ElementUI实现的OA办公系统
- NYOJ - 597
- 双十一购买什么最划算,最值得入手的几款数码好物推荐
- Java程序员必知必会之JVM运行时数据区