异步电路设计

青春壹個敷衍的年華 提交于 2020-03-05 07:52:48

一、异步电路设计 1、单bit异步处理 1) 打三拍

从慢到快,只有亚稳态的问题;所以只用打两拍或者三拍就行了。

而从快传输到慢,不仅有要抑制亚稳态往下传播的问题,还有控制信号丢失的问题,这里就需要延长控制信号的长度。这里要将脉冲信号扩展为电平信号,在进行打两拍或者三拍就行了。打两拍或者三拍就行了。 2、多bits异步处理

1)握手信号 2)D-MUX 3)异步FIFO(格雷码)

二、Metastability

触发器的建立时间和保持时间在时钟上升沿左右定义了一个时间窗口,如果触发器的数据输入端口上数据在这个时间窗口内发生变化(或者数据更新),那么就会产生时序违规。存在这个时序违规是因为建立时间要求和保持时间要求被违反了,此时触发器内部的一个节点(或者要输出到外部的节点)可能会在一个电压范围内浮动,无法稳定在逻辑0或者逻辑1状态。

 

 

寄存器建立的时间 Tsu(set up)

寄存器的保持时间Th(hold)

时钟变化到输出的时间Tco(clock to output)

对于有delay的clock 书上是以50% VDD为界限区分高电平和低电平

 

三、解决亚稳态的方法

2 level register(打两拍)

亚稳态问题通常出现在一些跨时钟域的传输上

亚稳态出现的原因:

用于在同步系统中,如果触发器的建立时间或保持时间不满足,就可能产生亚稳态,一个触发器进入亚稳态的时候,既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个确定的电平上。

可以通过两个寄存器(同步器)连接降低亚稳态出现的概率,也可以增加同步器的级数,但是太多的同步器会使系统性能下降,所以一般两级同步器已经足够了。(使用同步器使得在另一个时钟域采样信号足够稳定)。

input [4:0] rptr; //多bits也可以

output [4:0] wrptr;

reg [4:0] wrptr1;

reg [4:0] wrptr2;

{wrptr2, wrptr1} = {wrptr1,rptr }; //两级寄存器连接

Async_FIFO

使用异步FIFO存储器可以在两个不同时钟系统之间快速而方便的传输数据。

异步FIFO:是指向FIFO缓冲器中写入数据的时钟域和从FIFO缓冲器读取数据的时钟域是不同的。

FIFO设计一般划分为5个子模块:

1, 读指针控制模块(读空标志)

2, 写指针控制模块(写满标志)

3, 读指针同步到写时钟域模块

4, 写指针同步到读时钟域模块

5, 存储RAM模块

格雷码虽然在跨时钟域方面效果比较好,但是本身计数方面是不足的,也就是说还需要把格雷码转换成二进制码来计数。二进制码和格雷码相互转换。

二进制用来计数

读写指针用格雷码表示

Handshake

使用握手协议方式处理跨时钟域数据传输,只需要对双方的握手信号(req和ack)分别使用脉冲检测方法进行同步。

在具体实现中,假设req、ack、data总线在初始化时都处于无效状态,发送域先把数据放入总线,随后发送有效的req信号给接收域。接收域在检测到有效的req信号后锁存数据总线,然后回送一个有效的ack信号表示读取完成应答。发送域在检测到有效ack信号后撤销当前的req信号,接收域在检测到req撤销(需要进行边沿检测)后也相应撤销ack信号,此时完成一次正常握手通信。

此后,发送域可以继续开始下一次握手通信,如此循环。该方式能够使接收到的数据稳定可靠,有效的避免了亚稳态的出现,但控制信号握手检测会消耗通信双方较多的时间。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!