System Generator从入门到放弃(八)-使用多时钟域实现多速率系统设计
System Generator从入门到放弃(八)-使用多时钟域实现多速率系统设计
夜未央,流星落,情已殇
文章目录
System Generator从入门到放弃(八)-使用多时钟域实现多速率系统设计
一、使用多时钟域实现多速率系统设计
1、简介
2、创建时钟域层次结构
3、创建异步通道
3、指定时钟域
System Generator是Xilinx公司进行数字信号处理开发的一种设计工具,它通过将Xilinx开发的一些模块嵌入到Simulink的库中,可以在Simulink中进行定点仿真,可以设置定点信号的类型,这样就可以比较定点仿真与浮点仿真的区别。并且可以生成HDL文件,或者网表,可以在ISE或Vivado中进行调用。或者直接生成比特流下载文件。能够加快DSP系统的开发进度。
一、使用多时钟域实现多速率系统设计
1、简介
多速率的概念是相对于单速率(Single Rate)信号处理而言的。单速率是指整个信号处理流程中只有一种数据速率;多速率是指系统中存在多个数据速率。使用多速率信号处理可以节省存储空间、减少通信数据量、减少运算量、减轻设计难度。
比如在DDC(数字下变频)系统中,前级需要很高的采样率fs确保ADC采集到信号的信噪比;而在去载波并提取出低频的基带信号后,信号有效带宽已经很小,此时可以满足要求的采样率也远远低于fs,如果不进行数据速率转换的处理,会造成许多资源的浪费和设计上的困难
2、创建时钟域层次结构
按照下图所示创建一个时钟域层次Model
PS:这部分例程在官方ug948-design-files.zip
Lab4中找到,由于官方在设计时将一些变量写到.m文件中了,所以需要先运行m文件,将参数输入到matlab工作空间,simulink会自动与工作空间进行交互,然后运行模型。
相关的FIX设置如下:
基本Block:
增益由POWER_SCALE输入控制
信道滤波器使用经典的多速率滤波器将输入信号(491.52MSPS)数字转换为近基带(61.44MSPS):使用两个半带滤波器,然后抽取2级滤波器,这比单个大滤波器需要更少的系数。
输出部分增益控制将使用数据的后续块的输出。
点击Run按钮进行仿真
显示多速率运行
在下面的图中,使用颜色启用Sample Time Display(在背景右击>Sample Time Display>Colors)。
系统会针对不同速率进行颜色的分配。
当这样的多速率设计在硬件中实现时,最优的实现是使用与数据频率相同的时钟;然而,时钟在这种环境中被抽象出来。下面的方法将演示如何以最有效的方式创建以上理想的环境。
要使用System Generator有效地实现多速率(或多时钟)设计,应该使用自己的System Generator为每个层次结构分配相同的时钟频率, 然后将每个层次结构与FIFO链接,就是利用FIFO实现不同时钟域的连接。
多时钟域划分
目前的设计有两个明显、一个不太明显的时钟域:
增益控制输入POWER_SCALE可以根据CPU配置,因此可以在与CPU相同的时钟频率下运行。
输出级上的实际增益控制逻辑应该与来自FIR的输出数据以相同的频率运行。这将允许它更有效地连接到系统中的后续Block。
不太明显的区域是滤波器链。在之前数字滤波器的例子中,System Generator提供的复杂IP(如FIR滤波器器)会自动利用超频来运行。例如,如果时钟频率为500 MHz(= 40 * 100/500),FIR滤波器不会使用100MHz运行的40个乘法器,而只使用8个乘法器。因此,整个滤波器链可以分组为单个时钟域。第一个FIR滤波器实例将以最大时钟速率执行,后续实例将自动采用过采样。
划分,创建subsystem
选择下图Block,右击–>Create Subsystem
重新命名DDC
选择output path Block,右击–>Create Subsystem,;重新命名Gain Control
选择Gateway In instance POWER_SCALE and Constant,右击–>Create Subsystem,;重新命名CTRL
当此设计完成时,每个子系统内的逻辑将以不同的时钟频率执行, 时钟域可能彼此不同步。
3、创建异步通道
在此步骤中,您将使用FIFO在子系统之间实现异步通道。FIFO中的数据以先进先出(FIFO)为基础运行,控制信号确保仅在存在有效数据时才读取数据,并且仅在有可用空间时写入数据。如果FIFO为空或满,则控制信号将使系统停止。在这种设计中,输入总是能够写入,并且不需要考虑FIFO满的情况。
两个地方需要FIFO:
Data from CTRL to Gain Control.
Data from DDC to Gain Control.
如下(FIFO为Xilinx BlockAdd):
添加相关控制信号
下面的几个信号需要添加:
从CTRL开始,需要写入启用。
从DDC开始,需要写入启用。来自FIR的data_tvalid可用于此。
增益控制必须为两个FIFO生成读使能。将使用来自FIFO的空信号并将其反转; 如果有可用数据,该块将读取它。
修改CTRL模块
按照下图进行连接
其中Relational block设置如下:
这将在Out2上创建一个输出选通,当输入改变时它将在一个周期内有效,并用作从CTRL到增益控制(顶层FIFO块)的写使能。
修改Gain Control模块
添加下诉模块和输入输出口:
a. Inverter
b. Inverter (for a total of two inverters)
c. Delay (Xilinx)
按照如下方式连接:
来自顶层增益控制FIFO(FIFO)模块的FIFO空信号只是一个反相器模块,用于为顶层DDC FIFO(FIFO1)创建读使能。如果FIFO不为空,则将读取数据。
同样,来自顶层DDC FIFO(FIFO1)的FIFO空信号被反转,以创建FIFO读使能。
此相同信号将用作新data_tvalid(为In2)。但是,由于FIFO的延迟为1,因此必须延迟此信号以确保此控制信号与数据正确对齐(现在通过FIFO将其延迟1)。
创建好的结构如下:FIFO Block的连接
a. Connect CTRL/Out2 to FIFO/we.
b. Connect FIFO/empty to Gain Control/CTRL_Empty.
c. Connect Gain Control/CTRL_Read to FIFO/re.
FIFO1 Block的连接a. Connect DDC/Out1 to FIFO1/we.
b. Connect FIFO1/empty to Gain Control/In2.
c. Connect Gain Control/DDC_Read to FIFO1/re.
最终结果
运行仿真将得到与第一步相同的结果
3、指定时钟域
指定时钟域,主要利用顶层 System Generator token使能多时钟域,其他Subsystem内添加 System Generator token然后取消使能多时钟域,重新设置时钟。
顶层 System Generator token使能Enable multiple clock
此时,请注意,FPGA时钟周期和Simulink系统周期现在变为灰色。此选项通知System Generator将为每个层次结构单独指定时钟速率。因此,最重要的是只包含子系统和FIFO; 在多速率设计中,顶层不应存在其他逻辑。
CTRL System Generator token不使能Enable multiple clock并设置相关时钟
Gain Control System Generator token不使能Enable multiple clock并设置相关时钟
DDC System Generator token不使能Enable multiple clock并设置相关时钟
保存
运行仿真,将得到和之前相同的结果