系统中的多时钟设计
系统中的多时钟设计多时钟系统在FPGA开发中占据重要地位。首先,存储器共享技术需要多时钟;其次,多时钟设计可以联合不同时钟和分支时钟来达到实现高级时钟策略。本次主要从以下方面讨论如何在System generator中使用多时钟开发技术,并在最后给出一个工程实例:
• 采用多时钟设计带来的好处;
• 如何采用层次划分法,将一个System Generator模型分割为两个或多个时钟区域;
• 如何跨时钟域使用共享存储器;
• 如何仿真多时钟设计以及将其转化成网表;
• 如何使用多个Xilinx子系统模块将多个时钟区域级联起来。
将设计划分为由多个不同时钟驱动的子系统,每个子系统被称为异步时钟孤岛,其中的共享内存将起到通信桥梁的作用。
1.多时钟应用
多时钟区域的典型应用是和工作在不同时钟速率的外部硬件模块接口。例如经常通过一组I/O接口,按照外部控制器的时钟来访问外部寄存器,然后在FPGA内部,再对数据进行重采样以达到同步的目的;经过本地处理后,再将数据以另外一个外部接口模块所需要的时钟送出FPGA。
多时钟的另外一个重要应用就是开发高速处理单元。以插值FIR滤波器为例,滤波器从外部模块单元接收符号数据,然后在对每一个符号完成4倍插值,将每个符号变成4个符号,即数据速率提高了4倍,最后以数模转换器(DAC)时钟采样数据,将其送到DAC中。
对于滤波器设计,常用方法就是让滤波器工作在采样率下,一个周期处理一个采样,这种方法消耗了最大限度的硬件资源,因此只适合应用于高速的系统中。而对于低速数据,这样设计就太浪费资源了,需要采用复用的理念。假设工作时钟是数据速率的N倍,则一个处理时钟周期可以拆分为N个片段,拆分后的时长等于数据周期,则处理一级只需要一个时间片段,也就可以将同一份资源复用N次,即资源的使用降低为原来的1/N。一个优秀的FPGA设计应该尽可能采用高的处理时钟以追求更多的复用倍数,以速度换取面积,降低硬件成本,同时也给系统引入了多个时钟。当然多倍复用的方法也存在两方面缺点,首先会导致芯片功耗变大;其次增加了布局布线的难度,对编程人员有更高的要求。因此,需要在高速设计中划分时钟域。
此外,在异步接口模块中不可避免地要使用多时钟。因此,掌握FPGA多时钟的设计方法既是一种趋势,也是一项基本要求。
2.时钟区域分割
将多时钟设计分割到多个区域是FPGA设计的一个重要方面。System Generator不仅以结构化设计的方式支持时钟区域分割,还要求把与每个时钟以及与其相关的逻辑封装成一个子系统。这样,单个子系统就形成了同步孤岛,是真正意义上的周期硬件电路,且其性能和Simulink行为模型一致。前面所提的比特和周期精确的概念只在单个同步孤岛中成立。由于包含同步孤岛的高层模型是通过异步时钟来驱动孤岛的,因此它并不是真正的周期电路。需要说明的一点是:System Generator和Simulink都通过理想的时钟源对设计进行仿真,因此调用异步时钟系统会导致软件仿真和真实的硬件性能存在一定的偏差。
在设计中通过子系统来分割时钟有诸多优点:首先,将物理时钟信号从模块结构图中提取出来;其次,Xilinx提供的跨域转换器能够处理模块库中模块的亚稳态安全;第三,System Generator能对时钟孤岛产生精确的时钟约束以及时序分析。
此外,这种抽象级的设计流程可以减少用户设计中一些常见错误,如:门时钟错误,异步复位信号以及锁存器。System Generator在硬件生成阶段自动产生时钟,因此不会将非时钟信号连到时钟输如端口,发生门时钟错误,也不会生成锁存器。由于异步复位会导致各种时序问题,因此System Generator在编译时不允许异步复位,从而避免了该类错误。
3.跨越时钟区域
System Generator通过存储器共享的方式来跨越不同的时钟区域,主要有Shared Memory、To FIFO、From FIFO、To egister和From Register这5个模块,且在使用时必须配对使用,典型的示意图如图7-54所示。
图7-54 成对使用的模块示意图
To FIFO模块用于写操作,From FIFO用于读操作,且一对FIFO通过命名配对关联。在硬件实现时,这两个模块都通过Xilinx公司的FIFO IPcore生成。使用FIFO模块是3种跨越时钟区域的方法中最安全和最方便的方式,是高速数据传输的最优手段。
一对共享存储器模块是通过一个双口块RAM来实现的,也通过命名来配对关联,两个共享存储器模块分别工作于不同的时钟区域。由于块RAM是真正的双口RAM,在每个时钟区域都可以独立地完成读写,但是要注意不能同时写同一个地址,也不能对同一个地址发生写操作和读操作。由于是基于块RAM实现的,因此具备大容量和高速的特点。
To egister模块用于写寄存器,From Register用于读寄存器,一对寄存器通过命名配对关联,寄存器操作不同的时钟域中必须同步操作。在硬件实现时,一对寄存器通过一个触发器来实现,一对1比特的To/From Register模块需要一个触发器。需要注意的是:通过这样方式实现跨域是不安全的,只有在对硬件特征完全理解的基础上才能使用,一般不推荐这种方式。
4.网表化多时钟设计
在System Generator设计中,每个时钟区域都有其自己的子系统。图7-55给出了一个双时钟区域的设计,每个子系统都可以独立设置系统周期。
图7-55 双时钟区域的设计
当一个多区域设计被网表化时,System Generator需要执行下面的步骤,如图7-56所示。
1. 选中0号区域(左边),除TO FIFO模块外所有设计的HDL文件,并编译产生NGC文件;
2. 选中1号区域(右边),除From FIFO模块外所有设计的HDL文件,并编译产生NGC文件;
3. 然后调用Xilinx核生成器来产生中间的FIFO模块;
4. 最后再产生顶层HDL模块,并在其中例化上述三个模块。
图7-56 多时钟设计的顶层模块示意图
页:
[1]