今天介紹的是使用FPGA做OFDM的調(diào)制。
首先是OFDM調(diào)制的原理圖,輸入數(shù)據(jù)在輸入系統(tǒng)后首先會經(jīng)過擾碼環(huán)節(jié),在數(shù)字通信中數(shù)據(jù)中長連的“0”或“1”序列會對接收機(jī)的位同步產(chǎn)生重要影響,通過對要發(fā)送的數(shù)據(jù)進(jìn)行擾碼操作,可以解決其對接收機(jī)同步的影響。擾碼器的實質(zhì)是一個反饋的移位寄存器,輸出結(jié)果是一個m序列,將輸出的m序列域輸入的數(shù)據(jù)進(jìn)行異或運(yùn)算,從而將輸入的數(shù)據(jù)攪亂。
擾碼模塊根據(jù)使用的生成多項式完成對輸入數(shù)據(jù)的擾碼操作。這里使用的擾碼器是通過一個7位的反饋移位寄存器來實現(xiàn)的,使用的擾碼器生成多項式為:
上圖為擾碼器的硬件實現(xiàn)結(jié)構(gòu)圖,該擾碼器輸出序列的周期為127,首先將擾碼器的初始值設(shè)置為1011101,每來一個時鐘周期將擾碼器的值右移一位,同時將第七位和第四位進(jìn)行異或運(yùn)算,將異或的結(jié)果作為最低位的值。同時也將得到的結(jié)果和輸入的數(shù)據(jù)分別進(jìn)行異或運(yùn)算,從而實現(xiàn)對輸入數(shù)據(jù)的擾碼操作。
擾碼器程序如下所示:
s_start為啟動信號,s_coder為7位移位寄存器,s_yz為第七位和第四位異或后的結(jié)果,當(dāng)時在程序中因為順序問題我寫的是s_coder[0]和s_coder[3]。s_out為移位寄存器s_coder[0]的輸出,data_in為輸入數(shù)據(jù),data_out為輸入數(shù)據(jù)data_in與移位寄存器輸出s_out異或運(yùn)算的結(jié)果,即為擾碼后的輸出。
這里因為我沒做解調(diào)所以省去了信道編碼部分,在需要添加冗余的部分我才用補(bǔ)零來進(jìn)行補(bǔ)充。
對于64QAM調(diào)制,如下圖所示為64QAM調(diào)制原理圖
這里的2到8電平轉(zhuǎn)換即為星座映射(8電平為-1,-3,-5,-7,1,3,5,7)。
對于64QAM的星座圖,星座圖中每一個點(diǎn)都由6bit數(shù)據(jù)表示,所以在程序中每6bit數(shù)據(jù)映射一次,下圖為verilog仿真圖。
s_start為起始信號,data_in為擾碼之后的輸入64QAM調(diào)制的信號data_index為存儲輸入的6bit數(shù)據(jù),cnt為計數(shù)器,data_index每輸入一個數(shù)據(jù)cnt自加一次;index為計算6bit數(shù)據(jù)后對應(yīng)的映射狀態(tài),data_i和data_q為根據(jù)(index)的映射結(jié)果I/Q信號。這里我是根據(jù)狀態(tài)機(jī)來寫的,index為6bit信號的計算結(jié)果,然后根據(jù)index的大小來描寫狀態(tài)機(jī)進(jìn)行映射。最后將data_i和data_q的結(jié)果存儲到fifo中,即圖中的data_fifo_in。
在FPGA上已經(jīng)完成了星座映射后將I、Q信號送入fifo中存儲,然后通過RAM地址進(jìn)行加冗余以及添加導(dǎo)頻,從而將一個OFDM符號中星座映射后的48個數(shù)據(jù)增加至128個數(shù)據(jù),數(shù)據(jù)都寫入RAM,然后通過地址讀取RAM中的數(shù)據(jù)送入IFFT變換的輸入端口,以及正常輸出,在FPGA上實現(xiàn)頻域至?xí)r域的轉(zhuǎn)換。
下圖中data_i和data_q為星座映射后得到I、Q數(shù)據(jù),data_fifo_in為寫入fifo的數(shù)據(jù),由圖二可以看出,data_fifo_in的前八位為data_i,data_fifo_in的后八位為data_q。
下圖便是將數(shù)據(jù)寫入RAM,并通過地址讀寫增加冗余以及插入導(dǎo)頻。rd_en為讀取fifo數(shù)據(jù)使能,data_fifo_out為讀取的fifo數(shù)據(jù)。ram_en為RAM使能,ram_wea為高電平時向RAM中寫入數(shù)據(jù),ram_wea為低電平時向RAM中讀取數(shù)據(jù),ram_addr為寫入/讀取數(shù)據(jù)的地址。data_ram_in為寫入ram中的數(shù)據(jù),增加的冗余為前38個寫入的數(shù)據(jù)為0以及后37個寫入數(shù)據(jù)為0。中間插入四個導(dǎo)頻。
在前38個寫入數(shù)據(jù)0后便開始寫入fifo中的數(shù)據(jù),在地址為37時(0~37)打開fifo的讀使能(rd_en),此時將fifo輸出端(data_fifo_out)數(shù)據(jù)賦值給RAM寫入端(data_ram_in)。圖中的ram_addr為43時寫入的數(shù)據(jù)為導(dǎo)頻符號,在這里導(dǎo)頻符號我是通過類似于m序列的擾碼器來進(jìn)行產(chǎn)生的。
導(dǎo)頻的產(chǎn)生:
需要插入的4個導(dǎo)頻符號分別為1,1,1,-1。OFDM數(shù)據(jù)中插入的導(dǎo)頻符號并不都是一樣的,需要根據(jù)公式對插入的導(dǎo)頻符號的極性進(jìn)行改變,這里我用的改變導(dǎo)頻符號極性的公式為s(x)=x7+x4+1。
公式的實質(zhì)是一個擾碼器,首先將擾碼器的初始狀態(tài)設(shè)置為1111111,根據(jù)擾碼器的輸出結(jié)果對導(dǎo)頻符號的極性進(jìn)行修改,若擾碼器的輸出結(jié)果為0,則導(dǎo)頻符號的極性不變,若擾碼器的輸出結(jié)果為1,則對導(dǎo)頻符號的極性進(jìn)行修改,修改規(guī)則為1 -> -1,-1 -> 1。
圖七為導(dǎo)頻產(chǎn)生數(shù)據(jù)波形圖,其中data_m為擾碼器序列,初始狀態(tài)為1111111,每當(dāng)需要插入導(dǎo)頻時m_start便會使能置1,根據(jù)m_start可以看出圖中一個OFDM符號中共插入四個導(dǎo)頻。p寄存器中便是存放的四個原始導(dǎo)頻數(shù)據(jù),01表示導(dǎo)頻1,11表示導(dǎo)頻-1。data_m_out便是最終插入OFDM符號的導(dǎo)頻數(shù)據(jù),即寫入ram中的導(dǎo)頻數(shù)據(jù)。
ifft變換:
在數(shù)據(jù)都在RAM中存好之后便是將ram中的數(shù)據(jù)送入IFFT變換的輸入端口,此時將ram的ena使能端置為高電平ram的wea置為低電平,開始讀取ram中的數(shù)據(jù)。如下圖所示,ram的ena為高,ram的wea為低,ram數(shù)據(jù)輸出端為douta開始輸出數(shù)據(jù)。
這里OFDM一次傳輸128個數(shù)據(jù),在星座映射后為48個數(shù)據(jù),插入四個導(dǎo)頻后為52個數(shù)據(jù),這里選擇通過補(bǔ)零來添加冗余,如下圖所示。
在上圖中,ifft_s_data_tdata為ifft變換的輸入端口,ifft_s_data_tvalid為輸入使能,ifft_s_data_tvalid為高時輸入ifft_s_data_tdata的數(shù)據(jù)才有效。
-
FPGA
+關(guān)注
關(guān)注
1629文章
21729瀏覽量
602986 -
ofdm
+關(guān)注
關(guān)注
6文章
349瀏覽量
57001 -
接收機(jī)
+關(guān)注
關(guān)注
8文章
1180瀏覽量
53453 -
調(diào)制器
+關(guān)注
關(guān)注
3文章
840瀏覽量
45142
發(fā)布評論請先 登錄
相關(guān)推薦
評論