1.使用多时钟设计FPGA的好处
一个良好的FPGA设计是尽量让所有模块都处在高速时钟的运行下,减少硬件资源的使用。一般来说,在System Generator设计中最好采用单时钟设计(一个系统时钟),多速率时采用Clock Enable配合系统时钟实现,但是这种设计的缺点是功耗高、并且很难做到高速的Clock Enable;所以在某些特定情况下,使用多时钟处理便成为一种很好的设计方案
多时钟设计的一个典型应用是FPGA与不同速率的外设接口连接。这些外设接口包括很多,比如:
(1)I/O缓冲buffer与Microprocessor接口,Microprocessor使用处理器内部时钟采数据,与I/O缓冲buffer数据速率不同,需要处理两个不同时钟域的数据通信。
(2)数字信号送往DA转换器接口,该DA的时钟与数据速率不同,也同样需要处理不同时钟域的数据通信。 可见,当FPGA与外设的处理时钟不同时,都需要使用多时钟设计。
2.对设计进行时钟域分类
在多时钟设计中,对设计进行时钟域的划分是非常重要的一步,通常建议把系统中拥有相同频率时钟的模块构成一个时钟域,并且每个时钟域都用一个独立的子系统表示,这样做的好处在于:
(1)硬件实现时,每个域的时钟可以直接从子系统中得到。
(2)时钟域间的通信通过子系统间的接口可以明确定义。
(3)Sysgen针对每个子系统产生正确的时钟约束文件
在每个子系统内部是同步时钟设计,Simulink仿真结果和HDL仿真结果一致,但对于顶层模块来说,包含多个不同频率的时钟域,此时Simulink仿真结果有可能和HDL仿真出现不一致的情况,设计人员需要注意这点。
3.时钟域的交互
当不同时钟域间有通信时,使用System Generator中的共享存储器。这些共享存储器包括:Shared Memory、To FIFO/From FIFO、To Register/From Register。
这些共享存储器都成对的形式出现在设计中,两者通过相同的名字确定唯一联系,在三者中,共享FIFO最经常使用,硬件映射为Xilinx FIFO Generator core,其非常适用于高带宽、连续数据的传输;Shared Memory映射为双口RAM,但一定要避免两个时钟域同时往同一个地址写/读数据的发生,此时会出现无效数据;共享Register映射为寄存器类型,有关共享存储器的详细介绍请参看下面例子。
<IMG style="PADDING-BOTTOM: 0px; BORDER-RIGHT-WIDTH: 0px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0px; border-image: initial" title="sysgen 多时钟模块的设计" name=image_operate_92061360223908162 alt="sysgen 多时钟模块的设计" src="http://s7.sinaimg.cn/mw690/735f2910gd51d7affbe16&690" width=661 height=1154 real_src="http://s7.sinaimg.cn/mw690/735f2910gd51d7affbe16&690">
注意到A-时域和B-时域的输入相同,都是din_A。
<IMG style="PADDING-BOTTOM: 0px; BORDER-RIGHT-WIDTH: 0px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0px; border-image: initial" title="sysgen 多时钟模块的设计" name=image_operate_57001360223931474 alt="sysgen 多时钟模块的设计" src="http://s4.sinaimg.cn/mw690/735f2910gd51dc21e7663&690" width=664 height=248 real_src="http://s4.sinaimg.cn/mw690/735f2910gd51dc21e7663&690">
<IMG style="PADDING-BOTTOM: 0px; BORDER-RIGHT-WIDTH: 0px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0px; border-image: initial" title="sysgen 多时钟模块的设计" name=image_operate_32661360223952249 alt="sysgen 多时钟模块的设计" src="http://s12.sinaimg.cn/mw690/735f2910gd51dd05a864b&690" width=646 height=475 real_src="http://s12.sinaimg.cn/mw690/735f2910gd51dd05a864b&690">
顺便提下,Simulink中双击scope示波器,然后单击parameters项(第二个图标)在General选项卡中的Axes里面,修改Number of axes项就可以让scope有多个引脚输入了。 |