FPGA学习笔记(八)同步/异步信号的打拍分析处理及亚稳态分析

系列文章目录

一、FPGA学习笔记(一)入门背景、软件及时钟约束

二、FPGA学习笔记(二)Verilog语法初步学习(语法篇1)

三、FPGA学习笔记(三) 流水灯入门FPGA设计流程

四、FPGA学习笔记(四)通过数码管学习顶层模块和例化的编写

五、FPGA学习笔记(五)Testbench(测试平台)文件编写进行Modelsim仿真

六、FPGA学习笔记(六)Modelsim单独仿真和Quartus联合仿真

七、FPGA学习笔记(七)verilog的深入学习之任务与函数(语法篇3)



前言

在学习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;
	end
	else begin
		uart_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) begin
    if (!rst_n)
        xxxx;
    else if (xx) begin
            xxxx;
            xxxx;
         end
    end

这里收到复位的下降沿就程序执行,但是当由低到高释放时,应该会出现亚稳态。

2.同步复位

 always @ (posedge clk) begin
        if (!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) begin
	if (!rst_n) begin
		rst_s1 <= 1'b0;
		rst_s2 <= 1'b0;
	end
	else begin
	   rst_s1 <= 1'b1	;
	   rst_s2 <= rst_s1	;
	end
end

在这里插入图片描述

五.常见的打拍理解

1.打拍两次

常见的串口接收时,寄存三次:(一般一个时钟周期内,亚稳态会稳定,这里稳定到1为例)
在这里插入图片描述

如上图所示,一般用reg2和reg3来判断上升沿/下降沿,这就是寄存三次的时序图,但是看这个图,好像reg3没有必要,因为亚稳态一个周期内稳定后,是可以用reg2和reg1判断上下升降沿


2.打拍三次

在这里插入图片描述
第一级寄存器产生亚稳态并经过自身后可以稳定输出的概率为 70%~80%左右,第二级寄存器可以稳定输出的概率为 99%左右。
所以一般第二级的寄存器自身肯定能稳定,图上就是第一级没有稳定,第二级稳定了,然后再加一级就可以判断上升沿和下降沿。

六. FIFO进行异步跨频数据处理

除了上面的异步复位,同步释放、打拍两次/三次,还有利用FIFO。

1.当数据流从一个时钟域到另一个时钟域的时候,绝大多数情况下都采用FIFO来作为中间缓冲,采用双时钟对数据缓冲,就可以避免亚稳态的发生。

2.当遇到多bits的大量数据流的情况下,可以使用异步FIFO。

3.当遇到少量多bits的信号,可以利用指示信号来错过亚稳态,就是伴随数据到来有一个拉高的指示信号,这个信号经过打拍处理后,如果是高电平就读取数据(感觉没什么用,用到一些cpu接口,串口芯片的信号啥的)

七、总结

这里要对前面的内容进行一些补充:

1.D触发器不是在时钟信号上升沿到来后才有信号输出吗,那么这一周期不应该是亚稳态状态吗?

D触发器在亚稳态期间会0-1波动,但之后会慢慢稳定下来,就像上面的图,最后是一个确定值(但是结果未知,和输入无关),所以这也就是为什么要加多级寄存器,目的是让亚稳态过渡过去。(一开始以为D触发器只会在时钟上升沿的时候输出信号,所以一遇到亚稳态就一整个周期都信号不确定了,所以不明白为什么会有第二级寄存器采集到是一个确定值,原来慢慢会自己稳定)

2.亚稳态稳定值未知,那么上面的图不就是错的吗?

上面的图显示如果最后亚稳态的稳定值和输入一样,显然一切都正确,如果不一样
在这里插入图片描述
可以看到,最后还是可以用这段代码判断的。所以这里的亚稳态为什么要处理,就是怕一直往下传播,如果你对这个reg1在亚稳态的时候程序中用了很多次,那么这个亚稳态将传播的到处都是。

  • 22
    点赞
  • 159
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
同步SRAM和异步SRAM是FPGA中常见的两种存储器类型,它们在时序约束和分析上有一些区别。 首先,对于同步SRAM,数据的写入和读取操作是按照时钟信号同步进行的。时序约束主要包括写入操作的setup和hold时间,以及读取操作的access时间。写入操作的setup时间是指在时钟上升沿到来之前,数据必须稳定保持不变的最小时间;hold时间是指在时钟上升沿到来之后,数据必须保持不变的最小时间。读取操作的access时间是指在时钟上升沿到来后,数据可以稳定保持不变的最小时间。 对于异步SRAM,数据的写入和读取操作不依赖于时钟信号,它们是根据SRAM自身的控制信号来进行的。因此,时序约束主要包括写入操作的setup和hold时间,以及读取操作的delay时间。写入操作的setup时间和hold时间的定义与同步SRAM类似。读取操作的delay时间是指从读取控制信号发出到数据有效的最小延迟时间。 在时序约束和分析上,同步SRAM通常更容易处理。因为它们使用时钟控制信号进行同步,可以通过对时钟信号进行约束来实现对写入和读取操作的时序约束。此外,同步SRAM的工作频率较高,存储容量较大,能够满足更高的性能要求。 而异步SRAM的时序约束相对较为复杂,需要考虑SRAM自身的控制信号和数据信号的延迟,以及存储器单元之间的干扰等因素。对于高性能要求的设计,通常需要进行更加详细和精确的时序分析,以确保数据的正确读取和写入。 总的来说,同步SRAM和异步SRAM在时序约束和分析上有些区别,需要根据具体的设计要求和使用场景来选择适合的存储器类型,并针对其特性进行相应的时序约束和分析

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值