编辑: yn灬不离不弃灬 | 2013-01-08 |
com/zh/analogdialogue
1 快速通往量产的四个步骤: 利用基于模型的设计开发软 件定义无线电 第四部分―利用 Zynq SDR 套件和 Simulink 代码生成工 作流程快速完成原型开发 作者:Mike Donovan、Andrei Cozma 和Di Pu 简介 本系列文章的前几部分介绍了Zynq SDR快速原型开发平台1 , 说明了利用MATLAB和Simulink开发算法以成功处理和解码 ADS-B传输的步骤2 , 并展示了如何在仿真中和利用SDR平台获 得的实时数据验证该算法3 .所有阶段的最终目标是创建一个 经验证的模型,其可以转换为C和HDL代码,并且能够方便地 集成到SDR平台的软件和硬件基础设施中. 本系列第二部分( 利用MATLAB和Simulink进行S模式检测和 解码 )2 讨论的Simulink模型是一个具有足够高精度硬件细节 的仿真模型,可验证该设计将能成功解码ADS-B消息.以该模 型为出发点,本部分将讨论为了产生一个能够在Zynq SDR快 速原型开发平台上运行的有效接收机设计所需的最后步骤. 像 前面几篇文章一样,开发该有效设计所需的技能包括:熟练使 用MATLAB和Simulink,了解Zynq无线电硬件,以及软硬件集 成技能. 本文提出的步骤包括: ? 以Zynq SoC上的FPGA结构和ARM? 处理系统为目标,将Simulink模型划分为多个功能. ? 引入对Simulink模型的设计变更,以改善所生成的HDL代 码的性能. ? 生成ADS-B接收机算法的HDL和C语言源代码. ? 将生成的源代码集成到Zynq无线电平台设计中. ? 在目标硬件上利用实时航空器信号测试该嵌入式设计. 此过程结束时,就会产生一个经全面验证的SDR系统,其运行 从Simulink ADS-B模型自动生成的C和HDL代码,可实时接收 和解码商用航空器信号. 将模型划分为硬件和软件组件 生成实现代码过程的第一步是划分设计功能, 以便在Zynq SoC 的可编程逻辑和ARM处理系统上运行. 功能划分通常是从明确设计的不同组件的处理要求和所需的 执行速率与时间开始. 需要以采样速率实时运行的计算密集型 组件(如数据调制/解调算法),最适合在可编程逻辑中实现. 计算量相对较少的处理任务(如数据解码和渲染,以及系统监 视和诊断),更适合通过软件实现.其它需要考虑的方面有: 运算的数据类型和复杂度,以及输入和输出数据的精度.所有 以可编程逻辑为目标的运算都采用定点、整数或布尔数据类 型.对于更复杂的运算,如三角函数和平方根,须在可用硬件 资源的约束下,利用近似来高效实现.所有这些约束都会导致 精度损失,若不加以适当评估和处理,可能会对系统功能带来 不利影响.但是,以处理系统为目标的组件可以采用浮点数, 并以最高保真度实现任何复杂度的运算, 不过通常要以降低执 行速度为代价. 以上述约束作为指导原则, ADS-B解码算法的划分是相当明显 的.ModeS_Simulink_Decode.slx模型中的检波器模块的功能, 包括I/Q样本的前端处理一直到校验和计算,非常适合在Zynq SoC的可编程逻辑上实现(图1).改良缓冲器和解码与显示模 块中的消息位解码功能,很容易在处理系统中实现. 图1. ModeS_Simulink_Decode.slx:FPGA和ARM处理器划分
2 模拟对话 49-12,2015 年12 月 对下述内容和Simulink模型感兴趣的读者, 可在Analog Devices GitHub库4 中找到相关文件. 从Simulink模型生成HDL代码 S模式解码器模型中的检波器模块(图2)包括多个子系统: CalcSyncCorr、 CalcNF、 SyncAndControl、 BitProcess、 CalcCRC 和FameDetect.MathWorks的HDL编码器5 用于产生此设计的 HDL源代码. 图2. 用于HDL代码生成的检波器模块 为了利用HDL编码器成功生成HDL代码,Simulink模型必须满 足一些条件.下面是其中几个最重要的要求: ? 使用支持HDL代码生成的模块.HDL编码器支持大约200 个Simulink模块的代码生成6 .在检波器设计中,所有模块 都支持HDL代码生成, 包括状态流程图和数字滤波器模块. ? 使用定点数据类型.在检波器设计中,信号使用12位、24 位和布尔数据类型. 12位数据类型与ADI公司AD9361收发 器上的模数转换器的位宽一致. ? 使用标量或矢量信号. 矢量信号可用于多通道信号或资源 共享. ? 避免模型中出现代数环. HDL编码器软件不支持存在代数 环条件的模型的HDL代码生成. ModeS_Simulink_Decode.slx模型并不满足所有这些条件, 因此 将比较接收位与计算校验和的CalcCRC模块部分移出检波器 模块,最终用C语言实现.由此得到的模型ModeS_ADI_ CodeGen.slx用于生成HDL代码. 与手动编码过程相比, 它只需 几分钟便能生成数千行HDL代码. HDL编码器产生的源代码是 Simulink模型的位真、周期精确版本.这是使用模型进行设计 在生产力提升方面带来的重大好处之一,所生成的代码是 Simulink模型的精确转译. 此外,这些代码易读且可追溯,工程师可以轻松地将生成的代 码映射到设计模型.这是通过多种方法来实现的(图3): ? 生成的HDL代码文件中保留了该模型的层次.本例中,顶 层模块被命名为Detector.vhd, 处在下一级的子系统被命名 为CalcNF.vhd、Bit_Process.vhd等. ? 生成的代码中保留了该模型所用的模块名称、端口名称、 信号名称、数据类型和复杂度. 模型与源代码之间存在关联,设计人员点击Simulink模型中的 某个模块,便可自动导航到相应的HDL代码.同样,生成的代 码中也有超级链接,点击它便会打开Simulink模型,并高亮显 示与该代码段相关的模块. 图3. ModeS_ADI_CodeGen.slx的HDL源代码 优化ADS-B模型以产生具有更高时钟速度的HDL代码 虽然ModeS_ADI_CodeGen.slx模型成功生成了HDL代码,但在 绝大多数情况下,设计人员会希望改善初始结果.设计人员通 常要满足速度和面积约束条件,这就需要优化初始Simulink模 型以实现所需的效果. Simulink和代码生成的一个重要优势是, 设计人员可以在模型中进行优化, 并运行仿真以确保变更没有 破坏算法,然后重新生成HDL代码.这种方法比修改HDL源代 码(可能会破坏算法)更为简单,而且不易出错. 对于本设计,模型生成的HDL代码很容易适应可用的FPGA结构,但运行的时钟速率相对较低.这在许多初步设计中是常见 现象.HDL编码器内置的分析工具表明,模型中的关键路径从 I/Q样本输入延伸到CalcCRC子系统中的第一个寄存器. 在设计 中插入流水线寄存器是提高时钟速度的一种常见方法(图4). 流水线缩短了信号操作之间的路径, 代价是增加了整体处理的 延迟.这种折中通常是可以接受的,因为相对于更高的时钟速 度,延迟略微增加是很小的代价. 图4. 检波器设计中插入流水线寄存器 模拟对话 49-12,2015 年12 月3位于子系统之间的流水线寄存器有助于改善设计的时钟速率, 但如果数字滤波器模块选择优越的架构, 则可以实现更好的时 钟速率.许多Simulink模块都有架构选择,设计人员可以藉此 优化设计的速度或面积. 对于计算噪底和前同步码相关性所用 的数字滤波器(图5),输出乘法器的流水线化可以缩短数字 滤波器内的关键路径,提高设计时钟速率. 图5. 数字滤波器模块的HDL模块选择 采取这两个简单的流水线变更之后, 生成的HDL代码的时钟速 率便超过140 MHz.这对于使用代码生成工具的工程设计是一 个有用的启示:在代码生成模型上应用一点硬件设计原理知 识,便可对生成的代码结果产生相当大的影响.对该设计还可 以做进一步的优化,但并无必要,因为HDL代码很容易满足该 设计相对简单的时序和资源目标. 在传统无线电设计过程中, 大量开发时间花在HDL代码的测试 和调试上.而在基于模型的设计方法中,更多时间是花在开发 仿真和代码生成模型上,本例就是如此.然而,开发时间会节 省很多,因为生成的源代码与经验证的仿真行为完全一致,只 需对嵌入式硬件执行极少量的调试. 利用MATLAB编码器7 生成C语言代码 与生成HDL代码相似,为了生成用于本设计解码功能的C语言 代码,也有几个条件必须满足.下面是两个最重要的要求: ? ........