作者:Mike Donovan, Andrei Cozma, and Di Pu
本系列文章的前幾部分介紹了 Zynq SDR 快速原型制作平臺,1介紹了使用 MATLAB 和 Simulink 開發可以成功處理和解碼 ADS-B 傳輸的算法的步驟,2并展示了如何在仿真和從SDR平臺獲取的實時數據中驗證算法。3所有階段的最終目標是創建一個經過驗證的模型,該模型可以轉換為 C 和 HDL 代碼,并準備好集成到 SDR 平臺的軟件和硬件基礎設施中。
本系列第 2 部分中討論的 Simulink 模型(“使用 MATLAB 和 Simulink 進行模式 S 檢測和解碼”)")2是一個仿真模型,具有足夠的硬件特定保真度,以驗證設計是否能夠成功解碼 ADS-B 消息。以該模型為起點,將討論在 Zynq SDR 快速原型平臺上運行的工作接收器設計所需的最后步驟。與本系列前面的文章一樣,開發此工作設計所需的技能包括:熟練掌握 MATLAB 和 Simulink、Zynq 無線電硬件知識以及軟件/硬件集成技能。
本文中要遵循的步驟包括:
將 Simulink 模型劃分為面向 Zynq SoC 上的 FPGA 結構和 ARM 處理系統的函數。
對 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 模型的讀者可以在 ADI GitHub 存儲庫中找到這些文件。4
從 Simulink 模型生成 HDL 代碼
模式S解碼器模型中的檢測器模塊(圖2)由幾個子系統組成:CalcSyncCorr,CalcNF,SyncAndControl,BitProcess,CalcCRC和FameDetect。來自MathWorks的HDL編碼器5用于生成此設計的源代碼 HDL 代碼。
圖2.用于生成 HDL 代碼的檢測器塊。
Simulink 模型必須滿足多個條件才能使用 HDL 編碼器成功生成 HDL 代碼。一些最重要的要求是:
使用支持 HDL 代碼生成的塊。HDL Coder 支持大約 200 個 Simulink 模塊的代碼生成。6在檢測器設計中,所有模塊(包括狀態流圖和數字濾波器模塊)都支持HDL代碼生成。
使用定點數據類型。在檢測器設計中,信號使用 12 位、24 位和布爾數據類型。12位數據類型與ADI公司AD9361收發器上模數轉換器的位寬相匹配。
使用標量或矢量信號。矢量信號可用于多通道信號或資源共享。
避免模型中的代數循環。HDL 編碼器軟件不支持為存在代數循環條件的模型生成 HDL 代碼。
ModeS_Simulink_Decode.slx模型不滿足所有這些條件,因此CalcCRC塊中將接收位與計算的校驗和進行比較的部分被移到了檢測器塊之外,并最終在C中實現。生成的模型 ModeS_ADI_CodeGen.slx 用于生成 HDL 代碼。與手動編碼過程相比,只需幾分鐘即可生成數千行 HDL 代碼。HDL Coder 生成的源代碼有點真實,循環準確的 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 Coder 中的內置分析工具顯示,模型中的關鍵路徑從 I/Q 樣本輸入擴展到 CalcCRC 子系統中的第一個寄存器。在設計中插入流水線寄存器是提高時鐘速度的一種常用方法(圖 4)。流水線縮短了信號操作之間的路徑,但代價是增加了整個處理的延遲。這種權衡通常是可以接受的,因為對于更高的時鐘速率來說,輕微的延遲通常是很小的代價。
圖4.管道寄存器插入到探測器設計中。
子系統之間的流水線寄存器有助于提高設計的時鐘速率,但通過為數字濾波器模塊做出有利的架構選擇,可以實現更好的時鐘速率。許多 Simulink 模塊都有架構選擇,使設計人員能夠針對速度或面積優化設計。對于用于計算本底噪聲和前導碼相關性的數字濾波器(圖5),對輸出乘法器進行流水線處理可以縮短數字濾波器內的關鍵路徑并提高設計時鐘速率。
圖5.數字濾波器模塊的 HDL 模塊選擇。
在進行這兩個簡單的流水線更改后,生成的HDL代碼的時鐘速率超過了140 MHz。對于使用代碼生成工具的工程師來說,這是一個有用的教訓:將硬件設計原理的一點知識應用于代碼生成模型可以對生成的代碼的結果產生重大影響。進一步優化此設計是可能的,但被認為是不必要的,因為HDL代碼很容易滿足該設計相對簡單的時序和資源目標。
在傳統的無線電設計過程中,大部分開發時間都花在測試和調試HDL代碼上。在本示例中使用的基于模型的設計方法中,將更多時間花在開發仿真和代碼生成模型上。但是,由于生成的源代碼與仿真的驗證行為完全匹配,因此大大節省了開發時間;只需在嵌入式硬件上執行最少量的調試。
使用 MATLAB 編碼器生成 C 代碼7
與 HDL 代碼生成類似,必須滿足幾個條件才能為本設計的解碼功能生成 C 代碼。兩個最重要的要求是:
使用 MATLAB Coder 支持的函數。MATLAB Coder 支持大多數 MATLAB 語言和各種工具箱,8但您可能會在不知不覺中使用代碼生成不支持的函數。MATLAB Coder 提供了一些工具,例如代碼準備工具、9以幫助查找任何不受支持的函數。
確保聲明 MATLAB 變量后,其大小和類型不會更改。這對于確保在生成的代碼中正確進行內存分配是必需的。
從 MATLAB 生成 C 代碼的最簡單方法是打開一個新的 MATLAB Coder 項目,可以從 MATLAB Toolstrip 上的“應用程序”選項卡訪問該項目。MATLAB Coder 項目的最終輸出如圖 6 所示。
圖6.用于 DecodeBits_ADI.m 的 MATLAB Coder 項目
在本項目中,頂級MATLAB函數為DecodeBits_ ADI.m。用戶需要指定此函數所需的數據類型和大小作為輸入參數。圖 6 顯示此函數的輸入參數是 112 個布爾數據位和兩個雙精度值(以提供用戶當前的緯度和經度)。DecodeBits_ADI.m 的輸出大小和數據類型(例如 *nV 表示北速度,*eV 表示東速度,*alt 表示高度)由 MATLAB Coder 自動確定。MATLAB Coder 查找頂級入口點文件 DecodeBits_ADI.m 調用的所有其他函數,包括 AltVelCalc_ADI.m 和 LatLongCalc_ADI.m,然后生成整個解碼算法的源代碼。
由 MATLAB Coder 生成的 C 代碼是 MATLAB 功能到 C 語言的相當簡單的翻譯。與HDL代碼生成的情況一樣,MATLAB Coder生成的源代碼是可讀和可追溯的,因此工程師可以輕松識別原始MATLAB代碼和生成的C代碼之間的關系。此示例中的 C 代碼可以從 MATLAB 命令提示符生成,并由任何 ANSI C 編譯器編譯。
HDL 代碼平臺部署
在將設計劃分為將在 Zynq 可編程邏輯和處理系統上運行的功能,優化 HDL 和 C 代碼生成的設計,并在仿真中驗證優化的設計是否正常運行并符合性能標準后,現在可以將設計部署到實際的 SDR 硬件平臺上,并在實際條件下驗證系統的功能。為此,ADI公司AD-FMCOMMS3-EBZ SDR平臺10連接到賽靈思 ZC706 開發板11使用運行ADI公司的Linux發行版。
AD-FMCOMMS3-EBZ板隨附ADI公司提供的開源Vivado HDL參考設計。12該參考設計包含配置和傳輸數據所需的所有IP模塊,這些數據與AD-FMCOMMS3-EBZ板上的AD9361收發器之間傳輸數據。圖 7 顯示了 HDL 參考設計的框圖。
圖7.HDL 參考設計框圖。
AD9361 IP內核在AD9361收發器芯片和Zynq器件之間實現LVDS接收和發送數據接口,以及與設計其余部分的數據接口。DMA模塊用于AD9361 IP和DDR存儲器之間的高速數據傳輸。AD9361 IP模塊的數據接口由四條用于接收的數據線和四條用于發送的數據線組成,對應于AD9361的兩個接收通道和兩個發送通道的I&Q數據。每條數據線的寬度為 16 位。為了使系統內部的數據傳輸更加高效,接收和發送數據被打包到由DMA模塊管理的64位寬總線中。封裝和解包模塊用于將AD9361 IP的16位并行數據線連接到DMA。
將 ADS-B 模型的 HDL 代碼部署到 SDR 平臺的現有 HDL 基礎設施中需要創建一個可以插入數據路徑的 IP 核;這樣做是為了實時處理接收到的數據并將處理后的數據傳遞給軟件層。部署過程可能被證明是一項困難且耗時的任務,因為它需要深入了解 HDL 設計的功能以及足夠的 HDL 編程技能。為了簡化這些步驟,MathWorks 在 HDL Coder 中加入了一個名為 HDL Workflow Advisor 的實用程序,ADI 公司為 AD-FMCOMMS2-EBZ/AD-FMCOMMS3-EBZ SDR 平臺和 Xilinx ZC706 板提供了板級支持包 (BSP)。13
HDL 工作流顧問可指導用戶完成從 Simulink 模型生成 HDL 代碼所需的步驟。用戶可以從幾種不同的目標工作流程中進行選擇,包括“ASIC/FPGA”、“FPGA-IN-THE-LOOP”和“IP 核生成”。目標平臺選擇包括 Xilinx 評估板、Altera 評估板或 FMCOMMS2/3 ZC706 SDR 平臺。然后,HDL 工作流顧問可以自動執行代碼生成和目標集成過程的其余部分。
ADI公司提供的BSP是電路板定義和參考設計的集合14為 HDL 工作流顧問提供生成與現有 HDL 參考設計兼容的 IP 模塊所需的信息和工具,并將生成的 IP 插入到 HDL 參考設計中。圖 8 顯示了如何配置工作流顧問程序以生成 ADS-B 模型的 IP 核。請注意,必須選擇面向ADI公司AD-FMCOMMS3-EBZ SDR平臺和Xilinx ZC706板的IP核生成工作流程。
圖8.工作流顧問程序配置。
下一步是配置 IP 和參考設計之間的接口。在輸入端,模型接受原始I&Q樣本;這將模型的輸入端口直接連接到AD9361接收器數據端口。在模型的所有輸出信號中,此階段唯一感興趣的是數據、frame_valid和bit_clk信號。數據和frame_valid寬度為16位,由bit_clk信號計時。這些信號可以連接到BSP的“DUT Data x Out”接口,這意味著它們將直接訪問DMA模塊;然后可以將數據傳輸到DDR,軟件層可以訪問DDR。bit_clk信號連接到“DUT 數據有效輸出”BSP 接口并控制 DMA 采樣速率。圖 9 顯示了必須如何配置 HDL 接口。
圖9.HDL 接口配置。
定義目標接口后,HDL 工作流顧問程序的步驟 2 和步驟 3 可以保留為其默認狀態,并且可以通過運行步驟 4.1(創建項目)來啟動項目生成過程。這一步驟的結果是一個Vivado項目,該項目將ADS-B IP內核集成到ADI公司的HDL參考設計中。圖10顯示了ADS-B IP核與設計中其余模塊之間的連接。
圖 10.HDL 參考設計中的 ADS-B IP 連接。
從 Vivado 項目生成比特流結束了 HDL 集成過程,但最終目標是讓 Linux 在系統上運行。為此,在生成比特流后,可以按照標準的 Xilinx SDK 第一階段引導加載程序 (fsbl) 和 Linux 引導文件創建流程創建 Linux 引導文件。與新創建的HDL設計相對應的Linux設備樹和圖像文件與AD-FMCOMMS3-EBZ BSP一起分發。所有文件必須與 SD 卡引導分區上的 Linux 引導文件一起復制;用于在賽靈思 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 - 快速攻擊模式
除上述參數外,AD9361還加載了一個數據速率為12.5 MSPS、通帶頻率為3.25 MHz、阻帶頻率為4 MHz的數字FIR濾波器,以確保接收的數據僅包含目標頻段。本系列文章的第3部分介紹了該FIR濾波器的系統參數和設計方法。3
ADS-B IP 的輸出數據通過 DMA 塊傳輸到系統的 DDR 內存中。libiio庫提供以下功能:將從ADS-B IP獲取的數據放置到指定大小的內存緩沖區中;等待緩沖區被填充;通過指針訪問緩沖區。緩沖區填滿后,ADS-B 解碼算法可以處理數據。ADS-B IP 核有兩個輸出通道:一個通道對應于 ADS-B 比特流,另一個通道指示有效數據幀在比特流中的結束位置。兩個通道包含相同的數據速率,并且彼此同步。有效通道中等于“1”的樣本表示數據通道中有效幀的最后一位。通過解析兩個通道,軟件可以從比特流中提取有效的ADS-B數據幀,并將數據傳遞給MATLAB Coder生成的解碼函數。解碼功能在計算飛機坐標時,使用ADS-B數據幀和當前位置的經緯度作為輸入。當前緯度和經度被指定為應用程序的參數。解碼后的 ADS-B 數據的顯示方式與 Simulink 模型類似。
ADS-B 數據解碼應用程序是在 Linux 下使用 makefile 構建的。該應用程序的源代碼和生成文件可在ADI公司的github存儲庫中找到。16
這樣就完成了使用 MathWorks 的 HDL Coder 和 MATLAB Coder 從 ADS-B 模型生成的 HDL 和 C 代碼的平臺部署步驟。下一步是驗證系統的功能并評估結果。
系統驗證
要驗證系統的功能,首先在AD-FMCOMMS3-EBZ板的一個接收端口和一個發射端口之間創建一個環回連接,并傳輸仿真期間使用的相同ADS-B信號。通過接收和解碼這些數據,可以驗證在SDR平臺上運行的算法的輸出是否與仿真結果相匹配。圖 11 顯示了 ADS-B 數據解碼應用程序的輸出;結果與使用預捕獲數據的HIL仿真系列文章第3部分中所示的結果相同。這提供了系統按預期運行并準備好與實際數據一起使用的信心。
圖 11.環回結果。
在實際的現場測試中,SDR接收器被放置在馬薩諸塞州內蒂克的MathWorks總部外,并與系統解碼的ADS-B信息與飛機實時跟蹤網站(如 flightradar24.com)提供的數據進行比較。據觀察,該系統能夠解碼從天線視線內的飛機接收的數據。圖12顯示了系統檢測到的飛機信息與在線飛機跟蹤數據之間的比較;解碼算法顯示正確的飛機 ID、高度、速度和緯度/經度坐標。
數字。12 實時數據結果。
結論
本文總結了由四部分組成的系列文章,展示了如何使用基于模型的設計將 SDR 系統從仿真一直帶到生產。該系列介紹了開發“硬件就緒”ADS-B Simulink 模型的所有階段。我們設計了一個仿真模型來證明我們可以解碼記錄的ADS-B消息,然后使用從SDR硬件平臺獲取的實時數據驗證模型。這不僅驗證了模型,還驗證了SDR平臺對模擬前端和數字接收器鏈的設置;這也讓我們有信心,該平臺已針對接收 ADS-B 信號進行了適當調整。之后,我們將模型劃分為在 Zynq 處理系統和可編程邏輯上運行的功能,并優化模型以自動生成 C 和 HDL 代碼。最后,我們將 C 和 HDL 代碼集成到 SDR 設計中,并通過實時商業空中交通驗證了系統的功能。最終結果是一個設計過程,該過程使用 MathWorks 的建模和代碼生成工具以及 Zynq SDR 平臺來創建功能齊全的 SDR 系統。
本示例系統表明,與傳統設計方法相比,基于模型的設計工作流程與ADI公司AD9361/AD9364集成RF捷變收發器?可編程無線電硬件相結合,可以幫助設計團隊更快、更便宜地開發工作無線電原型。這個原型是由作者在相對較短的時間內以最小的障礙構建的,并利用了以下資源:
能夠在 MATLAB 和 Simulink 中構建 ADS-B 接收器模型,該模型可以生成可用的 C 和 HDL 源代碼。
HDL 工作流顧問中的功能,可自動執行許多硬件/軟件集成步驟。
庫(如 libiio),用于協助部署 SDR 原型的其余集成步驟。
MathWorks 和 ADI 提供的產品幫助和技術支持。
ADS-B 是一個相對簡單的標準,它提供了一個很好的測試用例來演示這種構建 SDR 原型的方法。采用基于模型的設計和 Zynq SDR 平臺的工程師應該能夠按照本系列文章中介紹的工作流程開發更復雜、更強大的基于 QPSK、QAM 和 LTE 的 SDR 系統。
審核編輯:郭婷
-
編碼器
+關注
關注
45文章
3638瀏覽量
134426 -
接收器
+關注
關注
14文章
2468瀏覽量
71873 -
Simulink
+關注
關注
22文章
533瀏覽量
62380
發布評論請先 登錄
相關推薦
評論