追风者

FPGA设计的四种常用思想与技巧2

0
阅读(1563)

流水线操作设计思想 
首先需要声明的是,这里所讲述的流水线是指一种处理流程和顺序操作的设计思想,并非
FPGA、ASIC 设计中优化时序所用的“Pipelining”。 
流水线处理是高速设计中的一个常用设计手段。如果某个设计的处理流程分为若干步骤,而
且整个数据处理是“单流向”的,即没有反馈或者迭代运算,前一个步骤的输出是下一个步
骤的输入,则可以考虑采用流水线设计方法来提高系统的工作频率。 

流水线设计的结构示意图如图 3 所示。其基本结构为:将适当划分的 n 个操作步骤单流向串
联起来。流水线操作的最大特点和要求是,数据流在各个步骤的处理从时间上看是连续的,
如果将每个操作步骤简化假设为通过一个 D 触发器(就是用寄存器打一个节拍), 那么流水线
操作就类似一个移位寄存器组,数据流依次流经 D 触发器,完成每个步骤的操作。流水线设
计时序如图 4 所示。
流水线设计的一个关键在于整个设计时序的合理安排,要求每个操作步骤的划分合理。如果
前级操作时间恰好等于后级的操作时间,设计最为简单,前级的输出直接汇入后级的输入即
可;如果前级操作时间大于后级的操作时间,则需要对前级的输出数据适当缓存才能汇入到
后级输入端;如果前级操作时间恰好小于后级的操作时间,则必须通过复制逻辑,将数据流
分流,或者在前级对数据采用存储、后处理方式,否则会造成后级数据溢出。
在 WCDMA 设计中经常使用到流水线处理的方法,如 RAKE 接收机、搜索器、前导捕获等。流
水线处理方式之所以频率较高,是因为复制了处理模块,它是面积换取速度思想的又一种具
体体现。 
数据接口的同步方法 
数据接口的同步是 FPGA/CPLD 设计的一个常见问题,也是一个重点和难点,很多设计不稳定
都是源于数据接口的同步有问题。 
 
在电路图设计阶段,一些工程师手工加入 BUFT 或者非门调整数据延迟,从而保证本级模块
的时钟对上级模块数据的建立、保持时间要求。还有一些工程师为了有稳定的采样,生成了
很多相差 90 度的时钟信号,时而用正沿打一下数据,时而用负沿打一下数据,用以调整数
据的采样位置。这两种做法都十分不可取,因为一旦芯片更新换代或者移植到其它芯片组的
芯片上,采样实现必须从新设计。而且,这两种做法造成电路实现的余量不够,一旦外界条
件变换(比如温度升高),采样时序就有可能完全紊乱,造成电路瘫痪。 
下面简单介绍几种不同情况下数据接口的同步方法:
 
 1. 输入、输出的延时(芯片间、PCB布线、一些驱动接口元件的延时等)不可测,
或者有可能变动的条件下,如何完成数据同步? 
对于数据的延迟不可测或变动,就需要建立同步机制,可以用一个同步使能或同步
指示信号。另外,使数据通过 RAM 或者 FIFO 的存取,也可以达到数据同步目的。 
把数据存放在RAM或FIFO的方法如下: 将上级芯片提供的数据随路时钟作为写信号,
将数据写入 RAM 或者 FIFO,然后使用本级的采样时钟(一般是数据处理的主时钟)将数据读
出来即可。 这种做法的关键是数据写入 RAM 或者 FIFO 要可靠, 如果使用同步 RAM 或者 FIFO,
就要求应该有一个与数据相对延迟关系固定的随路指示信号, 这个信号可以是数据的有效指
示, 也可以是上级模块将数据打出来的时钟。 对于慢速数据, 也可以采样异步 RAM 或者 FIFO,
但是不推荐这种做法。 
数据是有固定格式安排的,很多重要信息在数据的起始位置,这种情况在通信系统中非常普
遍。通讯系统中,很多数据是按照“帧”组织的。而由于整个系统对时钟要求很高,常常专
门设计一块时钟板完成高精度时钟的产生与驱动。而数据又是有起始位置的,如何完成数据
的同步,并发现数据的“头”呢? 
数据的同步方法完全可以采用上面的方法,采用同步指示信号,或者使用 RAM、FIFO 缓存一
下。 找到数据头的方法有两种, 第一种很简单, 随路传输一个数据起始位置的指示信号即可,
对于有些系统,特别是异步系统,则常常在数据中插入一段同步码(比如训练序列),接收端
通过状态机检测到同步码后就能发现数据的“头”了,这种做法叫做“盲检测”。 
上级数据和本级时钟是异步的, 也就是说上级芯片或模块和本级芯片或模块的时钟是异步时
钟域的。
前面在输入数据同步化中已经简单介绍了一个原则: 如果输入数据的节拍和本级芯片的处理
时钟同频,可以直接用本级芯片的主时钟对输入数据寄存器采样,完成输入数据的同步化;
如果输入数据和本级芯片的处理时钟是异步的,特别是频率不匹配的时候,则只有用处理时
钟对输入数据做两次寄存器采样,才能完成输入数据的同步化。需要说明的是,用寄存器对
异步时钟域的数据进行两次采样,其作用是有效防止亚稳态(数据状态不稳定)的传播,使后
级电路处理的数据都是有效电平。 但是这种做法并不能保证两级寄存器采样后的数据是正确
的电平,这种方式处理一般都会产生一定数量的错误电平数据。所以仅仅适用于对少量错误
不敏感的功能单元。 
为了避免异步时钟域产生错误的采样电平,一般使用 RAM、FIFO 缓存的方法完成异步时钟域
的数据转换。最常用的缓存单元是 DPRAM,在输入端口使用上级时钟写数据,在输出端口使
用本级时钟读数据,这样就非常方便的完成了异步时钟域之间的数据交换。 
2. 设计数据接口同步是否需要添加约束? 
建议最好添加适当的约束,特别是对于高速设计,一定要对周期、建立、保持时间等添加相
应的约束。 
这里附加约束的作用有两点: 
a. 提高设计的工作频率,满足接口数据同步要求。通过附加周期、建立时间、保持时间等
约束可以控制逻辑的综合、映射、布局和布线,以减小逻辑和布线延时,从而提高工作频率,
满足接口数据同步要求。 
b. 获得正确的时序分析报告。几乎所有的 FPGA 设计平台都包含静态时序分析工具,利用这
类工具可以获得映射或布局布线后的时序分析报告,从而对设计的性能做出评估。静态时序
分析工具以约束作为判断时序是否满足设计要求的标准,因此要求设计者正确输入约束,以
便静态时序分析工具输出正确的时序分析报告。 
Xilinx 和数据接口相关的常用约束有 Period、OFFSET_IN_BEFORE、OFFSET_IN_AFTER、
OFFSET_OUT_BEFORE和OFFSET_OUT_AFTER等; Altera与数据接口相关的常用约束有Period、
tsu、tH、tco 等。