Verilog课件 第十二讲 多时钟域数字系统设计例
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
FIFO设计关键:地址指针产生;空、满信号产生。
FIFO的地址指针分析
在 复 位 时 , 读 写 地 址 指 针 都 指 向 地 址 0 。 FIFO 空 指 示 rempty=1,指示FIFO为空。 读地址指针指向读出数据的存储单元,即输出数据 rdata 值为该单元值。 写地址指针指向将写入数据的存储单元,即输入数据 wdata在wclk上升沿写入该单元。 在复位后,写指针先增加,即先写入后读出,正常工作时
解决方法有两个,一是采用握手方式传输多比特异步信号;二是 使用gray码编码解决多比特同时变化问题。
握手方式空满判别存在较大延时,较好的方法是采用gray码编码 的读写地址方式。
Gray码计数器
Gray码是Frank Gray 在1953年提出的,它最大的优点是相邻码字间只有 1比特的变化。Gray码计数器长度一般是2的N次方。 如图示,为4比特Gray码到3比特Gray码转换。同时产生N比特Gray码到 (N-1)比特Gray码的计数器,这里称双N比特Gray码计数器。
//采用参数的好处?
module syn_fifo (rdata, wfull, rempty, wdata, winc, wclk, rinc, rclk, rst_n); parameter DSIZE = 8; parameter ASIZE = 4; output [DSIZE-1:0] rdata; output wfull; output rempty; input [DSIZE-1:0] wdata; input winc, wclk; input rinc, rclk, rst_n;
Req Ack Data
同步电路
同步电路 数据保持
数据采样
电路B
电路A
握手协议
不同时钟域电路使用的握手协议有两种基本类型:全握手(Fullhandshake)和部分握手(partial-handshake)。二种类型的握手都
要用同步器,各有自己的优缺点。
全握手:双方电路在声明或中止各自的握手信号前都要等待对方 的响应。如图: 首先,电路 A 发出请求信号 Req,然后电路 B 检测到Req有 效后,发出响应信号Ack;当电 路 A 检测到Ack有效后,中止 自己的Req;最后,当电路 B 检测到Req无效后,它中止自己 的Ack。电路 A 检测到无效的 Ack前,不会再发出新的Req。
rdata
rclk
FIFO
rrst_n rinc rempty
wclk: 输入写时钟
wdata:写入数据 wrst_n:wclk时钟域电路复位,为0复位。 winc: 写入使能,为1允许写。 wfull: FIFO存储写满指示,为1指示写满。
rdata: 读出数据
rrst_n : rclk 时钟域电路复位,为 0 复位。 rinc: 读出使能,为1允许读。 rempty:FIFO存储读空指示,为1指示读空。
FIFO(先入先出队列)概念
FIFO功能:是一个先入先出的队列。如图所示,当写使能有效(winc= 1),FIFO队列存储器非满(wfull=0)时,每个wclk的上升沿(或下降 沿)写入wdata数据到异步FIFO的双口SRAM存储器中,写地址增加1;当 读使能有效(rinc=1),FIFO队列存储器非空(rempty=0)时,每个 rclk的上升沿(或下降沿)从异步FIFO的双口SRAM存储器中读出数据到 rdata,读地址增加1。读写地址到最大后返回起始地址。当写地址赶上 读地址时FIFO满,当读地址赶上写地址时FIFO空。
握手协议
通过检测请求与响应信号,全握手协议中每个电路都清楚地知道 对方的状态,因此全握手协议可靠性高。不足之处是完成交互的
整个过程要花费较多时钟周期(12个时钟周期)。
部分握手:使用部分握手协议时,通信双方的电路都不等对方的 响应就中止各自的握手信号,并继续执行握手命令序列。
部分握手协议比全握手协议在可靠性方面稍弱。但是,由于无需
第十二讲 多时钟域数字系统设计
多时钟域设计概念 握手协议 FIFO(先入先出队列)概念 Fຫໍສະໝຸດ BaiduFO的地址指针分析
同步FIFO设计
异步FIFO设计 实验要求
多时钟域设计概念
同步设计的时钟域:由一个同源时钟驱动的触发器集合称为一个
时钟域。
异步信号
D Q D Q D Q D Q
写入
读出
FIFO(先入先出队列)概念
同步FIFO的读写两个时钟同源,属于全同步设计。 异步 FIFO 有读写两个不同源时钟,属于多时钟域设 计;异步FIFO常用于不同时钟域间的数据传输。 对跨时钟域信号处理应仔细全面考虑,防止设计缺 陷;因异步信号处理电路的设计缺陷是很难通过仿
真发现的。
endmodule
异步FIFO设计问题
wclk和rclk是不同源时钟,属于2个时钟域。 为复位可靠,需分别设复位信号wrst_n和rrst_n。
在FIFO的空满状态判别中,需用到2个时钟域的地址信号,涉及 跨时钟域信号可靠传输问题。
若读写地址使用二进制编码,在跨时钟域传输时,会产生多比特 同时变化问题。例7->8的二进制码变化为0111->1000,同时有 4个比特变化。 异步FIFO仿真验证问题。仿真验证异步FIFO的正确性需在后仿真 阶段进行,且发现所有潜在问题几乎是不可能的。
双N比特Gray码计数器
在双N比特Gray码计数器框图中,(N-1)比特Gray码最高比特位是通过 对N比特Gray码的最高2比特进行“异或”产生,低(N-2)比特与N比特 Gray码相同。 二进制到Gray码转换:gnext=(bnext>>1)^ bnext; Gray码到二进制转换:for(i=0; i<=N; i=i+1) bin[i]=^(gin>>i);
FIFO的地址指针分析
例4:读写附加地址位不相等,表示写地址在环回页;若此时读写
地址也相等;则表示写地址赶上读地址,FIFO写满。
写入(1_0011)
读出(0_0011)
同步FIFO设计
在同步FIFO中,wclk和rclk是同源时钟或相同时钟,处于同一 个时钟域,共用一个复位rst_n,属于全同步设计。 同步FIFO的一种verilog设计描述如下:
异步FIFO设计
根据前面的分析,可以设计异步FIFO框图:
异步FIFO模块和读空判别
fifomem.v:异步FIFO的数据存储器模块,典型的同步写入双口 RAM。 sync_r2w.v:异步FIFO的读地址信号到写时钟域同步模块。(注: 强烈建议将异步信号同步电路设为一个单独的模块。) sync_w2r.v:异步FIFO的写地址信号到读时钟域同步模块。 rptr_empty.v:异步FIFO的读地址和读空信号产生模块。 wptr_full.v:异步FIFO的写地址和写满信号产生模块。 FIFO空指示产生:如前分析,rgnext是读地址的N比特Gray码, rwptr2是wptr同步后写地址的N比特Gray码;若rgnext==rwptr2, 则FIFO读空。
Guards against metastability(防止不确定状态) Signal from CLK1 domain (CLK1的相关信号) Signal synched to CLK2 (同步于CLK2的信号)
D FF1
Q
D FF2
Q
CLK2
多比特异步信号同步:在许多应用中,跨时钟域传送的不只是简
CLK1
CLK2
跨时钟域信号:当一个信号跨越2个时钟域时,称跨时钟域信号。 跨时钟域输入信号是一个异步信号,接收该信号的电路需要对其进 行同步。同步可以防止第一级存储单元(触发器)的亚稳态在新的 时钟域里传播蔓延。
多时钟域设计概念
单比特异步信号同步:同步实现方法应具体电路具体分析,核心是
减小亚稳态的影响。如前所述,最简单的同步电路如下图。
握手协议
第二种部分握手方法:电路 A 用一个单时钟宽度脉冲发出它的请
求,而电路 B 也用一个单时钟宽度脉冲响应这个请求。
通过控制电路 A请求信号的延时和电路 B响应信号的延时,可以 控制同步器可靠接收握手脉冲。 这种部分握手技术与全握手方法相比,在 A 时钟域少用三个时钟 周期,在 B 时钟域也少用三个时钟周期。
reg [ASIZE:0] wptr; reg [ASIZE:0] rptr;
// 写地址 // 读地址
同步FIFO设计
parameter MEMDEPTH = 1<<ASIZE; // 5’b1_0000 reg [DSIZE-1:0] ex_mem [0:MEMDEPTH-1]; always @(posedge wclk or negedge rst_n) if (!rst_n) wptr <= 0; else if (winc && !wfull) begin ex_mem[wptr[ASIZE-1:0]] <= wdata; wptr <= wptr+1; end always @(posedge rclk or negedge rst_n) if (!rst_n) rptr <= 0; else if (rinc && !rempty) rptr <= rptr+1; assign rdata = ex_mem[rptr[ASIZE-1:0]]; assign rempty = (rptr == wptr); // 空判别 // 满判别 assign wfull = ((wptr[ASIZE-1:0] == rptr[ASIZE-1:0]) && (wptr[ASIZE] != rptr[ASIZE] )); // FIFO读操作 // FIFO写操作
等待对方电路的响应,完成交互的整个过程花费时间较少。
握手协议
第一种部分握手方法:电路 A 以有效电平声明其请求信号,电路 B 则以一个单时钟宽度脉冲作为响应。 注意,电路 A 中止请求信号后,延时至少要有一个时钟周期后, 再发下一次请求信号;否则,电路 B 就不能区别前一个请求和新 的请求。通过控制电路 A请求信号的延时,控制电路 B同步器接 收到的脉冲间隔。 这种部分握手方法比全 握手方法在 A、B 两个 时钟域分别少用了两个 和一个时钟周期。
与单寄存器设计相似,FIFO 将数据保存在寄存器或存储器中;同时 FIFO需同步地址指针信号,用于判断何时可以把数据写入 FIFO 或 从 FIFO 中读出。
FIFO(先入先出队列)概念
wdata wclk wrst_n winc wfull 输入输出信号说明:
写入侧信号为wclk时钟域: 输出侧信号为rclk时钟域: rclk: 输出读时钟
写地址总是超前于读地址。
FIFO空、满判别:当读写地址相等时,FIFO可能为空,也 可能为满,需引入1bit附加地址位辅助判别。
FIFO的地址指针分析
FIFO的地址指针分析
因正常工作时写地址总是超前于读地址,设读地址为FIFO存储
器的当前页,附加地址位记录写地址是在当前页或环回页。若 读写附加地址位相等,则读写地址都在当前页;若读写附加地 址位不相等,则写地址在环回页。 例1:读写附加地址位相等,表示读写地址都在当前页。
单的信号,数据总线、地址总线和控制总线都会同时跨域传输。
此时的有效方法是握手协议和 FIFO 缓冲。
多时钟域设计概念
多比特信号同步时的重要规则:不能单个信号输出至多个同步器。
不能对数据或地址等总线的每一位单独使用同步器。
一种解决总线同步问题的方法:使用一个保持寄存器和握手信号。 握手信号指示目的时钟域的电路何时可以对总线数据采样,源电 路何时可以更换当前寄存器中保存的数据。如图:
写入(0_0011)
读出(0_0001)
FIFO的地址指针分析
例2:读写附加地址位相等,表示读写地址都在当前页;若此时读 写地址也相等;则表示读地址赶上写地址,FIFO读空。
写入(1_0011)
读出(1_0011)
例3:读写附加地址位不相等,表示写地址在环回页。
写入(1_0010)
读出(0_0011)
总线数据的FIFO同步
用握手同步方式,可以同步握手信号,但不能同步高速总线数据。 总线数据通过保持寄存器传递,它在接收电路采样前一直保持稳定。 注意,如果传输电路向接收电路传递数据太快,如达到时钟速率, 则采用握手的总线同步失效。 解决办法是使用 FIFO。一般使用 FIFO 的目的是实现速度匹配,在 FIFO 较快的端口处理猝发的数据传输,而较慢的端口则维持恒定的 数据流。虽然访问方式和速度不同,但进出 FIFO 的平均数据速率 必须是相同的,否则 FIFO 就会出现上溢(overflow)或下溢 (underflow)问题。
FIFO的地址指针分析
在 复 位 时 , 读 写 地 址 指 针 都 指 向 地 址 0 。 FIFO 空 指 示 rempty=1,指示FIFO为空。 读地址指针指向读出数据的存储单元,即输出数据 rdata 值为该单元值。 写地址指针指向将写入数据的存储单元,即输入数据 wdata在wclk上升沿写入该单元。 在复位后,写指针先增加,即先写入后读出,正常工作时
解决方法有两个,一是采用握手方式传输多比特异步信号;二是 使用gray码编码解决多比特同时变化问题。
握手方式空满判别存在较大延时,较好的方法是采用gray码编码 的读写地址方式。
Gray码计数器
Gray码是Frank Gray 在1953年提出的,它最大的优点是相邻码字间只有 1比特的变化。Gray码计数器长度一般是2的N次方。 如图示,为4比特Gray码到3比特Gray码转换。同时产生N比特Gray码到 (N-1)比特Gray码的计数器,这里称双N比特Gray码计数器。
//采用参数的好处?
module syn_fifo (rdata, wfull, rempty, wdata, winc, wclk, rinc, rclk, rst_n); parameter DSIZE = 8; parameter ASIZE = 4; output [DSIZE-1:0] rdata; output wfull; output rempty; input [DSIZE-1:0] wdata; input winc, wclk; input rinc, rclk, rst_n;
Req Ack Data
同步电路
同步电路 数据保持
数据采样
电路B
电路A
握手协议
不同时钟域电路使用的握手协议有两种基本类型:全握手(Fullhandshake)和部分握手(partial-handshake)。二种类型的握手都
要用同步器,各有自己的优缺点。
全握手:双方电路在声明或中止各自的握手信号前都要等待对方 的响应。如图: 首先,电路 A 发出请求信号 Req,然后电路 B 检测到Req有 效后,发出响应信号Ack;当电 路 A 检测到Ack有效后,中止 自己的Req;最后,当电路 B 检测到Req无效后,它中止自己 的Ack。电路 A 检测到无效的 Ack前,不会再发出新的Req。
rdata
rclk
FIFO
rrst_n rinc rempty
wclk: 输入写时钟
wdata:写入数据 wrst_n:wclk时钟域电路复位,为0复位。 winc: 写入使能,为1允许写。 wfull: FIFO存储写满指示,为1指示写满。
rdata: 读出数据
rrst_n : rclk 时钟域电路复位,为 0 复位。 rinc: 读出使能,为1允许读。 rempty:FIFO存储读空指示,为1指示读空。
FIFO(先入先出队列)概念
FIFO功能:是一个先入先出的队列。如图所示,当写使能有效(winc= 1),FIFO队列存储器非满(wfull=0)时,每个wclk的上升沿(或下降 沿)写入wdata数据到异步FIFO的双口SRAM存储器中,写地址增加1;当 读使能有效(rinc=1),FIFO队列存储器非空(rempty=0)时,每个 rclk的上升沿(或下降沿)从异步FIFO的双口SRAM存储器中读出数据到 rdata,读地址增加1。读写地址到最大后返回起始地址。当写地址赶上 读地址时FIFO满,当读地址赶上写地址时FIFO空。
握手协议
通过检测请求与响应信号,全握手协议中每个电路都清楚地知道 对方的状态,因此全握手协议可靠性高。不足之处是完成交互的
整个过程要花费较多时钟周期(12个时钟周期)。
部分握手:使用部分握手协议时,通信双方的电路都不等对方的 响应就中止各自的握手信号,并继续执行握手命令序列。
部分握手协议比全握手协议在可靠性方面稍弱。但是,由于无需
第十二讲 多时钟域数字系统设计
多时钟域设计概念 握手协议 FIFO(先入先出队列)概念 Fຫໍສະໝຸດ BaiduFO的地址指针分析
同步FIFO设计
异步FIFO设计 实验要求
多时钟域设计概念
同步设计的时钟域:由一个同源时钟驱动的触发器集合称为一个
时钟域。
异步信号
D Q D Q D Q D Q
写入
读出
FIFO(先入先出队列)概念
同步FIFO的读写两个时钟同源,属于全同步设计。 异步 FIFO 有读写两个不同源时钟,属于多时钟域设 计;异步FIFO常用于不同时钟域间的数据传输。 对跨时钟域信号处理应仔细全面考虑,防止设计缺 陷;因异步信号处理电路的设计缺陷是很难通过仿
真发现的。
endmodule
异步FIFO设计问题
wclk和rclk是不同源时钟,属于2个时钟域。 为复位可靠,需分别设复位信号wrst_n和rrst_n。
在FIFO的空满状态判别中,需用到2个时钟域的地址信号,涉及 跨时钟域信号可靠传输问题。
若读写地址使用二进制编码,在跨时钟域传输时,会产生多比特 同时变化问题。例7->8的二进制码变化为0111->1000,同时有 4个比特变化。 异步FIFO仿真验证问题。仿真验证异步FIFO的正确性需在后仿真 阶段进行,且发现所有潜在问题几乎是不可能的。
双N比特Gray码计数器
在双N比特Gray码计数器框图中,(N-1)比特Gray码最高比特位是通过 对N比特Gray码的最高2比特进行“异或”产生,低(N-2)比特与N比特 Gray码相同。 二进制到Gray码转换:gnext=(bnext>>1)^ bnext; Gray码到二进制转换:for(i=0; i<=N; i=i+1) bin[i]=^(gin>>i);
FIFO的地址指针分析
例4:读写附加地址位不相等,表示写地址在环回页;若此时读写
地址也相等;则表示写地址赶上读地址,FIFO写满。
写入(1_0011)
读出(0_0011)
同步FIFO设计
在同步FIFO中,wclk和rclk是同源时钟或相同时钟,处于同一 个时钟域,共用一个复位rst_n,属于全同步设计。 同步FIFO的一种verilog设计描述如下:
异步FIFO设计
根据前面的分析,可以设计异步FIFO框图:
异步FIFO模块和读空判别
fifomem.v:异步FIFO的数据存储器模块,典型的同步写入双口 RAM。 sync_r2w.v:异步FIFO的读地址信号到写时钟域同步模块。(注: 强烈建议将异步信号同步电路设为一个单独的模块。) sync_w2r.v:异步FIFO的写地址信号到读时钟域同步模块。 rptr_empty.v:异步FIFO的读地址和读空信号产生模块。 wptr_full.v:异步FIFO的写地址和写满信号产生模块。 FIFO空指示产生:如前分析,rgnext是读地址的N比特Gray码, rwptr2是wptr同步后写地址的N比特Gray码;若rgnext==rwptr2, 则FIFO读空。
Guards against metastability(防止不确定状态) Signal from CLK1 domain (CLK1的相关信号) Signal synched to CLK2 (同步于CLK2的信号)
D FF1
Q
D FF2
Q
CLK2
多比特异步信号同步:在许多应用中,跨时钟域传送的不只是简
CLK1
CLK2
跨时钟域信号:当一个信号跨越2个时钟域时,称跨时钟域信号。 跨时钟域输入信号是一个异步信号,接收该信号的电路需要对其进 行同步。同步可以防止第一级存储单元(触发器)的亚稳态在新的 时钟域里传播蔓延。
多时钟域设计概念
单比特异步信号同步:同步实现方法应具体电路具体分析,核心是
减小亚稳态的影响。如前所述,最简单的同步电路如下图。
握手协议
第二种部分握手方法:电路 A 用一个单时钟宽度脉冲发出它的请
求,而电路 B 也用一个单时钟宽度脉冲响应这个请求。
通过控制电路 A请求信号的延时和电路 B响应信号的延时,可以 控制同步器可靠接收握手脉冲。 这种部分握手技术与全握手方法相比,在 A 时钟域少用三个时钟 周期,在 B 时钟域也少用三个时钟周期。
reg [ASIZE:0] wptr; reg [ASIZE:0] rptr;
// 写地址 // 读地址
同步FIFO设计
parameter MEMDEPTH = 1<<ASIZE; // 5’b1_0000 reg [DSIZE-1:0] ex_mem [0:MEMDEPTH-1]; always @(posedge wclk or negedge rst_n) if (!rst_n) wptr <= 0; else if (winc && !wfull) begin ex_mem[wptr[ASIZE-1:0]] <= wdata; wptr <= wptr+1; end always @(posedge rclk or negedge rst_n) if (!rst_n) rptr <= 0; else if (rinc && !rempty) rptr <= rptr+1; assign rdata = ex_mem[rptr[ASIZE-1:0]]; assign rempty = (rptr == wptr); // 空判别 // 满判别 assign wfull = ((wptr[ASIZE-1:0] == rptr[ASIZE-1:0]) && (wptr[ASIZE] != rptr[ASIZE] )); // FIFO读操作 // FIFO写操作
等待对方电路的响应,完成交互的整个过程花费时间较少。
握手协议
第一种部分握手方法:电路 A 以有效电平声明其请求信号,电路 B 则以一个单时钟宽度脉冲作为响应。 注意,电路 A 中止请求信号后,延时至少要有一个时钟周期后, 再发下一次请求信号;否则,电路 B 就不能区别前一个请求和新 的请求。通过控制电路 A请求信号的延时,控制电路 B同步器接 收到的脉冲间隔。 这种部分握手方法比全 握手方法在 A、B 两个 时钟域分别少用了两个 和一个时钟周期。
与单寄存器设计相似,FIFO 将数据保存在寄存器或存储器中;同时 FIFO需同步地址指针信号,用于判断何时可以把数据写入 FIFO 或 从 FIFO 中读出。
FIFO(先入先出队列)概念
wdata wclk wrst_n winc wfull 输入输出信号说明:
写入侧信号为wclk时钟域: 输出侧信号为rclk时钟域: rclk: 输出读时钟
写地址总是超前于读地址。
FIFO空、满判别:当读写地址相等时,FIFO可能为空,也 可能为满,需引入1bit附加地址位辅助判别。
FIFO的地址指针分析
FIFO的地址指针分析
因正常工作时写地址总是超前于读地址,设读地址为FIFO存储
器的当前页,附加地址位记录写地址是在当前页或环回页。若 读写附加地址位相等,则读写地址都在当前页;若读写附加地 址位不相等,则写地址在环回页。 例1:读写附加地址位相等,表示读写地址都在当前页。
单的信号,数据总线、地址总线和控制总线都会同时跨域传输。
此时的有效方法是握手协议和 FIFO 缓冲。
多时钟域设计概念
多比特信号同步时的重要规则:不能单个信号输出至多个同步器。
不能对数据或地址等总线的每一位单独使用同步器。
一种解决总线同步问题的方法:使用一个保持寄存器和握手信号。 握手信号指示目的时钟域的电路何时可以对总线数据采样,源电 路何时可以更换当前寄存器中保存的数据。如图:
写入(0_0011)
读出(0_0001)
FIFO的地址指针分析
例2:读写附加地址位相等,表示读写地址都在当前页;若此时读 写地址也相等;则表示读地址赶上写地址,FIFO读空。
写入(1_0011)
读出(1_0011)
例3:读写附加地址位不相等,表示写地址在环回页。
写入(1_0010)
读出(0_0011)
总线数据的FIFO同步
用握手同步方式,可以同步握手信号,但不能同步高速总线数据。 总线数据通过保持寄存器传递,它在接收电路采样前一直保持稳定。 注意,如果传输电路向接收电路传递数据太快,如达到时钟速率, 则采用握手的总线同步失效。 解决办法是使用 FIFO。一般使用 FIFO 的目的是实现速度匹配,在 FIFO 较快的端口处理猝发的数据传输,而较慢的端口则维持恒定的 数据流。虽然访问方式和速度不同,但进出 FIFO 的平均数据速率 必须是相同的,否则 FIFO 就会出现上溢(overflow)或下溢 (underflow)问题。