OFDM802.11a的FPGA實現(十四)data域的設計優化,擠掉axi協議傳輸中的氣泡

原文鏈接(相關文章合集):OFDM 802.11a的xilinx FPGA實現

目錄

1.前言

2.data域的時序要求

3.Debug


1.前言

??前面12篇文章詳細講述了,OFDM 802.11a發射部分data域的FPGA實現和驗證,今天對data域的設計做一個總結。在總結過程中,發現了設計中存在bug,經過檢查和調試成功的解決了bug,現在對整個過程進行詳細描述。

2.data域的時序要求

??前面設計的時候說到過,根據信道間隔(channel spacing)的不同,可以計算出如下一些參數:

時序參數

時序參數

時序參數

時序參數

??可以看到當信道間隔為20MHz時,一個OFDM的符號的有效數據周期是3.2us,一個OFDM的符號周期是4us。假設采樣率是20M,那么該采樣率下的采樣周期是50ns,因此一個OFDM符號的有效周期需要64個采樣點。所以我們只要保證IFFT的輸出數據速率大于20MHz即可,后續在DAC輸出的時候,再將數據速率降到20M,由于我們設計的時候數據流一直采用的是vaild-ready握手機制,DAC沒有輸出完當前數據會對前面的一系列處理形成反壓,進而可以保證OFDM符號間不會存在間隙。 ??

考慮到IFFT的輸出需要滿足20MHz的數據速率,使用最快的傳輸方案,64-QAM調制+3/4編碼效率。編碼前的數據速率應該為2063/4=90MHz;編碼后的數據速率為20*6=120MHz。為了仿真方便,系統時鐘選取125MHz。 ?

?總而言之,就是data域的數據必須是以20MHz的速率送給DAC,可以大于20M,但是不能低于20M。也就是,上一個IFFT輸出(經過加循環前綴和加窗之后)的80個數據,和下一個之間的時間間隔不能大于8us。

3.Debug

??對于之前的設計,按照如下連接方式進行測試:

data域模塊連接圖

data域模塊連接圖

??采用64-QAM調制+3/4編碼效率。之前的設計仿真結果如下:

之前有bug的設計仿真結果

之前有bug的設計仿真結果

從上圖可以看到,每個IFFT輸出之間,間隔為,是不能夠保證OFDM符號間不會存在間隙的,除非將系統時鐘提高,但是這樣會帶來更大的挑戰。所以還是著手于去排查問題,檢查中間傳輸是否存在氣泡,影響效率。

并串轉換存在傳輸氣泡

并串轉換存在傳輸氣泡

如上圖所示,并串轉換模塊在進行最后一個數據輸出后,隔了一個時鐘才開始像上游請求接收數據。按理說,應該在傳輸完最后一個數據,dout_rdy立即拉高,向上游請求接收數據,這里延遲了一個時鐘導致產生了一個傳輸氣泡。由于64-QAM調制+3/4編碼效率,測試數據一個OFDM符號為216個數,第一次并串轉換和后面卷積編碼和刪余之間使用的模2的并串轉換,均會產生大量傳輸氣泡,大大增加了系統延時。點此跳轉到之前設計的并串轉換模塊

更正設計,擠掉傳輸氣泡,代碼如下(其中counter為自己設計的計數器IP核點此跳轉到計數器篇):

assign?wr_en??=?dout_rdy?&?din_vld?;//與上游握手成功,開始接收數據
assign?rd_en??=?din_rdy?&?dout_vld?;//與下游握手成功,啟動讀計數器,開始輸出counter?#(.CNT_NUM(WIDTH),.ADD(LSB_FIRST))
u_counter(.clk??(clk????),?.rst_n??(rst_n????),.En_cnt??(rd_en????),??????.cnt??(cnt????),?.cnt_last?(cnt_last???)
);assign??dout?=?din_r[cnt];always?@(posedge?clk?or?negedge?rst_n)if(!rst_n)begindin_r?<=?'d0;dout_vld?<=?1'b0;endelse?if(wr_en)begindin_r?<=?din;dout_vld?<=?1'b1;//寫進數據時,輸出有效endelse?if(rd_en?&?cnt_last)dout_vld?<=?1'b0;//輸出完成,輸出無效;只有在輸入數據無效的時候才會進入次判斷,保證無氣泡傳輸/*?//初始化時,或輸出數據完成,可以接收數據(之前含有氣泡的設計)
always?@(posedge?clk?or?negedge?rst_n)if(!rst_n)dout_rdy?<=?1'b1;else?if(cnt_last?&?rd_en)dout_rdy?<=?1'b1;else?if(wr_en)dout_rdy?<=?1'b0;?*/?
assign?dout_rdy?=?cnt_last?&?rd_en?|?~dout_vld;//更正后擠掉氣泡

