14 Verilog语法_同步与异步设计

发布时间 2024-01-07 12:37:09作者: 米联客(milianke)

软件版本:无

操作系统:WIN10 64bit

硬件平台:适用所有系列FPGA

登录"米联客"FPGA社区-www.uisrc.com视频课程、答疑解惑!

1概述

本小节主要讲解Verilog语法的同步与异步设计,需要掌握同步时钟和异步时钟的设计方法。

2同步时钟

数字电路设计中,一般认为,频率相同或频率比为整数倍、且相位相同或相位差为固定的两个时钟称为同步时钟。换句话说,时钟同源且频率比为整数倍的两个时钟为同步时钟。

大致有三类同步时钟:

(1)同源同频率同相位

时钟频率和相位均相同,是同步的。时钟间数据传输只要满足正常的建立时间和保持时间即可,不需要特殊的同步设计。

(2)同源同频不同相位

两个时钟同频但不同相位时,只要相位差保持固定,也可以认为是同步的。因为只要控制两个时钟间传输的数据延迟在合理范围内,就不会导致时序问题。固定的相位差可以理解为同源时钟下两个时钟因路径不同而导致的偏斜。

(3)同源不同频但存在整数倍分频比

一个时钟往往是另一个时钟的分频,即便存在相位差也是固定的。

当单 bit 信号从慢时钟域传递到快时钟域时,因为同源,只要满足建立时间和保持时间,快时钟域总会采集到从慢时钟域传递来的信号。

例:

如果要求 clk_100m 域的信号data_2只需要持续一个时钟周期,则需要对data_1进行上升沿检测。例:

reg [1:0]    data_ff ;

always @(posedge clk_100m) //按照clk_100m的时钟进行采样

begin

     data_ff  <= {data_ff[0], data_1} ; //对data_1的数据进行寄存

End //data_ff[0]表示最新采样的数据,!data_ff[1]为上一个时钟周期采样的数据

assign data_2 = !data_ff[1] && data_ff[0]; //最新的电平为1,之前的电平为0,判断为上升沿检测

当单 bit 信号从快时钟域传递到慢时钟域时,只要慢时钟域能安全采集到从快时钟域传递来的信号,就不存在异步问题。

例:

但是如果快时钟域信号过窄,慢时钟域可能会漏掉该信号,如上图 data_1 到 data_11 的传输。此时就需要对快时钟域的窄脉冲信号进行展宽。例:

reg [1:0]    data_ff ;

reg          data_1f ;

always @(posedge clk_100m) //按照clk_100m的时钟进行采样

begin

     data_ff  <= {data_ff[0], data_1} ; //对data_1的数据进行寄存

end

always @(posedge clk_50m) //按照clk_50m的时钟进行采样,属于慢速时钟域采样

begin

  data_1f  <= |data_ff ; //窄脉冲信号进行缩减或操作

end

assign data_11 = data_1f ; //data_1f 采样信号赋值给data_11

3异步时钟

异步时钟主要分为三类:

(1)非同源时钟

由两个不同的时钟源产生的两个时钟是异步的。即便两个时钟频率相同,但是也不能保证每次上电后两者的相位或相位差是相同的,所以信号间的传输与时钟关系是不确定的。

(2)同源但频率比不是整数倍

此时两个时钟间相位差也可能会有多个,例如同源的 63MHz时钟和24MHz 时钟,它们之间也会出现多个相位差,一般情况下进行异步时钟处理。

(3)同源虽频率比为整数倍但不满足时序要求

上一小节介绍同步时钟时,当信号从快时钟域传递到慢时钟域时,只要慢时钟域能安全采集到从快时钟域传来的信号,就不存在异步问题。但如果信号在快时钟域翻转速率过快,慢时钟域可能不会安全的采集到从快时钟域传来的信号,这可以认为是异步问题。