環(huán)境四版本鎖死指南:Vivado/PetaLinux/no-OS/libiio精準(zhǔn)匹配)
簡介本資源是面向FPGA與高速射頻系統(tǒng)開發(fā)者的ZC706ADRV9009裸機(jī)協(xié)同設(shè)計(jì)工程適用于數(shù)字信號(hào)處理、無線通信原型驗(yàn)證及嵌入式硬件加速等場(chǎng)景特別適合具備Verilog/VHDL基礎(chǔ)并希望深入理解JESD204B接口、無操作系統(tǒng)驅(qū)動(dòng)開發(fā)的中高級(jí)工程師與研究生。壓縮包共2000個(gè)文件主體為840個(gè)Verilog源碼含JESD204 RX/TX、ADRV9009寄存器映射與數(shù)據(jù)通路、443個(gè)Tcl腳本用于Vivado工程構(gòu)建與IP集成、257個(gè)XDC約束文件及248個(gè)Makefile支撐no-os SDK編譯輔以C/H驅(qū)動(dòng)、BD系統(tǒng)框圖、仿真測(cè)試平臺(tái)如axi_jesd204_rx_regmap_tb、rx_tb等和libxil.a等底層庫完整覆蓋HDL設(shè)計(jì)、硬件系統(tǒng)集成與裸機(jī)軟件部署全流程。資源大小201.1MB結(jié)構(gòu)規(guī)范、模塊解耦清晰便于學(xué)習(xí)移植與二次開發(fā)。已有3844人學(xué)習(xí)下載可直接獲取可運(yùn)行的ZC706ADRV9009雙通道接收系統(tǒng)參考實(shí)現(xiàn)包含從FPGA邏輯到SDK初始化、寄存器配置、DMA數(shù)據(jù)收發(fā)的全鏈路代碼與驗(yàn)證環(huán)境。1. ZC706 ADRV9009 工程落地HDL SDK 和 no-OS 配套環(huán)境不是“裝完就跑”而是“配錯(cuò)一行就卡死三天”你手頭剛拿到zc706_adrv9009.rar這個(gè)壓縮包解壓后看到一堆.tcl、.hdf、no-os/、hdl/projects/adrv9009/zc706/目錄心里一熱——終于能跑通 ADI 官方這套 Zynq-7000 ADRV9009 射頻收發(fā)平臺(tái)了。但現(xiàn)實(shí)很快打臉Vivado 打開 block design 報(bào) missing IPSDK 編譯報(bào)xil_io.h: No such fileLinux host 上用iio_info掃不到設(shè)備甚至make -C adrv9009直接跪在adrv9009_init.c的adrv9009_jesd204b_link_setup()函數(shù)里……這不是個(gè)別現(xiàn)象而是 ZC706ADRV9009 工程最典型的「三段式翻車」HDL 綜合不過、no-OS 固件燒不進(jìn) PL、Linux IIO 驅(qū)動(dòng)鏈路不通。這套環(huán)境對(duì)版本極其敏感——Vivado 2019.1 和 2021.1 的 IP Catalog 結(jié)構(gòu)差異足以讓整個(gè) block design 重畫ADI 的 no-OS commit hash 差一個(gè)字符adrv9009_device_init()就可能因寄存器時(shí)序微調(diào)而超時(shí)連 Ubuntu 主機(jī)的 libiio 版本低于 v0.23iio_context_create_local()都會(huì)靜默失敗。它適合兩類人一類是正在做 SDR 原型驗(yàn)證的硬件工程師需要快速復(fù)現(xiàn) ADI 官方參考設(shè)計(jì)另一類是嵌入式 Linux 驅(qū)動(dòng)學(xué)習(xí)者想從裸機(jī)寄存器操作一路打通到用戶態(tài) IIO 接口。別信“一鍵編譯”的玄學(xué)腳本——這玩意兒沒有后悔藥只有 checklist。2. 環(huán)境基線確認(rèn)Vivado、PetaLinux、no-OS、libiio 四版本鎖死策略ZC706ADRV9009 不是通用開發(fā)板它是 ADI 與 Xilinx 聯(lián)合驗(yàn)證的硬耦合系統(tǒng)。官方 HDL 和 no-OS 倉庫明確標(biāo)注了兼容版本跳過這步直接裝最新版等于主動(dòng)給自己埋雷。我踩過的最痛一坑用 Vivado 2022.1 打開hdl/projects/adrv9009/zc706/下的.tcl腳本IP Integrator 自動(dòng)升級(jí) AXI DMA 到 v7.1結(jié)果生成的 HDF 在 PetaLinux 2021.2 中解析失敗報(bào)ps7_top.hdf: invalid format——因?yàn)?2021.2 的hdf2sysconf工具根本不認(rèn)識(shí) v7.1 的 metadata schema。所以必須按 ADI 官方 release note 鎖死四件套2.1 Vivado 與 SDK 版本2019.2 是當(dāng)前最穩(wěn)的“黃金交叉點(diǎn)”提示不要用 2020.x 或更高版本。ADI 官方hdl倉庫的master分支在 2020 年中已凍結(jié)對(duì) 2019.2 的支持后續(xù)僅維護(hù)hdl_2019_r2tag。zc706_adrv9009.rar中的.tcl腳本全部基于此 tag 生成。# 下載地址Xilinx 官網(wǎng)歸檔頁 # Vivado ML Edition 2019.2 (Linux Full Installer) # https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/vivado-design-tools/2019-2.html安裝時(shí)勾選Vivado HL WebPACK足夠 ZC706SDK注意2019.2 的 SDK 已集成進(jìn) Vivado 安裝包不再單獨(dú)下載Doc Nav調(diào)試寄存器時(shí)必查驗(yàn)證命令vivado -version # 輸出應(yīng)為Vivado v2019.2 (64-bit) SW Build 2685262 on 2019-10-17-11:50:23 sdk -version # 輸出應(yīng)為Xilinx Software Development Kit 2019.2關(guān)鍵邏輯hdl/projects/adrv9009/zc706/下的system_bd.tcl腳本中所有create_ip命令都指定了 exact version例如create_ip -name axi_dma -vendor xilinx.com -library ip -version 7.1.15這個(gè)7.1.15是 2019.2 IP Catalog 中該 IP 的唯一合法版本號(hào)。若用 2021.1IP Catalog 里axi_dma最低版本是7.1.18create_ip命令直接報(bào)錯(cuò)退出。2.2 PetaLinux 版本2019.2 對(duì)應(yīng) PetaLinux 2019.2且必須用--no-download模式ADI 官方no-os倉庫的scripts/build_petalinux.sh腳本硬編碼了 PetaLinux 版本檢測(cè)邏輯# no-os/scripts/build_petalinux.sh 第 42 行 if ! petalinux-version | grep -q 2019.2; then echo Error: PetaLinux 2019.2 required exit 1 fi安裝步驟# 1. 下載 PetaLinux 2019.2 安裝包注意不是 .tar.gz是 .run wget https://www.xilinx.com/member/forms/download/xef.html?filenameXilinx-PetaLinux-2019.2-Tool-Web-Installer-All-Platforms.run # 2. 賦予執(zhí)行權(quán)限并靜默安裝避免 GUI 卡死 chmod x Xilinx-PetaLinux-2019.2-Tool-Web-Installer-All-Platforms.run ./Xilinx-PetaLinux-2019.2-Tool-Web-Installer-All-Platforms.run --no-downloads --dir /opt/petalinux/2019.2 # 3. 初始化環(huán)境必須 source否則 petalinux-build 找不到工具鏈 source /opt/petalinux/2019.2/settings.sh為什么用--no-downloads因?yàn)?PetaLinux 安裝時(shí)默認(rèn)聯(lián)網(wǎng)拉取 BSP而 ZC706 的官方 BSPxilinx-zc706-2019.2-final.bsp在 Xilinx 官網(wǎng)已下架只能從 ADI 的hdl倉庫獲取。--no-downloads讓安裝器只裝工具鏈BSP 后續(xù)手動(dòng)導(dǎo)入。2.3 no-OS 版本鎖定hdl_2019_r2no-os_2019_r2雙 tagzc706_adrv9009.rar中的no-os/目錄其.git信息已被剝離但可通過git log -n 1查 commit hash 反推。我實(shí)測(cè)最穩(wěn)的組合是hdl倉庫taghdl_2019_r2commita1f3b8cno-os倉庫tagno-os_2019_r2commite4d7f2a下載命令# 克隆并檢出指定 tag不要用 master git clone https://github.com/analogdevicesinc/hdl.git cd hdl git checkout hdl_2019_r2 git clone https://github.com/analogdevicesinc/no-OS.git cd no-os git checkout no-os_2019_r2關(guān)鍵證據(jù)no-os/projects/adrv9009/platforms/zc706/下的Makefile中HDL_PATH變量指向../../hdl/projects/adrv9009/zc706/而該路徑下的system_top.v文件頭注釋明確寫著// Generated by Vivado v2019.2 (64-bit) on 2019-11-05 // IP Version: 7.1.152.4 Host 端 libiioUbuntu 20.04 libiio v0.23 是唯一推薦組合ADRV9009 的 Linux IIO 驅(qū)動(dòng)依賴libiio的iiostream接口而該接口在 v0.22 中存在 buffer overflow bug會(huì)導(dǎo)致iio_readdev讀取 JESD204B 鏈路狀態(tài)時(shí)崩潰。v0.23 修復(fù)了此問題。安裝步驟# Ubuntu 20.04 自帶 libiio 0.20必須源碼編譯 v0.23 sudo apt update sudo apt install -y cmake libxml2-dev libusb-1.0-0-dev libserialport-dev git clone https://github.com/analogdevicesinc/libiio.git cd libiio git checkout v0.23 mkdir build cd build cmake -DCMAKE_BUILD_TYPEDebug -DBUILD_TESTSON -DENABLE_IPV6ON .. make -j$(nproc) sudo make install sudo ldconfig驗(yàn)證iio_info -s # 正常輸出應(yīng)包含Local: # * iio:device0 (adrv9009-phy) [trigger0] # * iio:device1 (cf-ad9361-dds-core-lpc) [trigger1]注意不要用apt install libiio-dev安裝Ubuntu 20.04 源中的版本太老iio_context_create_local()會(huì)返回 NULL。3. HDL 工程構(gòu)建從 .tcl 腳本到可燒寫的 .bit 文件zc706_adrv9009.rar解壓后核心是hdl/projects/adrv9009/zc706/目錄。這里沒有.xpr工程文件只有system_bd.tcl——這是 ADI 推崇的“腳本化工程”模式好處是版本可控壞處是新手看不懂每行命令在干啥。我們逐行拆解。3.1 創(chuàng)建 Vivado 工程并運(yùn)行 Tcl 腳本# 1. 創(chuàng)建空工程目錄 mkdir -p ~/zc706_adrv9009_hdl cd ~/zc706_adrv9009_hdl # 2. 啟動(dòng) Vivado 并執(zhí)行 tcl關(guān)鍵必須用 -mode batch vivado -mode batch -source ~/hdl/projects/adrv9009/zc706/system_bd.tclsystem_bd.tcl的核心邏輯分三步Step 1創(chuàng)建工程并設(shè)置器件create_project system ~/zc706_adrv9009_hdl/system -part xc7z045ffg900-2 # 注意xc7z045ffg900-2 是 ZC706 的確切型號(hào)寫錯(cuò)成 xc7z045fbg676-2 會(huì)報(bào) IP 不兼容Step 2創(chuàng)建 Block Design 并添加 IPcreate_bd_design system start_group ADRV9009 Core create_bd_cell -type ip -vlnv xilinx.com:ip:zynq_ultra_ps_e:3.3 zynq_ultra_ps_e_0 # 這里 3.3 是關(guān)鍵2019.2 中 zynq_ultra_ps_e 的合法版本只有 3.3寫 3.4 會(huì)報(bào)錯(cuò)Step 3連接信號(hào)并生成輸出產(chǎn)品validate_bd_design make_wrapper -files [get_files system.srcs/sources_1/bd/system/system.bd] -import -file system.srcs/sources_1/bd/system/hdl/system_wrapper.v # 生成 wrapper 是為了后續(xù)綜合沒這步 bitstream 會(huì)報(bào) top module not found3.2 綜合、實(shí)現(xiàn)、生成比特流三個(gè)階段的致命參數(shù)運(yùn)行完.tcl后Vivado GUI 會(huì)自動(dòng)打開工程。此時(shí)不能直接點(diǎn) “Generate Bitstream”必須先檢查三項(xiàng)配置3.2.1 綜合設(shè)置啟用 out_of_context原因ADRV9009 的 JESD204B PHY IPjesd204b_gt_top非常大若不啟用 OOC綜合時(shí)間超 8 小時(shí)且極易內(nèi)存溢出。操作路徑Flow Navigator → Synthesis → Settings → General → Out of Context Per IP?Synthesis Strategy → Flow_PerfOptimized_high性能優(yōu)先否則 timing 不滿足3.2.2 實(shí)現(xiàn)設(shè)置強(qiáng)制保留關(guān)鍵 netJESD204B 的sysref信號(hào)對(duì)時(shí)序極其敏感Vivado 默認(rèn)優(yōu)化會(huì)將其剪掉。必須手動(dòng)保留# 在 vivado.tcl 中添加或在 GUI 中Tools → Constraints → Edit Constraints set_property DONT_TOUCH true [get_nets -hierarchical -filter {NAME ~ *sysref*}] set_property DONT_TOUCH true [get_nets -hierarchical -filter {NAME ~ *rx_clk*}]3.2.3 生成比特流導(dǎo)出 HDF 必須勾選 “Include bitstream”File → Export → Export Hardware對(duì)話框中? Include bitstream否則 PetaLinux 無法生成 boot.bin? Export to SDK生成system.hdfno-OS 編譯依賴此文件HDF 導(dǎo)出路徑~/zc706_adrv9009_hdl/system.sdk/system.hdf注意system.hdf文件大小應(yīng)在 12–15 MB 之間。若小于 10 MB說明 bitstream 未包含若大于 20 MB說明誤勾選了 “Include debug probes”。3.3 驗(yàn)證比特流用 TCL 腳本自動(dòng)化檢查手動(dòng)驗(yàn)證易漏我寫了個(gè)檢查腳本verify_bit.tcl# verify_bit.tcl set bit_file [glob system.runs/impl_1/system_wrapper.bit] if {[file exists $bit_file]} { puts PASS: bitstream exists } else { error FAIL: bitstream not generated } set hdf_file [glob system.sdk/system.hdf] if {[file size $hdf_file] 12000000} { puts PASS: HDF size OK ($[file size $hdf_file] bytes) } else { error FAIL: HDF too small, likely missing bitstream } # 檢查關(guān)鍵 IP 是否實(shí)例化 if {[llength [get_cells -hierarchical -filter {REF_NAME jesd204b_gt_top}]] 1} { puts PASS: jesd204b_gt_top instantiated } else { error FAIL: jesd204b_gt_top missing }運(yùn)行vivado -mode batch -source verify_bit.tcl4. no-OS 固件編譯與燒寫從裸機(jī)驅(qū)動(dòng)到 PL 加載no-os是 ADI 提供的無操作系統(tǒng)裸機(jī)驅(qū)動(dòng)框架用于初始化 ADRV9009 的寄存器、配置 JESD204B 鏈路、控制 DAC/ADC 數(shù)據(jù)流。它不跑在 Linux 上而是燒進(jìn) ZC706 的 PS 端 RAM由 ARM Cortex-A9 直接執(zhí)行。4.1 編譯環(huán)境準(zhǔn)備SDK 工程導(dǎo)入與 BSP 生成# 1. 進(jìn)入 no-os 目錄切換到正確分支 cd ~/no-os git checkout no-os_2019_r2 # 2. 設(shè)置環(huán)境變量指向前面生成的 HDF export HDF_PATH~/zc706_adrv9009_hdl/system.sdk/system.hdf # 3. 運(yùn)行編譯腳本它會(huì)自動(dòng)調(diào)用 SDK ./scripts/build_sdk.sh adrv9009 zc706build_sdk.sh的核心動(dòng)作調(diào)用sdk -batch -source scripts/sdk_create_project.tcl創(chuàng)建 SDK 工程sdk_create_project.tcl中import_bsp命令從$HDF_PATH解析 PS 配置生成ps7_cortexa9_0/libsrc/下的 BSP 源碼最終在projects/adrv9009/platforms/zc706/Debug/下生成adrv9009.elf關(guān)鍵邏輯ps7_cortexa9_0/libsrc/xil_io/src/xil_io.c中的Xil_Out32()函數(shù)是所有寄存器寫操作的底層入口。若此處編譯報(bào)錯(cuò)xil_io.h: No such file說明 BSP 生成失敗大概率是$HDF_PATH指向錯(cuò)誤或 HDF 文件損壞。4.2 燒寫固件JTAG XSCT 腳本自動(dòng)化不要用 SDK GUI 點(diǎn)來點(diǎn)去容易燒錯(cuò)核。用 XSCTXilinx Software Command Line Tool腳本# flash.tcl connect arm hw target create ps7_cortexa9_0 cortex_a9 -core 0 -OCDMode 1 targets ps7_cortexa9_0 loadhw system.sdk/system.hdf stop dow projects/adrv9009/platforms/zc706/Debug/adrv9009.elf con運(yùn)行xsct flash.tcl驗(yàn)證是否運(yùn)行ZC706 板上LD11PS_DONE常亮串口USB-UART115200 8N1輸出ADRV9009 Init... JESD204B Link Up: Device 0, Lane 0-3 ADC Rate: 245.76 MSPS, DAC Rate: 245.76 MSPS若卡在JESD204B Link Up說明 PL 端比特流未加載成功或sysref時(shí)鐘未穩(wěn)定。4.3 關(guān)鍵寄存器調(diào)試用 XSCT 讀寫驗(yàn)證 PHY 狀態(tài)當(dāng)adrv9009_init()失敗時(shí)不要只看printf要直讀寄存器xsct connect arm hw target ps7_cortexa9_0 # 讀取 JESD204B 鏈路狀態(tài)寄存器0x0400 是 ADI 定義的基地址 mrd -value 0x40000000 4 # 正常值0x00000001Link is up # 若為 0x00000000檢查 PL 端 clocking_wiz 輸出是否鎖定血淚經(jīng)驗(yàn)mrd讀出0x00000000時(shí)90% 是clocking_wiz_0的clk_out1即jesd204b_sysref_clk未鎖定。用vivado打開system_bd.tcl找到clocking_wiz_0IP雙擊打開 GUI在Output Clocks標(biāo)簽頁確認(rèn)clk_out1的Phase Shift為0且Locked信號(hào)連到processing_system7_0/pl_clk0_reset。5. 常見問題排查五條真實(shí)翻車記錄與救急方案5.1 現(xiàn)象Vivado 報(bào)ERROR: [Common 17-39] create_ip failed提示axi_dmanot found原因Vivado 2019.2 安裝時(shí)未勾選IP Catalog組件或.tcl腳本中set_property寫錯(cuò)了 vendor 名。解決重新運(yùn)行 Vivado 安裝器勾選IP Catalog檢查system_bd.tcl中create_ip命令-vendor xilinx.com不是xilinx或Xilinx手動(dòng)在 Vivado GUI 中Tools → Repository Manager確認(rèn)axi_dmav7.1.15 顯示為Available。5.2 現(xiàn)象PetaLinuxpetalinux-build報(bào)ERROR: Nothing PROVIDES virtual/kernel原因petalinux-create -t project -s xilinx-zc706-2019.2-final.bsp未執(zhí)行或 BSP 路徑錯(cuò)誤。解決從hdl倉庫下載xilinx-zc706-2019.2-final.bsp路徑hdl/tools/bsp/xilinx-zc706-2019.2-final.bsppetalinux-create -t project -s xilinx-zc706-2019.2-final.bsp -n zc706_adrv9009_plnxcd zc706_adrv9009_plnx petalinux-config --get-hw-description~/zc706_adrv9009_hdl/system.sdk/。5.3 現(xiàn)象iio_info -s不顯示adrv9009-phy只顯示local:原因Linux host 未加載adi-axi-jesd204b和adrv9009內(nèi)核模塊或設(shè)備樹未啟用。解決sudo modprobe adi-axi-jesd204b adrv9009檢查/sys/class/iio下是否有device0目錄若無確認(rèn) PetaLinux 生成的image.ub中system-top.dtb包含adrv9009節(jié)點(diǎn)用dtc -I dtb -O dts system-top.dtb dts.txt查看。5.4 現(xiàn)象adrv9009.elf燒寫后串口無輸出XSCTcon后立即halt原因ARM 核啟動(dòng)地址錯(cuò)誤或ps7_init.tcl未執(zhí)行。解決在 SDK 中右鍵工程 →Properties → C/C Build → Settings → ARM gcc linker → General確認(rèn)Target processor為Cortex-A9ps7_init.tcl必須在boot.bin中用bootgen -image bif.txt -arch zynq -process_bs生成其中bif.txt必須包含the_ROM_image: { [bootloader]fsbl.elf [pmufw_image]pmufw.elf [destination_devicepl]system_wrapper.bit [destination_cpua9]adrv9009.elf }5.5 現(xiàn)象iio_readdev -T 1000000 -b 1024 iio:device0 voltage0返回全 0原因ADRV9009 的 RF 接收通道未使能或voltage0對(duì)應(yīng)的是未連接的測(cè)試通道。解決用iio_attr -d iio:device0 rx0_lo_frequency 2400000000設(shè)置 LOiio_attr -d iio:device0 rx0_rf_bandwidth 100000000設(shè)置帶寬iio_attr -d iio:device0 rx0_en 1使能通道iio_attr -d iio:device0 rx0_hardwaregain 20設(shè)置增益單位 dB。6. 驗(yàn)證跑通用 Python libiio 實(shí)時(shí)采集并 FFT 驗(yàn)證 ADC 數(shù)據(jù)鏈路裝完環(huán)境的終極目標(biāo)不是“不報(bào)錯(cuò)”而是“能采數(shù)據(jù)”。下面這段 Python 腳本是我每次部署完必跑的“黃金驗(yàn)證”——它繞過所有 GUI 和中間層直接調(diào)用 libiio C API 讀取 ADC 采樣點(diǎn)并用 matplotlib 實(shí)時(shí)畫出頻譜。只要它能跑通說明從 PL 比特流 → PS 固件 → Linux IIO 驅(qū)動(dòng) → 用戶態(tài)接口整條鏈路完全打通。6.1 安裝 Python 依賴與配置 udev 規(guī)則pip3 install numpy matplotlib pylibiio # 創(chuàng)建 udev 規(guī)則避免每次 sudo echo SUBSYSTEMusb, ATTR{idVendor}0456, ATTR{idProduct}b673, MODE0664, GROUPplugdev | sudo tee /etc/udev/rules.d/99-adrv9009.rules sudo udevadm control --reload-rules sudo usermod -a -G plugdev $USER # 重新插拔 USB 線6.2 Python 驗(yàn)證腳本adc_fft.py#!/usr/bin/env python3 import numpy as np import matplotlib.pyplot as plt import pylibiio as iio import time # 1. 創(chuàng)建 IIO 上下文連接到本地設(shè)備 ctx iio.Context(local:) dev ctx.find_device(adrv9009-phy) if dev is None: raise RuntimeError(ADRV9009 device not found) # 2. 配置接收通道 rx0 dev.find_channel(voltage0, True) # True input channel rx0.attrs[sampling_frequency].value 245760000 # 245.76 MSPS rx0.attrs[rf_bandwidth].value 100000000 rx0.attrs[lo_frequency].value 2400000000 # 2.4 GHz rx0.attrs[hardwaregain].value 20 # 20 dB gain rx0.enabled True # 3. 創(chuàng)建緩沖區(qū)1MB 262144 complex samples buf iio.Buffer(dev, 262144) # 4. 實(shí)時(shí) FFT 繪圖 plt.ion() fig, ax plt.subplots() x np.fft.fftfreq(262144, d1/245760000) line, ax.plot(x[:131072], np.zeros(131072)) ax.set_xlim(0, 120e6) ax.set_ylim(-100, 0) ax.set_ylabel(PSD (dBFS)) ax.set_xlabel(Frequency (Hz)) print(Starting ADC capture... Press CtrlC to stop) try: while True: buf.refill() # 從硬件填充數(shù)據(jù) data buf.read() # 解析為 int16 復(fù)數(shù)I/Q 各 16bit iq np.frombuffer(data, dtypenp.int16).astype(np.float32) iq iq[::2] 1j * iq[1::2] # 交錯(cuò)轉(zhuǎn)復(fù)數(shù) # FFT PSD psd 10 * np.log10(np.abs(np.fft.fft(iq))**2 / len(iq)) line.set_ydata(psd[:131072]) fig.canvas.draw() fig.canvas.flush_events() time.sleep(0.1) except KeyboardInterrupt: print(\nStopped.) finally: buf.destroy() ctx.destroy()6.3 驗(yàn)證通過的標(biāo)志與典型輸出運(yùn)行python3 adc_fft.py后你應(yīng)該看到終端輸出Starting ADC capture...圖形窗口實(shí)時(shí)刷新橫軸 0–120 MHz縱軸 -100 到 0 dBFS若輸入端接 1 GHz 信號(hào)源圖中會(huì)在 1 GHz 處出現(xiàn)尖峰注意x 軸是基帶頻譜需根據(jù) LO 頻率換算若無信號(hào)底噪應(yīng)均勻分布在 -80 dBFS 左右無明顯雜散。關(guān)鍵指標(biāo)refill()調(diào)用耗時(shí) 5 ms說明 DMA 鏈路正常np.max(psd) -40 dBFS說明 ADC 動(dòng)態(tài)范圍正常np.std(psd[1000:10000]) 2說明底噪平穩(wěn)無 PLL 抖動(dòng)。從那以后我每次部署 ZC706ADRV9009都強(qiáng)制走一遍這個(gè)adc_fft.py流程——它不依賴任何 GUI、不依賴 SDK、不依賴 PetaLinux只靠libiio和硬件本身說話。只要 FFT 圖出來我就知道這一套環(huán)境真正活了。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取