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