暫時先不管擾碼档礁、信道編碼和交織部分,
一幀輸入數(shù)據(jù)為192bit的偽隨機序列赚抡,時鐘為20MHz爬坑;
經(jīng)過16QAM調(diào)制之后,一幀數(shù)據(jù)變?yōu)?8byte涂臣,時鐘為80MHz盾计,對應(yīng)于48個頻率的子載波售担,頻率點為-26到-22、-20到-8署辉、-6到-1族铆、1到6、8到20哭尝、22到26哥攘;
插入導頻部分是將4個導頻符號插入到48個復數(shù)數(shù)據(jù)中,對應(yīng)于-21材鹦、-7献丑、7、21號子載波侠姑,并且在插入導頻模塊中创橄,需要通過地址變換將導頻符號插入;
根據(jù)協(xié)議中對IFFT輸入端口的映射規(guī)定莽红,將計算后1至26的標號分配給圖
模塊的1至26端日妥畏,計算后-26至-1的標號分配給 38 至63端口,同時將4個導頻信號映射到IFFT運算模塊的43安吁、57醉蚁、7、21號輸入端口鬼店,剩下的輸入端口則輸入零值网棍。
經(jīng)過地址變換之后,64點信息為:
中間遇到了數(shù)據(jù)不對的問題妇智,仔細仿真后滥玷,發(fā)現(xiàn)了問題所在:RAM的延時為2個clk,而代碼中設(shè)計的為1個時鐘巍棱,將IP核中輸出register這個選項去掉之后數(shù)據(jù)正確;蟪搿!
插入導頻仿真:
接著就是IFFT航徙,這個IP核賊煩如贷。尤其是驗證數(shù)據(jù)的正確性,因為點數(shù)和精度差異到踏,算出來的結(jié)果和matlab算的差異比較大杠袱,目前我打算先通過IFFT然后再通過同樣設(shè)置的FFT看看數(shù)據(jù)前后的差異。
IFFT的設(shè)置參照筆記中的IP核分區(qū)窝稿,完成64點IFFT運算之后楣富,得到如下數(shù)據(jù):
接下來插入循環(huán)前綴,直接在IP核設(shè)置界面更改就好了讹躯,然后將configData修改為16'h0010,加入循環(huán)前綴后的仿真:
短訓練序列共16個(6 -34 -3 36 24 36 -3 -34 14 1 -20 -3 0 -3 -20 1)菩彬,循環(huán)10次缠劝,直接存儲在ROM中讀取,加入短訓練序列仿真:
長訓練序列為32+64*2=160個骗灶,其中前32是64的CP惨恭,加入長訓練序列仿真:
最后,需要一個控制模塊控制整個發(fā)射機耙旦,寫一個狀態(tài)機脱羡,首先使能信號源模塊,然后根據(jù)仿真查看ifft數(shù)據(jù)延時多長時間輸出免都,等到IFFT數(shù)據(jù)輸出的時候锉罐,使能整個模塊的輸出使能
IP核仿真
這大約是一個很煩的IP核。
FFT IP核原理:將長序列的DFT運算分解成短序列的DFT運算绕娘,同時利用旋轉(zhuǎn)因子具有周期和對稱的特點脓规,將DFT運算進一步簡化FFT。算法有兩類:一種是基于時間的抽取算法险领,其二是基于頻率抽取算法侨舆。
算法:分為 基 2-FFT 的時間抽取算法 和 基 2-FFT 的頻率抽取算法;都是基于序列奇偶性绢陌;
接口圖:
雖然接口看起來很多很煩挨下,不如老版本的IP核簡單易用,但是大部分新的Xilinx IP的接口其實是統(tǒng)一的脐湾,都是基于AXI協(xié)議的接口臭笆,所以使用方式上可以舉一反三;
信號名稱中以S開頭的表示此信號是從信號秤掌,和上游信號連接愁铺;信號名稱中以m開頭的表示此信號是主信號,和下游信號連接机杜;信號名稱中以event開頭的表示此信號是狀態(tài)信號帜讲,可以反映IP的工作狀態(tài);
信號名稱中有data的表示信號是數(shù)據(jù)信號椒拗,包含config表示配置信號,包含tvalid的表示有效信號获黔,包含status表示狀態(tài)信號蚀苛,包含tlast表示最后一個信號,包含tready表示準備好反饋信號玷氏;
基本握手過程:當valid和ready同時為高時堵未,傳輸就可以進行了;
需要考慮的接口信號有configuration sig盏触,input sig渗蟹,output sig块饺,
Configuration channel:
主要配置s_axis_config_tdata這個信號,信號的結(jié)構(gòu)為:
SCALE_SCH:縮放因子雌芽;僅在IFFT時使用授艰,且僅在勾選了縮放選項時需要配置;
FWD/INV:為1表示FFT世落,為0表示IFFT淮腾;
CP_LEN:循環(huán)前綴的長度,長度為[log2(max_point)-1 : 0];僅在勾選了循環(huán)前綴選項時需要配置屉佳;
NFFT:變換點數(shù)谷朝;僅在勾選實時配置點數(shù)選項時才需要配置;
Input channel:
s_axis_data_tdata結(jié)構(gòu)武花,要注意的地方就是都需要填充為8bit的倍數(shù):
Output channel:
m_axis_data_tdata結(jié)構(gòu)圆凰,要注意的地方同樣是填充:
Event sig:
event_frame_started:當IP核開始處理新的一幀數(shù)據(jù)是輸出一個脈沖;
event_tlast_unexpected:當輸入的tlast信號不是真正的最后一個數(shù)據(jù)是輸出一個脈沖体箕;
event_tlast_missing:當是最后一個數(shù)據(jù)是tlast信號卻沒有指示時輸出一個脈沖专钉;
值得注意的是,當tvalid信號有效時干旁,event_frame_started信號總是延時6個時鐘周期輸出脈沖驶沼,而tlast信號的輸出則以和tvalid的間隔時間為準;例如1024點的FFT争群,那么tlast信號應(yīng)該在tvalid信號拉高后1023個數(shù)據(jù)周期拉高回怜;
整體仿真: