文章转自ADI官网,版权归属原作者一切
简介
本系列文章的前几部分介绍了Zynq SDR快速原型开发渠道1,阐明晰运用MATLAB和Simulink开发算法以成功处理和解码ADS-B传输的进程2,并展现了如安在仿真中和运用SDR渠道取得的实时数据验证该算法3。一切阶段的终究方针是创立一个经验证的模型,其可以转换为C和HDL代码,并且可以方便地集成到SDR渠道的软件和硬件基础设施中。
T本系列第二部分(”运用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处理器区分对下述内容和Simulink模型感兴趣的读者,可在Analog Devices GitHub库4中找到相关文件。4
从Simulink模型生成HDL代码
S形式解码器模型中的检波器模块(图2)包括多个子体系: CalcSyncCorr、CalcNF、SyncAndControl、BitProcess、CalcCRC和FameDetect。MathWorks的HDL编码器5用于发生此规划的HDL源代码。
为了运用HDL编码器成功生成HDL代码,Simulink模型有必要满意一些条件。下面是其间几个最重要的要求:
- 运用支撑HDL代码生成的模块。HDL编码器支撑大约200个Simulink模块的代码生成6。在检波器规划中,一切模块都支撑HDL代码生成,包括状况流程图和数字滤波器模块。
- 运用定点数据类型。在检波器规划中,信号运用12位、24位和布尔数据类型。12位数据类型与ADI公司AD9361收发器上的模数转换器的位宽共同。
- 运用标量或矢量信号。矢量信号可用于多通道信号或资源共享。
- 防止模型中出现代数环。HDL编码器软件不支撑存在代数环条件的模型的HDL代码生成。
波器模块,终究用C言语完结。由此得到的模型ModeS_ADI_CodeGen.slx用于生成HDL代码。与手动编码进程比较,它只需几分钟便能生成数千行HDL代码。HDL编码器发生的源代码是Simulink模型的位真、周期准确版别。这是运用模型进行规划在出产力进步方面带来的严重优点之一,所生成的代码是Simulink模型的准确转译。
此外,这些代码易读且可追溯,工程师可以轻松地将生成的代码映射到规划模型。这是经过多种办法来完结的(图3):
- 生成的HDL代码文件中保留了该模型的层次。本例中,顶层模块被命名为Detector.vhd,处在下一级的子体系被命名为CalcNF.vhd、Bit_Process.vhd等。
- T生成的代码中保留了该模型所用的模块称号、端口称号、信号称号、数据类型和杂乱度。
模型与源代码之间存在相关,规划人员点击Simulink模型中的某个模块,便可主动导航到相应的HDL代码。相同,生成的代码中也有超级链接,点击它便会翻开Simulink模型,并高亮显现与该代码段相关的模块。
优化ADS-B模型以发生具有更高时钟速度的HDL代码
尽管ModeS_ADI_CodeGen.slx模型成功生成了HDL代码,但在绝大多数状况下,规划人员会期望改进初始效果。规划人员一般要满意速度和面积束缚条件,这就需求优化初始Simulink模型以完结所需的作用。Simulink和代码生成的一个重要优势是,规划人员可以在模型中进行优化,并运转仿真以保证改动没有损坏算法,然后从头生成HDL代码。这种办法比修正HDL源代码(或许会损坏算法)更为简略,并且不易犯错。
关于本规划,模型生成的HDL代码很简略习惯可用的FPGA结构,但运转的时钟速率相对较低。这在许多初步规划中是常见现象。HDL编码器内置的剖析东西标明,模型中的要害途径从I/Q样本输入延伸到CalcCRC子体系中的第一个寄存器。在规划中刺进流水线寄存器是进步时钟速度的一种常见办法(图4)。 流水线缩短了信号操作之间的途径,价值是添加了全体处理的推迟。这种折中一般是可以承受的,由于相关于更高的时钟速度,推迟稍微添加是很小的价值。
坐落子体系之间的流水线寄存器有助于改进规划的时钟速率,但假如数字滤波器模块挑选优胜的架构,则可以完结更好的时钟速率。许多Simulink模块都有架构挑选,规划人员可以藉此优化规划的速度或面积。关于核算噪底和前同步码相关性所用的数字滤波器(图5),输出乘法器的流水线化可以缩短数字滤波器内的要害途径,进步规划时钟速率。
采纳这两个简略的流水线改动之后,生成的HDL代码的时钟速率便超越140 MHz。这关于运用代码生成东西的工程规划是一个有用的启示: 在代码生成模型上运用一点硬件规划原理常识,便可对生成的代码效果发生适当大的影响。对该规划还可以做进一步的优化,但并无必要,由于HDL代码很简略满意该规划相对简略的时序和资源方针。
在传统无线电规划进程中,许多开发时刻花在HDL代码的测验和调试上。而在根据模型的规划办法中,更多时刻是花在开发仿真和代码生成模型上,本例便是如此。但是,开发时刻会节约许多,由于生成的源代码与经验证的仿真行为完全共同,只需对嵌入式硬件履行很少量的调试。
运用MATLAB编码器7生成C言语代码7
与生成HDL代码类似,为了生成用于本规划解码功用的C言语代码,也有几个条件有必要满意。下面是两个最重要的要求:
- 运用MATLAB编码器支撑的函数。MATLAB编码器支撑大部分MATLAB言语和许多东西箱8,但您或许无意中运用了代码生成所不支撑的函数。MATLAB编码器供给了”代码安排妥当东西”9等东西来协助找出不支撑的函数。
- 一旦声明一个MATLAB变量,其巨细和类型便不得改动。这是为了保证在生成的代码中正确分配存储器。
从MATLAB生成C代码的最简略办法是从MATLAB东西列上的Apps选项卡新建一个MATLAB编码器项目。MATLAB编码器项目的终究输出如图6所示。
在该项目中,顶层MATLAB函数是DecodeBits_ADI.m。用户需求指定此函数所需的数据类型和巨细作为输入参数。 图6显现,此函数的输入参数为112个布尔数据位和2个双精度值(用以供给用户当时的经度和纬度)。DecodeBits_ADI.m的输出巨细和数据类型(例如:*nV表明向北速度,*eV表明向东速度,*alt表明高度)由MATLAB编码器主动确认。MATLAB编码器会找出顶层进口文件DecodeBits_ADI.m调用的一切其他函数,包括AltVelCalc_ADI.m和LatLongCalc_ADI.m,然后生成整个解码算法的C言语源代码。
MATLAB编码器生成的C言语代码是MATLAB功用的直接转译。好像HDL代码生成,MATLAB编码器发生的源代码也是易读且可追溯的,工程师可以轻松发现原始MATLAB代码与生成的C代码之间的联系。本例的C代码可从MATLAB指令提示发生,并且可由任何ANSI C编译器编译。
HDL代码渠道布置
完结上述进程(将规划区分为不同功用以在Zynq的可编程逻辑和处理体系上运转,针对HDL和C言语代码生成优化规划,以及经过仿真验证优化后的规划可以有用作业且满意功用规范)之后,现在便需求将规划布置到实践SDR硬件渠道上,并验证体系在实践条件下的功用为此,咱们运用ADI公司的AD-FMCOMMS3-EBZ SDR渠道10,其衔接到一个运转ADI Linux发行版的Xilinx ZC706板11。
AD-FMCOMMS3-EBZ板顺便一个ADI公司供给的开源Vivado HDL参阅规划12。该参阅规划包括用以装备AD-FMCOMMS3-EBZ板上的AD9361收发器及传输数据所需的悉数IP模块。图7为该HDL参阅规划的框图。
AD9361 IP内核完结了AD9361收发器芯片与Zynq器材之间的LVDS接纳和发送数据接口,以及与规划其他部分的数据接口。DMA模块用于AD9361 IP与DDR存储器之间的高速数据传输。 AD9361 IP模块的数据接口包括4条用于接纳的数据线和4条用于发送的数据线,对应于AD9361的两个接纳通道和两个发送通道的I&Q数据。每条数据线都是16位宽。为使体系内部的数据传输功率更高,接纳和发送数据被包装到由DMA模块办理的64位宽总线中。AD9361 IP的16位并行数据线经过打包和解包模块衔接到DMA。
为了将ADS-B模型的HDL代码布置到SDR渠道的现有HDL基础设施中,需求创立一个可刺进数据途径中的IP内核,然后实时处理收到的数据并将处理过的数据传送到软件层。布置进程是一个困难且耗时的使命,由于它要求对HDL规划的功用有深入的了解,一起需求熟练的HDL编程技术。为了简化这些步,MathWorks在HDL编码器中集成了一个称为HDL Workflow Advisor的实用东西,ADI公司为AD-FMCOMMS2-EBZ/AD-FMCOMMS3-EBZ SDR渠道和Xilinx ZC706板供给了一个板支撑包(BSP) 13。
HDL Workflow Advisor可引导用户一步一步地从Simulink模型生成HDL代码。用户可以挑选不同的方针作业流程,包括”ASIC/FPGA”、”FPGA在环”和”IP内核生成”。方针渠道挑选包括Xilinx评价板、Altera评价板和FMCOMMS2/3 ZC706 SDR渠道。余下的代码生成和方针集成进程可由HDL Workflow Advisor主动完结。
ADI公司供给的BSP是板界说和参阅规划14的调集,用认为HDL Workflow Advisor供给必要的信息和东西来发生与现有HDL参阅规划兼容的IP模块,以及将生成的IP刺进HDL参阅规划。 图8显现了怎么装备Workflow Advisor来发生ADS-B模型的IP内核。请注意:有必要挑选IP内核生成作业流程,并以ADI公司的AD-FMCOMMS3-EBZ SDR渠道和Xilinx ZC706板为方针。
下一步是装备IP与参阅规划之间的接口。 在输入侧,该模型承受原始I&Q样本,模型的输入端口与AD9361接纳器数据端口直接相连。在模型的一切输出信号中,当时阶段感兴趣的是数据、frame_valid和bit_clk信号。数据和frame_valid为16位宽,由bit_clk信号供给时钟。这些信号可以衔接到BSP的”DUT Data x Out”接口,意味着它们将接纳对DMA模块的直接拜访;然后可以将数据传输到DDR供软件层拜访。bit_clk信号衔接到BSP的”DUT Data Valid Out”接口,用以操控DMA采样速率。图9显现了HDL接口有必要怎么装备。
一旦界说了方针接口,HDL Workflow Advisor的第2步和第3步便可坚持默许状况,然后经过运转进程4.1(创立项目)来发动项目生成进程。此进程的效果是发生一个Vivado项目,其ADS-B IP内核已集成到ADI公司的HDL参阅规划中。图10显现了ADS-B IP内核与规划中其他模块的衔接。
从Vivado项目生成位流便可完毕HDL集成进程,但终究方针是让Linux在体系上运转。 为此,在生成位流之后,可依照规范Xilinx SDK第一阶段引导加载程序(fsbl)和Linux引导文件创立进程创立一个Linux引导文件。与新创立HDL规划对应的Linux设备树和映像文件伴随AD-FMCOMMS3-EBZ BSP发布。一切文件都有必要与SD卡引导分区上的Linux引导文件一起仿制;引导分区用于存储在Xilinx ZC706板上运转ADI公司Linux发行版所需的悉数文件。
C言语代码渠道布置
将ADS-B HDL IP集成到SDR渠道的HDL规划并创立Linux SD卡之后,便需求完结用来解码ADS-B数据的软件运用程序。此运用程序根据第5部分生成的C代码,履行如下使命:
- 装备AD9361以接纳ADS-B信号。
- 从ADS-B IP内核读取数据。
- 在读取的数据中检测有用ADS-B帧。
- 解码并显现ADS-B信息。
完结使命1和使命2的最简略办法是运用libiio库15供给的功用。此库供给了接口函数,答应用户轻松装备AD9361以及接纳和发送数据。 装备进程设置如下体系参数:
- LO频率—1.09 GHz
- 采样速率—12.5 MHz
- 模仿带宽—4.0 MHz
- AGC—快速发动形式
除上述参数外,一个数据速率为12.5 MSPS、通带频率为3.25 MHz、阻带频率为4 MHz的数字FIR滤波器也被加载到AD9361中,保证收到的数据仅包括方针频段。该FIR滤波器的体系参数和规划办法详见本系列文章第三部分3所述。
ADS-B IP的输出数据经过DMA模块传输到体系的DDR存储器。libiio库供给如下功用: 将从ADS-B IP获取的数据放置到指定巨细的存储缓冲器中;等候缓冲器填满;经过指针拜访该缓冲器。 一旦缓冲器填满,ADS-B解码算法便可处理数据。ADS-B IP内核有两个输出通道:一个通道对应于ADS-B位流,另一个通道指示一个有用数据帧在位流中的何处完毕。两个通道均包括相同的数据速率,互相同步。 有用通道中一个等于1的样本表明数据通道中一个有用帧的终究一位。 经过解析这两个通道,软件可以从位流中提取有用的ADS-B数据帧,并将数据传送到MATLAB编码器生成的解码函数。当核算航空器坐标时,解码函数运用ADS-B数据帧和当时方位的经纬度作为输入。当时经纬度被指定为运用程序的参数。ADS-B解码数据的显现与Simulink模型类似。
ADS-B数据解码程序是在Linux下运用makefile构建。该运用程序的源代码和makefile可在Analog Devices github库中下载16。
这样就完结了运用HDL编码器从ADS-B模型生成的HDL代码和运用MathWorks MATLAB编码器生成的C代码的渠道布置进程。下一步是验证体系功用并评价效果。
体系验证
为了验证体系功用,首要要在AD-FMCOMMS3-EBZ板的一个接纳端口与一个发送端口之间树立一个回送衔接,并发送仿真期间运用的相同ADS-B信号。经过接纳和解码此数据,可以验证SDR渠道上运转的算法输出是否与仿真效果共同。图11显现了ADS-B数据解码程序的输出,效果与本系列文章第三部分中运用预先捕捉的数据进行HDL仿真所取得的效果完全相同。 这阐明体系运转契合预期,可以运用实践数据进行测验。
现场实践测验时,SDR接纳机放在MathWorks坐落美国马萨诸塞州纳蒂克的总部外面,体系解码的ADS-B信息与飞机实时盯梢网站(如flightradar24.com)供给的数据进行比照。效果证明:在天线的视野范围内,体系可以解码从飞机收到的数据。图12显现了体系检测到的航空器信息与在线飞机盯梢数据的比照状况。可以看到,解码算法给出了正确的航空器ID、高度、速度和经纬度坐标。
定论
本系列文章展现了怎么运用根据模型的规划来完结SDR渠道从仿真到出产的全进程,这是其间的终究一篇。本系列阐明晰开发一个”硬件准备安排妥当”的ADS-B Simulink模型的一切阶段。 咱们规划了一个仿真模型来证明咱们可以解码记录到的ADS-B音讯,然后运用从SDR硬件渠道获取的实时数据验证该模型。这不只验证了该模型,并且验证了SDR渠道的模仿前端和数字接纳机信号链的设置。一起,它令咱们坚信该渠道已调整好,可用于接纳ADS-B信号。然后,咱们将该模型区分为不同的功用,以便在Zynq处理体系和可编程逻辑上运转,并优化了该模型以主动生成C和HDL代码。终究,咱们将C和HDL代码集成到SDR规划中,并运用实时商业空中交通数据验证了体系的功用。终究效果是一个规划流程——运用MathWorks建模和代码生成东西,并结合Zynq SDR渠道来创立全面有用的SDR体系。
示例体系阐明:比较于传统规划办法,根据模型的规划作业流程与ADI公司的集成RF捷变收发器可编程无线电硬件AD9361/AD9364 相结合,可以协助规划团队更快开宣布有用的无线电原型,本钱也更低。文中的原型是由笔者在相对较短的时刻内制作出来的,遇到的妨碍很少,运用了如下资源:
- 在MATLAB和Simulink中可以创立ADS-B接纳机模型,并生成可用的C和HDL源代码。
- HDL Workflow Advisor中的功用,它们使许多软硬件集成进程主动完结。
- libiio等库,协助完结其他集成进程以便布置SDR原型。
- MathWorks和ADI公司供给的产品协助和技术支撑。
ADS-B是一个相对简略的规范,为经过这种办法构建SDR原型供给了一个很好的测验事例。选用根据模型的规划和Zynq SDR渠道的工程师应当可以依照本系列文章所提出的作业流程,开宣布更杂乱、更强壮的QPSK、QAM和LTE SDR体系。