如下圖所示,可以看到更正之后,數據連續傳輸,沒有氣泡。

擠掉并串轉換傳輸氣泡

擠掉并串轉換傳輸氣泡

對IFFT輸出間隔進行測量:

Debug后IFFT輸出間隔

Debug后IFFT輸出間隔

如上圖所示,輸出間隔為,符合802.11a協議的要求。64-QAM調制+3/4編碼效率,符合要求,那么802.11a中其他調制方式也肯定符合要求。

下面是10個OFDM符號,采用64-QAM調制+3/4編碼效率,加窗后,FPGA輸出和Matlab仿真對比。

實部

實部

虛部

虛部

原文鏈接(相關文章合集):OFDM 802.11a的xilinx FPGA實現

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11619.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11619.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11619.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

electron 多窗口 vuex/pinia 數據狀態同步簡易方案(利用 LocalStorage)

全局 stroe 添加 mutations 狀態同步方法 // 用于其他窗口同步 vuex 中的 DeviceTcpDataasyncDeviceTcpData(state: StateType, data: any) {state.deviceTcpData data},App.vue 里 onMounted(() > {console.log("App mounted");/*** vuex 多窗口 store 同步*//…

springboot306基于Java的民宿管理系統(源碼+包運行+配套LW+技術指導)

項目描述 臨近學期結束&#xff0c;開始畢業設計制作&#xff0c;你還在做java程序網絡編程&#xff0c;期末作業&#xff0c;老師的作業要求覺的困難嗎?不知道畢業設計該怎么辦?網頁功能的數量是否太多?沒有合適的類型或系統?等等。今天給大家介紹一篇基于Java的民宿管理…

python篇-cmd 執行pip命令失敗,但執行pyhon命令正常

當你在CMD中可以正常執行python命令&#xff0c;但執行pip命令失敗時&#xff0c;這通常意味著pip沒有被正確地添加到系統的環境變量中。這里有一些步驟來解決這個問題&#xff1a; 檢查環境變量&#xff1a; 打開系統的環境變量設置&#xff08;右擊“此電腦”>“屬性”>…

CoSeg: Cognitively Inspired Unsupervised Generic Event Segmentation

名詞解釋 1.特征重建 特征重建是一種機器學習中常用的技術&#xff0c;通常用于自監督學習或無監督學習任務。在特征重建中&#xff0c;模型被要求將輸入數據經過編碼器&#xff08;encoder&#xff09;轉換成某種表示&#xff0c;然后再經過解碼器&#xff08;decoder&#x…

c/c++對于char*的理解(聯合string容器)

在C和C中&#xff0c;char*是一個指向字符&#xff08;char&#xff09;的指針。它經常被用來處理C風格的字符串&#xff0c;這種字符串是以空字符&#xff08;\0&#xff09;結尾的字符數組。以下是關于char*的一些關鍵點&#xff1a; C風格的字符串&#xff1a; C風格的字符…

升級Microsoft 365后,SAP GUI中無法打開Excel的解決方案

最近&#xff0c;我們遇到了一個棘手的問題&#xff0c;一位客戶在升級到Microsoft 365后&#xff0c;無法在SAP GUI中打開Excel。這個問題不僅影響了工作效率&#xff0c;也給用戶的日常操作帶來了不便。在本文中&#xff0c;我們將探討問題的成因&#xff0c;并提供一種解決方…

泛微E9開發 添加多個多選框,實現單選框的效果

利用多個多選框實現單選框的效果 1、功能背景2、展示效果3、實現效果 1、功能背景 如下圖所示&#xff0c;在表單中新增四個“選擇框-復選框”類型的字段&#xff0c;并且設置其中的選項&#xff0c;每個多選框都只有一個選項&#xff0c;通過代碼塊實現單選框的效果 1.顯示模…

鄧閑小——生存、生活、生命|真北寫作

人生有三個層次∶生存、生活、生命。 生存就是做必須做的事。生存的模式是鄧&#xff0c;是交易&#xff0c;是買賣。別人需要的東西&#xff0c;你生產出來&#xff0c;賣給他。哪怕這個東西沒啥用&#xff0c;也可以賣&#xff0c;情緒也可以賣。你需要的東西&#xff0c;你花…

分布式與一致性協議之POW算法

POW算法 概述 談起比特幣&#xff0c;你應該并不陌生。比特幣是基于區塊鏈實現的&#xff0c;而區塊鏈運行在因特網上&#xff0c;這就存在有人試圖作惡的情況。有些讀者可能已經發現了&#xff0c;口信消息型拜占庭問題之解、PBFT算法雖然能防止壞人作惡&#xff0c;但只能防…

代碼隨想錄算法訓練營第二十三天 | 530.二叉搜索樹的最小絕對差、501.二叉搜索樹中的眾數、236. 二叉樹的最近公共祖先

