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