系列文章目录

一、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学习笔记(八)同步/异步信号的打拍分析处理及亚稳态分析相关推荐

  1. FPGA学习笔记(八):ASK调制解调的仿真

    笔记八是ASK调制解调的仿真实现. ASK调制解调的实现原理:首先使用MATLAB产生存储基带波形的coe文件,再让ROM读取coe文件输出基带波形,然后DDS产生正弦波信号作为载波信号,接下来使用乘 ...

  2. FPGA学习笔记(十二)IP核之FIFO的学习总结

    系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...

  3. 小梅哥FPGA学习笔记

    小梅哥FPGA学习笔记 一.38译码器 功能: 译码器其任一时刻的稳态输出,仅仅与该时刻的输入变量的取值有关,它是一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的对象(如逻辑电平等).38 ...

  4. FPGA学习笔记(1)简单的时序逻辑电路——流水灯

    FPGA学习笔记(1)简单的时序逻辑电路--流水灯 编程语言为Verilog HDL 原理 (1)设计一个计数器,使开发板上的4个LED状态每500ms翻转一次.开发板上的晶振输出时钟频率为50MHz ...

  5. FPGA学习笔记_UART串口协议_串口接收端设计

    FPGA学习笔记 1. UART串口协议以及串口接收端设计 1 原理图 2 Verilog 代码 3 Modelsim仿真 4. FPGA板级验证 1.1 串口协议接收端设计 目标:FPGA接收其他设 ...

  6. 【opencv学习笔记八】创建TrackBar轨迹条

    createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...

  7. FPGA学习笔记(七): DSB调制解调的仿真

    笔记七是DSB调制解调的仿真实现. DSB调制解调的实现原理:首先使用DDS产生低频正弦波信号作为调制信号,再用DDS产生高频信号作为载波信号,然后使用乘法器将两者相乘产生DSB信号,DSB信号与载波 ...

  8. ZooKeeper学习笔记(八):ZooKeeper集群写数据原理

    写数据原理 写流程直接请求发送给Leader节点 这里假设集群中有三个zookeeper服务端 ACK (Acknowledge character)即是确认字符,在数据通信中,接收站发给发送站的一种 ...

  9. MongoDB 学习笔记八 复制、分片、备份与恢复、监控

    MongoDB 学习笔记八 复制.分片.备份与恢复.监控 MongoDB复制(副本集) 什么是复制? MongoDB 复制原理 MongoDB 副本集设置 副本集添加成员 MongoDB 分片 分片 ...

最新文章

  1. oracle表中怎么去重复,oracle去掉表重复数据
  2. Js 拦截全局ajax请求
  3. [Leetcode] Simplify Path
  4. Anaconda 环境下 对Tushare进行测试
  5. 最大公约数 数学,结论 第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛
  6. python关系图谱_文本分析之制作网络关系图
  7. ghelper怎么在手机上用_当长时间不用手机玩《崩坏3》、《战双》
  8. Python小白的数学建模课-10.微分方程边值问题
  9. linux shell之case用法
  10. 伯努利分布方差_学计量经济学,你应该知道的六种6个概率分布
  11. 【元胞自动机】基于matlab元胞自动机模拟交通流【含Matlab源码 355期】
  12. C/C++操作注册表键值添加/查询/删除详解
  13. MMDetection2.XX-Necks之FPN源码解析
  14. 关于Dev C++等软件突然提示16位应用程序不兼容的问题
  15. Java打印一个正三角形
  16. dumprep 0 -k引起的重启问题
  17. 基于Gin+Vue+ElementUI实现的OA办公系统
  18. NYOJ - 597
  19. 双十一购买什么最划算,最值得入手的几款数码好物推荐
  20. Java程序员必知必会之JVM运行时数据区

热门文章

  1. 在Ubuntu中用Qt基于OpenCV调用大恒相机
  2. 为fuchsia编译qemu
  3. 关于《完全用Linux工作》的思考
  4. 显卡服务器已停止响应,显卡驱动停止响应并已成功恢复问题,找到根本原因,彻底解决!...
  5. python教程111-Python多条件计数与求和
  6. 服务器虚拟机uefi,为虚拟机启用或禁用 UEFI 安全引导
  7. Windows xp 落选logo方案首次公开!居然设计了这么多版本!
  8. 如何学习Java并发编程
  9. 可用主机ip地址数量的计算
  10. 常见的状态码1xx、2xx、3xx、4xx、5xx、