器系統(tǒng)開發(fā):從參數(shù)設(shè)計(jì)到FPGA原型的關(guān)鍵實(shí)踐)
簡(jiǎn)介基于IEEE 802.22無線區(qū)域網(wǎng)標(biāo)準(zhǔn)的正交頻分復(fù)用收發(fā)器完整實(shí)現(xiàn)適合通信工程方向?qū)W習(xí)者與FPGA開發(fā)者使用旨在幫助理解OFDM發(fā)射機(jī)與接收機(jī)的硬件架構(gòu)及仿真驗(yàn)證方法。壓縮包內(nèi)共75個(gè)文件包括46個(gè)Verilog源碼及測(cè)試臺(tái)文件、14個(gè)MATLAB仿真腳本、7個(gè)Xilinx ISE的IP核配置文件、7個(gè)標(biāo)準(zhǔn)預(yù)定義的系數(shù)文本和1個(gè)說明文檔整體大小僅為654KB按發(fā)射和接收兩側(cè)分別組織源碼、IP核與黃金模型目錄便于對(duì)照學(xué)習(xí)。目前已有142人瀏覽學(xué)習(xí)。借助這套工程讀者可以直觀看到OFDM發(fā)射鏈路與接收鏈路的頂層模塊劃分、子模塊連接方式、測(cè)試臺(tái)激勵(lì)構(gòu)造方法以及如何通過MATLAB腳本生成測(cè)試向量并驗(yàn)證Verilog輸出還能參考IP核的配置參數(shù)與系數(shù)文本理解標(biāo)準(zhǔn)中的前導(dǎo)序列等細(xì)節(jié)是一份小而完整的硬件實(shí)現(xiàn)學(xué)習(xí)素材。 第一次翻 IEEE 802.22 的 PHY 文檔我一度以為自己在看一份“OFDM 老婆餅配方”頁數(shù)很厚關(guān)鍵參數(shù)散落各處但核心就一句話——這是一個(gè)工作在電視頻段的 OFDM 收發(fā)器系統(tǒng)。當(dāng)時(shí)我們手里有現(xiàn)成的 LTE 和 Wi-Fi 收發(fā)鏈路卻沒法直接搬過來用原因很現(xiàn)實(shí)802.22 的覆蓋半徑、頻譜認(rèn)知機(jī)制以及低頻段的長(zhǎng)多徑環(huán)境逼著你把每一級(jí)模塊都重新審一遍。這篇文章就拿我實(shí)際做過的 OFDM 收發(fā)器系統(tǒng)開發(fā)經(jīng)歷說事從物理層參數(shù)設(shè)計(jì)、鏈路模塊劃分到仿真驗(yàn)證和硬件原型踩坑盡量把可以復(fù)用的經(jīng)驗(yàn)和必須繞開的彎子都寫清楚。1. 為什么 IEEE 802.22 偏偏選中 OFDM先啃“硬需求”1.1 一個(gè)反向操作的“廣域網(wǎng)”目標(biāo)低頻段、大覆蓋802.22 的目標(biāo)不是做室內(nèi)部署而是面向無線區(qū)域網(wǎng)WRAN。典型的場(chǎng)景是地廣人稀的鄉(xiāng)村、山區(qū)或者應(yīng)急通信覆蓋一個(gè)基站覆蓋半徑可以做到幾十公里。要做大覆蓋工作頻段必須往下走所以它選用了 54–862 MHz 的電視頻段。這個(gè)頻段的路徑損耗低、繞射能力強(qiáng)信號(hào)能翻過小山坡、穿過樹叢覆蓋能力比 2.4G 和 5G 頻段好一個(gè)量級(jí)。但低頻段不等于低難度它帶來的多徑問題相當(dāng)頭疼。遠(yuǎn)處的山體、建筑物、甚至拖拉機(jī)拖著的金屬車廂都可能形成大延遲的反射。時(shí)延擴(kuò)展經(jīng)常到幾十微秒單載波方案要在接收端做極高階的均衡器才能壓住符號(hào)間干擾復(fù)雜度完全不可接受。OFDM 的優(yōu)勢(shì)在這里特別明顯給符號(hào)加上循環(huán)前綴CP把多徑信道近似成每個(gè)子載波上的復(fù)數(shù)增益接收端只要用一個(gè)簡(jiǎn)單頻域均衡器就能解出來。這也是我最早理解 802.22 時(shí)最核心的一個(gè)判斷——它選 OFDM 不是因?yàn)椤按蠹叶加谩倍且驗(yàn)檫@種信道條件下OFDM 的工程復(fù)雜度最可控。1.2 認(rèn)知無線電對(duì)“頻譜碎片”的適應(yīng)能力802.22 還有一個(gè)標(biāo)簽認(rèn)知無線電。它本質(zhì)上要?jiǎng)討B(tài)使用電視頻段中暫時(shí)空閑的資源這意味著收發(fā)器必須能邊感知邊通信在檢測(cè)到主用戶信號(hào)時(shí)快速騰出頻段。OFDM 在這種場(chǎng)景下有一個(gè)天然優(yōu)勢(shì)頻譜可以按子載波粒度切分。舉個(gè)例子如果感知模塊發(fā)現(xiàn)某個(gè) 6MHz 信道里的中心位置有一路模擬電視信號(hào)系統(tǒng)不需要放棄整個(gè)信道只需要在發(fā)射前把對(duì)應(yīng)頻段的子載波置零形成頻譜“陷波”。接收端同樣可以通過子載波掩碼忽略這些位置。這個(gè)操作在單載波系統(tǒng)里非常難做要么整段避開要么用復(fù)雜的自適應(yīng)濾波器去陷波而在 OFDM 系統(tǒng)里IFFT 之前把若干子載波打零就行。可以說OFDM 不僅解決了多徑問題還順手解決了認(rèn)知無線電最核心的“動(dòng)態(tài)頻譜碎片利用”問題。1.3 標(biāo)準(zhǔn)參數(shù)表背后的工程含義做收發(fā)器系統(tǒng)第一步一定是把標(biāo)準(zhǔn)參數(shù)表變成自己的設(shè)計(jì)表格。802.22 的物理層在不同信道帶寬下支持多種 FFT 點(diǎn)數(shù)我一般會(huì)先列一張簡(jiǎn)表參數(shù)項(xiàng)典型值/選擇范圍對(duì)收發(fā)器的影響信道帶寬6 / 7 / 8 MHz決定采樣率和模擬前端濾波器帶寬FFT 點(diǎn)數(shù)2048 / 1024 / 512 / 256點(diǎn)數(shù)越大子載波間隔越小抗多徑越好但對(duì)同步越敏感子載波間隔約 3.3 kHz6 MHz 帶寬 2048 點(diǎn)頻偏容忍度極低晶振和鎖相環(huán)設(shè)計(jì)壓力大循環(huán)前綴1/4、1/8、1/16、1/32CP 越長(zhǎng)越抗多徑但有效吞吐越低調(diào)制方式QPSK / 16QAM / 64QAM高階調(diào)制對(duì)相位噪聲和 EVM 要求更高信道編碼卷積碼/CTC 族高吞吐可用 LDPC 類方案編碼增益與解碼時(shí)延的取舍這張表里最需要留意的就是子載波間隔。3.3 kHz 和 Wi-Fi 常見的 78.125 kHz 相比差了 20 多倍。也就是說802.22 對(duì)頻率誤差的容忍度比 Wi-Fi 苛刻得多設(shè)計(jì)接收機(jī)時(shí)絕對(duì)不能按 Wi-Fi 的同步思路來。2. 把收發(fā)鏈路拆到能落地從發(fā)射到接收的模塊設(shè)計(jì)2.1 發(fā)射鏈路數(shù)據(jù)面與控制面要分開處理發(fā)射機(jī)鏈路看上去很標(biāo)準(zhǔn)加擾、信道編碼、比特交織、星座映射、導(dǎo)頻插入、IFFT、加 CP、成型濾波。真正花時(shí)間的是數(shù)據(jù)面之外的控制面接口。802.22 系統(tǒng)需要周期性地進(jìn)入靜默期讓基站和用戶終端都停止發(fā)射去做頻譜感知。發(fā)射鏈路必須支持一個(gè)干凈利落的“TX enable”門控在靜默期到來時(shí)快速關(guān)斷而不是讓功放慢慢吞吞地掉電。我實(shí)現(xiàn)的通常做法是在基帶側(cè)用一個(gè)使能信號(hào)控制加擾和編碼后的數(shù)據(jù)流讓 IFFT 輸入在靜默期內(nèi)保持全零。同時(shí)功放前的射頻開關(guān)也要和這個(gè)使能信號(hào)聯(lián)動(dòng)。這里有個(gè)細(xì)節(jié)不能只關(guān)數(shù)字基帶射頻前端的殘余噪聲可能比數(shù)字信號(hào)還大會(huì)把感知結(jié)果直接帶偏。所以發(fā)射鏈路的數(shù)據(jù)面和控制面必須拆開設(shè)計(jì)控制面的時(shí)序優(yōu)先級(jí)最高。導(dǎo)頻插入的位置也要提前規(guī)劃。802.22 這類長(zhǎng) OFDM 符號(hào)對(duì)相位噪聲很敏感導(dǎo)頻必須按照分布式方式插在子載波網(wǎng)格里接收機(jī)才能持續(xù)跟蹤殘余頻偏和相位旋轉(zhuǎn)。我在浮點(diǎn)模型里先試過塊狀導(dǎo)頻結(jié)果在加相位噪聲的仿真環(huán)境下誤差平臺(tái)很快出現(xiàn)換成梳狀導(dǎo)頻以后星座點(diǎn)才穩(wěn)定下來。2.2 接收機(jī)同步鏈路3 kHz 子載波間隔是個(gè)“緊箍咒”接收機(jī)鏈路最大的難點(diǎn)是同步。子載波間隔小意味著載波頻偏哪怕只有幾十赫茲也會(huì)在星座圖上引起明顯的相位旋轉(zhuǎn)。比如 3.3 kHz 的子載波間隔按 OFDM 系統(tǒng)常用的“頻偏容忍度約為子載波間隔的 1%-2%”折算系統(tǒng)只能容忍幾十赫茲的誤差。普通晶振在溫度變化時(shí)頻率漂移很容易超過這個(gè)范圍所以接收機(jī)必須有兩級(jí)頻偏校正粗頻偏估計(jì)加細(xì)頻偏估計(jì)。我習(xí)慣的順序是先用前導(dǎo)符號(hào)做粗同步和粗頻偏估計(jì)把“大誤差”壓到子載波間隔的幾十分之一再用循環(huán)前綴的相關(guān)性做細(xì)時(shí)間和細(xì)頻偏估計(jì)最后靠導(dǎo)頻符號(hào)做殘余相位跟蹤。這個(gè)流程和 Wi-Fi 接收機(jī)最大的區(qū)別是Wi-Fi 的短符號(hào)很多可以在幾十微秒內(nèi)快速完成同步802.22 的符號(hào)本身更長(zhǎng)同步頭也更長(zhǎng)所以算法可以從容一點(diǎn)但算法跑完后對(duì)精度的要求反而更高。有個(gè)工程坑要提醒長(zhǎng) CP 并不代表時(shí)間同步可以隨便做。CP 只是讓你在符號(hào)起始位置偏移不大時(shí)還能抵抗 ISI但如果同步位置偏差超過 CP 長(zhǎng)度整個(gè)符號(hào)都會(huì)完蛋。我在開發(fā)時(shí)遇到過一種“虛警”情況CP 相關(guān)峰很寬把旁瓣當(dāng)成了主峰導(dǎo)致符號(hào)定時(shí)偏了好幾個(gè)采樣點(diǎn)誤碼率一直降不下來。后來給相關(guān)結(jié)果加了一個(gè)峰值銳化窗才解決。2.3 “感知”不是 MAC 層的事物理層要留的接口很多人以為頻譜感知是 MAC 層在跑跟 PHY 收發(fā)器關(guān)系不大真做起來才知道錯(cuò)得離譜。感知結(jié)果最終要反映在物理層的子載波掩碼上。比如基站判斷出某個(gè)頻段有主用戶信號(hào)那么所有用戶的下行 OFDM 符號(hào)中對(duì)應(yīng)子載波必須禁止使用用戶上行時(shí)也得遵守同樣的掩碼。我在設(shè)計(jì)收發(fā)器時(shí)專門留了一個(gè)“子載波掩碼表”接口數(shù)據(jù)結(jié)構(gòu)很簡(jiǎn)單每個(gè) OFDM 符號(hào)對(duì)應(yīng)一個(gè)長(zhǎng)度等于 FFT 點(diǎn)數(shù)的 bit vector為 0 的子載波在 IFFT 之前被硬置零為 1 的子載波正常調(diào)制。這個(gè)表可以由上層協(xié)議棧更新但直接在 PHY 內(nèi)部生效。這樣做的原因是希望感知調(diào)度和符號(hào)生成完全解耦上層只發(fā)掩碼PHY 保證在下一個(gè)幀邊界切換不讓當(dāng)前幀內(nèi)的子載波映射出現(xiàn)跳變。3. 仿真驗(yàn)證從浮點(diǎn)模型到定點(diǎn)轉(zhuǎn)換的真實(shí)流程3.1 浮點(diǎn)鏈路先跑通再談?dòng)布乙娺^不少團(tuán)隊(duì)一上來就把整個(gè)收發(fā)鏈路在 FPGA 里寫結(jié)果是仿真波形亂成一團(tuán)根本分不清是算法問題還是定點(diǎn)實(shí)現(xiàn)問題。我的經(jīng)驗(yàn)是浮點(diǎn)模型是第一步而且這一步不能省。在 MATLAB 里搭完整收發(fā)鏈路時(shí)信道模型一定要貼近電視頻道的真實(shí)情況。不要只加一個(gè)高斯白噪聲信道要把大時(shí)延多徑放進(jìn)去。比如兩個(gè)反射路徑的時(shí)延差達(dá)到 30 微秒如果 CP 選了 1/32那一定頂不住。浮點(diǎn)模型的價(jià)值就是讓你在寫 RTL 之前把 FFT 點(diǎn)數(shù)和 CP 長(zhǎng)度的組合驗(yàn)證清楚。通過看 BER 曲線有沒有“平臺(tái)期”可以在幾分鐘內(nèi)判斷參數(shù)是否合理而不是等 FPGA 綜合跑上兩小時(shí)再看。3.2 EVM 和 BER 不是一回事先看曲線的“腿”接收機(jī) BER 曲線是最終指標(biāo)但調(diào)試時(shí)只看 BER 會(huì)讓人很絕望因?yàn)?BER 差你不知道是發(fā)射問題還是接收問題。我通常分兩步看第一步測(cè)發(fā)射端 EVM第二步測(cè)接收端 BER。EVM 是星座圖上實(shí)測(cè)信號(hào)與理想信號(hào)之間的誤差矢量幅度。工程上有個(gè)粗略經(jīng)驗(yàn)值64QAM 的 EVM 最好低于 -25 dB16QAM 可以放寬到 -18 dB 左右QPSK 到 -9 dB 左右也能工作。如果 EVM 已經(jīng)達(dá)標(biāo)但 BER 曲線還是離理論值差一大截那問題多半出在接收機(jī)同步或者信道估計(jì)上不要再去折騰發(fā)射鏈路。定點(diǎn)模型里還有一個(gè)高頻問題導(dǎo)頻功率和浮點(diǎn)模型對(duì)不上。因?yàn)閷?dǎo)頻位置通常需要加功率提升而定點(diǎn)處理時(shí)把導(dǎo)頻和數(shù)據(jù)的功率歸一化做錯(cuò)了信道估計(jì)出來的幅度就整體偏掉BER 曲線會(huì)貼著地皮卻到不了合理門限。這種問題很難用肉眼從波形里看出來我是靠比對(duì)定點(diǎn)解調(diào)后的導(dǎo)頻值與浮點(diǎn)理想值的比值才定位到 Q 格式選錯(cuò)。3.3 定點(diǎn)轉(zhuǎn)化的兩個(gè)坑位寬和縮放定點(diǎn)轉(zhuǎn)換是收發(fā)器系統(tǒng)開發(fā)里最容易被低估的環(huán)節(jié)。第一個(gè)坑是 FFT 的位寬增長(zhǎng)。2048 點(diǎn) FFT 的蝶形運(yùn)算如果每級(jí)都保持滿精度位寬增長(zhǎng)是很快的不做截?cái)嗟脑捹Y源占用直接爆炸但截?cái)嗵萦謺?huì)把信噪比拉下來。我的建議是先用浮點(diǎn)模型記錄每個(gè)模塊的動(dòng)態(tài)范圍再給 FFT 輸入輸出留 2-3 bit 的余量再用 Q 格式模擬驗(yàn)證最后才定下位寬。第二個(gè)坑是 AGC 增益與定點(diǎn)縮放互相打架。接收信號(hào)經(jīng)過射頻前端和 ADC 之后幅度可能有很大的波動(dòng)AGC 的輸出范圍要跟基帶邏輯的 Q 格式匹配。如果 AGC 把信號(hào)放得太大FFT 輸入端就會(huì)溢出太小了又浪費(fèi)有效位寬。我在聯(lián)調(diào)時(shí)一度看到星座圖上有一圈“放射狀”的噪聲點(diǎn)查了兩天才發(fā)現(xiàn)是 AGC 的峰值檢波窗口和 OFDM 符號(hào)周期沒有對(duì)齊導(dǎo)致增益在 FFT 窗口內(nèi)還在擺動(dòng)。把 AGC 的更新速率降到符號(hào)級(jí)別之后這個(gè)問題才消失。4. FPGA 原型與實(shí)測(cè)那些文檔里不會(huì)寫的工程問題4.1 平臺(tái)怎么選SDR 快速驗(yàn)證與自研板卡之間做 802.22 收發(fā)器原型平臺(tái)選擇會(huì)影響整個(gè)項(xiàng)目節(jié)奏。我當(dāng)時(shí)對(duì)比過三條路線方案優(yōu)點(diǎn)缺點(diǎn)適用階段通用 SDRUSRP 類上手快射頻和基帶接口現(xiàn)成時(shí)延大鏈路可定制性弱很難做嚴(yán)格時(shí)序驗(yàn)證算法驗(yàn)證、外場(chǎng)信道采集FPGA 成熟射頻前端板卡邏輯可控時(shí)序真實(shí)可測(cè)靜默期切換集成工作量大調(diào)試周期長(zhǎng)原型機(jī)、聯(lián)調(diào)純 FPGA 仿真環(huán)境可重復(fù)性好便于排錯(cuò)無法驗(yàn)證真實(shí)射頻行為和干擾模塊級(jí)功能驗(yàn)證我們最終選了“SDR 先證明算法FPGA 再實(shí)現(xiàn)關(guān)鍵鏈路”的組合。這里我想特別強(qiáng)調(diào)不要跳過 SDR 這步。802.22 的接收機(jī)對(duì)頻偏有多敏感只有把算法跑在真實(shí)的射頻前端上才能看明白。SDR 的本地振蕩器和晶振性能可能和最終硬件不一樣但至少能讓你提前發(fā)現(xiàn)同步鏈路的魯棒性差距。4.2 我踩過的三個(gè)硬坑I/Q 不平衡、載波泄漏、PAPR實(shí)測(cè)階段最折磨人的三個(gè)問題幾乎每個(gè) OFDM 收發(fā)器都會(huì)遇到只是 802.22 的低頻段和窄子載波把這些現(xiàn)象放大了。第一個(gè)是 I/Q 不平衡。接收鏈路兩路 ADC 的增益和相位總會(huì)有一點(diǎn)差異結(jié)果是在頻譜上產(chǎn)生一個(gè)鏡像分量直接干擾對(duì)稱子載波。對(duì) 64QAM 來說鏡像分量會(huì)讓星座點(diǎn)拖出小尾巴。解決辦法是先注入單音信號(hào)估計(jì) I/Q 兩路的增益誤差和相位誤差然后在數(shù)字域做補(bǔ)償。在 802.22 這種窄帶系統(tǒng)里這個(gè)校準(zhǔn)必須做不能靠“反正頻段低應(yīng)該沒事”糊弄過去。第二個(gè)是載波泄漏。射頻前端的本振會(huì)通過混頻器泄漏到基帶在 DC 子載波附近形成一個(gè)尖峰。如果 DC 子載波也在傳數(shù)據(jù)這一格就廢掉了即使 DC 子載波置空泄漏也會(huì)通過 FFT 的頻譜泄漏影響旁邊的子載波。我在接收機(jī)里加了一個(gè)非常簡(jiǎn)單的直流估計(jì)器統(tǒng)計(jì)一個(gè) OFDM 符號(hào)窗口內(nèi)的復(fù)均值然后在頻域搬移前減去。比在射頻端硬調(diào)要容易得多。第三個(gè)是 PAPR高峰均比問題。2048 點(diǎn) FFT 意味著 2048 個(gè)子載波可能同時(shí)同相疊加產(chǎn)生非常高的峰值。功放如果回退不夠信號(hào)會(huì)被壓縮星座圖外圍的 64QAM 點(diǎn)最先扭曲同時(shí)帶外泄漏也會(huì)增大。我試過削峰加濾波的組合效果還不錯(cuò)代價(jià)是高階調(diào)制下會(huì)有少量 EVM 惡化。在做鏈路預(yù)算時(shí)一定要給功放留出足夠回退或者干脆上數(shù)字預(yù)失真方案。4.3 靜默期調(diào)度和頻譜感知聯(lián)調(diào)物理層狀態(tài)機(jī)最后說一個(gè)最容易翻車的聯(lián)調(diào)環(huán)節(jié)靜默期調(diào)度。802.22 系統(tǒng)要求設(shè)備在感知時(shí)不能發(fā)射自己的信號(hào)否則那部分功率再微弱也會(huì)污染頻譜感知結(jié)果。表面上這只是一個(gè)“先停再聽”的過程實(shí)際做起來卻是發(fā)射鏈路、接收鏈路、射頻開關(guān)、感知模塊之間的時(shí)序配合。我把物理層工作狀態(tài)設(shè)計(jì)成了一個(gè)簡(jiǎn)單的狀態(tài)機(jī)正常工作發(fā)射、切入靜默、頻譜感知、恢復(fù)同步、重新發(fā)射。前三個(gè)狀態(tài)之間的切換必須由硬件定時(shí)器觸發(fā)不能靠軟件中斷。最初我們用軟件控制切換感知窗口內(nèi)總能抓到自己的漏信號(hào)后來發(fā)現(xiàn)問題是功放關(guān)斷之后射頻開關(guān)的動(dòng)作還需要幾百微秒穩(wěn)定而這部分延遲在軟件控制里不可控。改成硬件定時(shí)器并把靜默期的保護(hù)時(shí)間余量留夠之后感知數(shù)據(jù)才終于干凈了。這套狀態(tài)機(jī)調(diào)穩(wěn)之后整套系統(tǒng)才算從“能跑通基帶”變成“能穩(wěn)定做感知與通信切換”。如果讓我重新走一遍我會(huì)把位寬檢查、DC 子載波處理、靜默期時(shí)序這三個(gè)問題提前兩周列入檢查清單能省掉不少返工時(shí)間。做 IEEE 802.22 OFDM 收發(fā)器系統(tǒng)最考驗(yàn)人的不是某個(gè)算法有多難而是這些工程細(xì)節(jié)疊加起來帶來的連鎖反應(yīng)。把這些細(xì)節(jié)一個(gè)一個(gè)釘死復(fù)雜系統(tǒng)也就沒那么可怕了。本文還有配套的精品資源點(diǎn)擊獲取