目錄 530.二叉搜索樹的最小絕對差 思路 代碼 501.二叉搜索樹中的眾數 思路 代碼 236. 二叉樹的最近公共祖先 思路 代碼 530.二叉搜索樹的最小絕對差 需要領悟一下二叉樹遍歷上雙指針操作&#xff0c;優先掌握遞歸 題目鏈接/文章講解&#xff1a;代碼隨想錄 視頻講解…

Java Spring的定時任務的配置和使用

在Spring框架中&#xff0c;配置和使用定時任務主要涉及Scheduled注解以及Spring的異步任務執行能力。以下是詳細步驟&#xff1a; 1. 引入依賴 對于Spring Boot項目&#xff0c;通常已經包含了Spring框架&#xff0c;因此不需要額外添加定時任務的依賴。如果使用的是Spring框…

AI大模型測評系統opencompass源碼解析

1 注冊器(Registry) 為了管理功能相似的模塊,MMEngine實現了注冊器。注冊器可以被視作這些類或函數的抽象。例如注冊器 MODELS 可以被視作所有模型的抽象。 1.1 什么是注冊器 MMEngine 實現的注冊器可以看作一個映射表和模塊構建方法(build function)的組合。 映射表:…

八、e2studio VS STM32CubeIDE之內存使用情況窗口

目錄 一、概述/目的 二、STM32CubeIDE Build Analyzer 三、e2studio Memory Usage 八、e2studio VS STM32CubeIDE之內存使用情況窗口 一、概述/目的 1、嵌入開發最大特點之一就是資源受限&#xff0c;關注芯片資源使用詳情是優秀工程師的技能之一 2、Keil和IAR都不支持內存…

CTFshow 信息搜集

第一題1 進入靶場 直接看源碼發現flag 第二題 1 按右鍵沒辦法看源碼 按ctrlu可以查看源碼 第三題 0 查看源碼 發現還是什么都沒有 用bp抓包發現flag 第四題1 直接進robots.txt 訪問flagishere.txt獲得flag 第五題 0 提示了phps源碼泄露 用目錄掃描工具沒掃出來 看wp 發現有…

網絡編程套接字詳解

目錄 1. 預備介紹 2.網絡字節序 3.udp網絡程序 4.地址轉換函數 5.udp網絡編程 1.預備介紹 1.1源IP地址和目標IP地址 舉個例子: 從北京出發到上海旅游, 那么源IP地址就是北京, 目標IP地址就是上海. 1.2 端口號 作用: 標識一個進程, 告訴OS這個數據交給那個進程來處理; (1)…

Oracle: 一個用戶多個表空間處理

1.場景描述 今天工作中&#xff0c;同事說建了一個用戶&#xff0c;往里面導入數據時提示表空間不存在&#xff0c;建了表空間后&#xff0c;部分仍然導不進去。期望幫忙創建表空間&#xff0c;并指定默認表空間&#xff0c;成功將數據導入。 &#xff08;1&#xff09;創建好的…

K8s:二進制安裝k8s(單臺master)

目錄 一、安裝k8s 1、拓撲圖 2、系統初始化配置 2.1關閉防火墻selinx以及swap 2.2設置主機名 2.3在每臺主機中添加hosts&#xff0c;做映射 2.4調整內核參數&#xff0c;將橋接的ipv4流量傳遞到iptables&#xff0c;關閉ipv6 2.4時間同步 3、部署docker引擎&#xff0…

使用LangChain和Neo4j快速創建RAG應用

大家好&#xff0c;Neo4j 通過集成原生的向量搜索功能&#xff0c;增強了其對檢索增強生成&#xff08;RAG&#xff09;應用的支持&#xff0c;這標志著一個重要的里程碑。這項新功能通過向量索引搜索處理非結構化文本&#xff0c;增強了 Neo4j 在存儲和分析結構化數據方面的現…

go語言map底層及擴容機制原理詳解(上)

底層數據結構-哈希表 go語言map的底層數據結構是哈希表&#xff1a;通過哈希表來存儲鍵值對&#xff0c;通過hash函數把鍵值對散列到一個個桶(bucket)中。 什么是哈希表&#xff1f; 在順序結構以及平衡樹中&#xff0c;元素與其的存儲位置之間沒有對應關系&#xff0c;因此…

SwiftUI中的@StateObject和@ObservedObject的區別

SwiftUI中的StateObject和ObservedObject屬性包裝器指示視圖更新以響應被觀察對象的變化。雖然這兩個屬性包裝器看起來很相似&#xff0c;但在使用SwiftUI構建應用程序時&#xff0c;有一個關鍵的區別需要理解。 兩個屬性包裝器都要求對象符合ObservableObject協議。這個協議表…