軟件無線電報告 擴頻通信基帶_第1頁
軟件無線電報告 擴頻通信基帶_第2頁
軟件無線電報告 擴頻通信基帶_第3頁
軟件無線電報告 擴頻通信基帶_第4頁
軟件無線電報告 擴頻通信基帶_第5頁
已閱讀5頁,還剩15頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、軟件無線電實驗報告基于 FPGA 的直接序列擴頻發射機的設計姓 名: 學 號: 聯系電話: 班 級: 指導老師: 完成時間:2017-03-22 目錄一、概述31、擴頻通信的概念及特點32、總體框圖及設計要求4二、模塊設計及仿真51. 時鐘模塊52. 數據產生模塊73. 卷積模塊104. 擴頻模塊115. 極性變換與內插模塊136. FIR低通濾波模塊14三、總體設計調試及結果的Matlab驗證14四、實驗中遇到的問題及解決方案191. 發射模塊輸出第一幀的首位缺失,后面幀正常發射192. 卷積碼輸出問題193. 擴頻PN碼與卷積輸出碼的對齊問題204. 毛刺和亞穩態問題20一、概述1、擴頻通

2、信的概念及特點Ø 定義擴展頻譜通信,簡稱擴頻通信,是一種信息傳輸方式,其信號所占有的頻帶寬度遠大于所傳信息必需的最小帶寬。Ø 理論基礎(即為何采用擴頻通信)根據香農公式:C = W×Log2(1+S/N)式中:C-信息的傳輸速率 S-有用信號功率 W-頻帶寬度 N-噪聲功率由式中可以看出:為了提高信息的傳輸速率C,可以從兩種途徑實現,既加大帶寬W或提高信噪比S/N。換句話說,當信號的傳輸速率C一定時,信號帶寬W和信噪比S/N是可以互換的,即增加信號帶寬可以降低對信噪比的要求,當帶寬增加到一定程度,允許信噪比進一步降低,有用信號功率接近噪聲功率甚至淹沒在噪聲之下也是

3、可能的。擴頻通信就是用寬帶傳輸技術來換取信噪比上的好處,這就是擴頻通信的基本思想和理論依據。Ø 擴頻方式擴頻系統包括以下幾種擴頻方式:直接序列擴頻,跳頻擴頻,跳時擴頻,寬帶線性調頻我們只研究其中的直接序列擴頻Ø 直接序列擴頻所謂直接序列擴頻, 就是:l 發射端:直接用具有高碼率的擴頻碼序列對信息比特流進行調制, 從而擴展信號的頻譜;l 接收端: 用與發送端相同的擴頻碼序列進行相關解擴, 把展寬的擴頻信號恢復成原始信息。舉例:l 發射端:將"1"用11000100110,而將"0"用00110010110去代替,這個過程就實現了擴頻,l

4、 接收端:把收到的序列是11000100110就恢復成"1"是00110010110就恢復成"0",這就是解擴。Ø 擴頻的好處:1. 速率高:像上面這個例子中信源速率就被提高了11倍(一個周期內原來發送一個比特,現在發送11個比特);2. 保密性強:參考前面的香農公式,擴頻之后帶寬增加,導致信噪比減小,小到信號完全淹沒在噪聲中,這樣對其他同頻段電臺的接收不會形成干擾,信號也就不容易被發現,進一步檢測出信號就更難,所以有非常高的隱蔽性,非常適合保密通信,特別適合應用于軍事領域的通信;2、總體框圖及設計要求本實驗是基于FPGA的直接序列擴頻發射機的

5、設計與仿真。實驗中以QuartusII 11.0 為設計工具,modelsim為仿真工具,各模塊采用Verilog HDL設計并封裝,最后得到的仿真結果使用Matlab描點來繪制出波形。實驗框圖如圖1-1所示,實驗要求如下:待發射信息采用循環讀ROM的方式,ROM中存儲固定的250bit信息。卷積采用(2.1.7)碼,卷積后速率翻倍(并串轉換)。卷積編碼生成多項式為;編碼效率;約束長度。擴頻碼采用KASAMI碼,生成多項式為; ;m1和m2的初相():0101 10100101內插0值 ,一個碼片插7個0,速率變為32.64M。成型濾波器采用16階FIR低通濾波器 圖2-1-1 系統方框圖二、

6、模塊設計及仿真根據實驗框圖,可將本實驗設計分成六個模塊:時鐘模塊,數據產生模塊,卷積模塊,擴頻模塊,極性變換與內插模塊,FIR低通濾波模塊。所有的模塊都采用全局rst_n(低電平有效)信號低脈沖清零方式,即當rst_n信號低電平有效,所有的計數器和輸出全部清零,同時對部分寄存器置位。rst_n信號在仿真開始32.64m時鐘周期的第一個周期內產生。設計時采用逐級聯調的方式,每設計好一個模塊就進行級聯仿真。各模塊的詳細設計及仿真如下:1. 時鐘模塊從實驗框圖可以看出,本實驗總共需要用到32.64m、4.08m、16k和8k共四種頻率的時鐘信號,由于輸入為32.64m時鐘信號,所以需要分頻輸出另外三

7、種頻率信號。我采用PLL,輸入時鐘為32.64m,輸出為4.08m、16k和8k,IP核配置如下:1) Tools->Megawizard Plug-In Manager圖2-2-12) 選擇PLL核配置如下:圖2-2-23) 配置輸入時鐘和運行模式(normal mode):Normal mode下輸入時鐘和輸出時鐘保持邊沿對其。圖2-2-34) 配置輸出時鐘與輸出使能:圖2-2-45) 最后配置好后生成的例化程序如下:1. PLLPLL_inst (2. .inclk0 ( inclk0_sig ),3. .c0 ( c0_sig ),4. .c1 ( c1_sig ),5. .c2

8、 ( c2_sig )6. );6) 仿真如下圖2-2-5 時鐘8K,16K對比(時序仿真)圖2-2-6 時鐘4.08M和32.64M對比(時序仿真)(注:圖中的時鐘沒有完全對其是因為時序仿真加了延時信息)2. 數據產生模塊數據產生模塊由rom地址產生模塊和rom模塊共同組成。其中rom地址產生模塊產生0249共250個地址,并循環計數,rom模塊中存入250 bits的信息,通過地址的改變,在時鐘跳變沿輸出發射信息。1) rom地址產生模塊的Verilog語言描述如下:1. always (posedge clk_8k or negedge rst_n)2. /復位信號3. if(rst_n

9、 =1'd0)4. begin 5. addr_r <= 'b0;6. rden <= 1'd0;7. source_data_valid_r <= 1'd0;8. End9. /加1計數器到MAX_ADDR=24910. else if(addr_r < MAX_ADDR)11. begin12. addr_r <= addr_r+8'd1;13. source_data_valid_r <=1'b1;14. rden <=1'b1;15. end16. else 17. begin18. ad

10、dr_r <= 'd0;19. end2) rom模塊中的信息儲存在rom_256.mif文件中,使用Quartus提供的IP核產生rom模塊,配置如下: 圖2-2-7 ROM配置圖2-2-8 端口配置,深度配置3) 初始化ROM用mif格式文件初始化,格式如下代碼。1. WIDTH=1;2. DEPTH=250;3. ADDRESS_RADIX=UNS;4. DATA_RADIX=UNS;5. CONTENT BEGIN 6. 0:1; 7. 1:1; 8. 2:1; 9. 3:0; 10. 4:1; 11. /后面省略共250個數可以使用matlab程序生成隨機數(注意最后六

11、位置零,因為FEC初始相位六位)1. close all;2. clear all;3. width=1;4. depth=250;5. data=randn(1,250)>0;6. data(end-5:end)=0;7. fid=fopen('initial_data.txt','w');8. fprintf(fid,'%dn',data);9. /按照格式寫入對應的深度,寬度,格式等信息10. fid=fopen('ram_256.mif','w+');11. fprintf(fid,'WIDT

12、H=%d;n',width);12. fprintf(fid,'DEPTH=%d;n',depth);13. fprintf(fid,'ADDRESS_RADIX=UNS;n');14. fprintf(fid,'DATA_RADIX=UNS;n');15. fprintf(fid,'CONTENT BEGIN n');16. for i=1:depth17. fprintf(fid,'%d:%d; n',i-1,data(i);18. end19. fprintf(fid,'END; n'

13、);20. fclose(fid);圖2-2-9 數據初始化RTL視圖4) 仿真時序圖2-2-10 時序仿真結果和matlab結果對比(首部)圖2-2-11 時序仿真結果和matlab結果對比(尾部)5) 將仿真數據導出來和matlab對比分析圖2-2-12 時序仿真結果和matlab結果對比(一幀數據)3. 卷積模塊卷積模塊采用(2.1.7)碼,編碼效率,約束長度。生成多項式為(133,171)。卷積后進行并串轉換,先輸出133卷積碼,后輸出171卷積碼。卷積電路圖如圖2-3-1所示,時序仿真如圖2-3-2所示。1) Verilog代碼輸入考慮到同步設計思想,盡量使用原始時鐘的分頻輸出,故對

14、于8kbps的信息碼輸入和16kbps的卷積碼輸出,分別采用兩種速率的時鐘,這樣可以盡量保證產生較小的時延,更利于碼片對齊。通過對不同時鐘沿的采樣和輸出,所得到的卷積輸出結果不同,這里采用在8k時鐘上升沿采樣輸入數據,在16k時鐘下降沿輸出卷積碼,可以獲得正確的卷積輸出。卷積模塊的Verilog語言描述如下1. always (posedge clk_8k or negedge rst_n)2. if (rst_n = 1'b0)3. begin4. fec_in <=7'd0;5. fec_out <=2'd0;6. end7. else if (in_v

15、alid_r = 1'd1)8. begin9. fec_in <= fec_in5:0,in_data_r;10. /卷積碼生成11. fec_out<=fec_in0+fec_in2+fec_in3+fec_in5+fec_in6,fec_in0+fec_in1+fec_in2+fec_in3+fec_in6;12. end13. else14. begin15. fec_in <= 7'd0;16. fec_out <= 2'd0;17. end2) 卷積原理圖示(2,1,7)卷積碼生成器的:圖2-3-1 卷積碼 (2,1,7)對應的生成多

16、項式:,所以得到生成元為: ,3) 仿真結果對比圖2-3-2時序仿真結果和matlab結果對比(首部)圖2-3-3時序仿真結果和matlab結果對比(一幀數據)4. 擴頻模塊擴頻模塊是本設計的重點,擴頻碼采用KASAMI碼,生成多項式為m1=23(n=4), m2=435(n=8);m1和m2的初相():0101 10100101。擴頻碼產生電路如圖2-4-1所示。擴頻碼產生模塊輸出的PN序列與上一級卷積輸出進行異或,為了減小毛刺,采用D觸發器鎖存輸出,擴頻后的輸出波形如圖2-4-3所示。擴頻碼產生模塊的Verilog語言描述如下1. always (posedge clk_4_08M or

17、negedge rst_n)2. if (rst_n = 1'b0)3. begin4. m1 <= 4'b0101;5. m2 <= 8'b10100101;6. kasami_code <= 'd0;7. kasami_valid <= 'd0;8. count <= 'd0;9. kasami_last <= 1'b0;10. End11. /255周期12. else if (count = count_254)13. begin14. m1 <= 4'b0101;15. m2 &

18、lt;= 8'b10100101;16. count <= 'd0;17. kasami_last <= 1'b1;18. kasami_code <= m13+m27;19. kasami_valid <= 1'b1;20. End21. /擴頻碼產生22. else if (fec_out_valid_r1 = 1'b1)23. begin24. m1 <= m12:0,m10+m13;25. m2 <= m26:0,m21+m22+m23+m27;26. kasami_code <= m13+m27;27.

19、 kasami_valid <= 1'b1;28. count <= count+1'b1;29. kasami_last <= 1'b0;30. end31. else32. begin33. kasami_code <= 1'b0;34. kasami_valid <= 1'b0;35. kasami_last <= 1'b0;36. end圖2-4-1 擴頻碼產生電路圖圖2-4-2 擴頻電路模塊接口擴頻后的仿真對比:圖2-4-3時序仿真結果和matlab結果對比(首部)圖2-4-4時序仿真結果和matla

20、b結果對比(一幀數據)5. 極性變換與內插模塊極性變換是將擴頻輸出變為雙極性碼,即將0變換為001,1變換為111。內插是在4.08m雙極性碼中插入7個0碼片,總速率變為32.64m。由于這兩個模塊并不復雜,故可以合并為一個模塊。該模塊仿真波形如圖2-5-1所示,其Verilog語言描述如下1. always (posedge clk_32_64M or negedge rst_n)2. if (rst_n = 1'b0)3. begin4. reverse_out_w <= 3'b0;5. reverse_out_valid_w <= 1'b0;6. co

21、unt <= 'd0;7. end8. else if (count = count_7)9. begin10. count <= 'd0;11. reverse_out_valid_w <= 1'b1;12. reverse_out_w <= 3'b0;13. end14. else if(kpm_code_valid_r1 =1'b1)15. begin16. reverse_out_valid_w <= 1'b1;17. count <= count+3'd1;18. /計數到0做極性變換,其他計

22、數1-7插零19. case(count)20. 0: reverse_out_w <= (kpm_code_r1)? 3'b001:3'b111;21. default: reverse_out_w <= 3'b0;22. endcase23. end24. else25. begin26. reverse_out_w <= 3'b0;27. reverse_out_valid_w <= 1'b0;28. end圖2-5-1 極性變換與內插模塊仿真波形(一幀數據)6. FIR低通濾波模塊本模塊采用老師所提供的低通濾波器即可,注意

23、觀察到上一級的輸出有毛刺,為了避開毛刺,FIR模塊采用上升沿檢測。三、總體設計調試及結果的Matlab驗證1) 聯合調試采用時序仿真,選擇仿真器件為Cyclone IV E,引腳分配集中在bank4如下:圖3-1 引腳分配2) 編譯之后的資源占用圖3-2總體資源占用3) 設計RTL視圖圖3-3 RTL視圖,六個模塊4) 時序約束,主要包括四個時鐘約束主要包括時鐘余量,建立時間余量和保持時間余量圖3-4 時鐘約束,時鐘余量圖3-5建立/保持時間余量結論:靜態時序分析正常,最高時鐘可達98.04M,滿足要求。5) 時序仿真結果圖3-6 時序仿真各個模塊輸出結果6) Matlab仿真代碼 將時序仿真

24、的結果寫到txt,和matlab對比,因為只靠人手動對比開頭和結尾不一定能保證數據的正確性。1. close all;2. clear all;3.4. % 初始化250個數5. load('initial_data.txt');6. % 對比數據產生模塊250個數據7. load('source_data.txt');8. error_source=source_data(1:250)-initial_data;9. 10. % fec11. d_trellis = poly2trellis(7,133 171); 12. d_source = convenc

25、(initial_data,d_trellis);13. 14. % 對比fec數據15. load('fec_out.txt');16. index_fec=0;17. error_fec=d_source-fec_out(1+index_fec*500:500+index_fec*500);18. 19. %kasami 255 生成多項式m1=23(n=4), m2=435(n=8) 20. %初始相位0101 1010010121. m1= 0 1 0 1;22. m2= 1 0 1 0 0 1 0 1;23. kasami_out=zeros(1,255);24. f

26、or i = 1: 255 25. kasami_out(1,i) = mod(m1(1)+m2(1) , 2); 26. x_1 = mod(m1(1) + m1(4) , 2); 27. m1 = m1(2:end),x_1; 28. x_2 = mod(m2(1) + m2(5)+ m2(6)+ m2(7) , 2); 29. m2 = m2(2:end),x_2; 30. end31. %擴頻32. kpm_out=zeros(500,255);33. for i = 1:50034. for j = 1:25535. kpm_out(i,j)=mod(kasami_out(j)+d_

27、source(i),2);36. end37. end38. kpm_out2=zeros(1,255*500);39. kpm_out2=reshape(kpm_out',1,500*255);40. 41. % 對比matlab數據和仿真數據42. load('kpm_code.txt');43. kpm_code=kpm_code'44. index_kpm=0;45. error_kpm=kpm_out2-kpm_code(1+index_kpm*500*255:index_kpm*500*255+500*255);46. error_kpm_not=f

28、ind(error_kpm = 0);47. 48. % 將0映射成-1,1映射成149. I=find(kpm_out2=0);50. kpm_out2(I)=7;51. 52. % 插零53. insert_out= zeros(1,8*length(kpm_out2);54. 55. for i=1:8*length(kpm_out2)56. if(mod(i,8)=1)57. insert_out(i)=kpm_out2(fix(i/8)+1);58. else59. insert_out(i)=0;60. end61. end62. 63. %量化3bit64. reverse_ou

29、t2=dec2bin(insert_out,3);65. 66. %驗證映射和插零67. reverse_out_matlab=insert_out;68. J=find(reverse_out_matlab=7);69. reverse_out_matlab(J)=111;70. 71. load('reverse_out.txt');72. index_reverse=2;73. error_reverse=reverse_out_matlab'-reverse_out(1+500*255*8*index_reverse:500*255*8*(index_rever

30、se+1);74. error_reverse_sum=sum(error_reverse);仿真結果:圖3-7 matlab對比數據數據產生error_source為0,卷積error_fec為零,擴頻error_kpm為零,交織和插零之后數據太多,matlab無法顯示所有數據,所以對error_reverse_sum求和,結果為零,說明該模塊也正確無誤??偣豺炞C了連續三幀的數據結果正確。7) FIR聯調結果繪圖將FIR模塊用上之后,16bit數據導出轉換成帶符號整數,matlab繪圖如下:圖3-8 matlab繪圖四、實驗中遇到的問題及解決方案1. 發射模塊輸出第一幀的首位缺失,后面幀正常

31、發射數據初始化我是同時產生讀地址和讀使能信號,由于初始地址是0,在地址開始加1的時候再把讀使能置1,導致了讀使能在地址為1的時候才開始,導致讀取ROM的數據也是從地址1開始,但是不影響第二幀的輸出。評估問題,該問題可以通過把地址初始值置為-1,或者將程序最開始的觸發信號作為讀使能。代碼如下:1. /產生讀地址和使能信號2. always (posedge clk_8k or negedge rst_n)3. if(rst_n =1'd0)4. begin 5. addr_r <= -8'd1;6. rden <= 1'd0;7. source_data_valid_r <= 1'd0;8. end9. else if(addr_r=-8'd1 | addr_r < MAX_ADDR)10. begin11. addr_r <= addr_r+8'd1;12. source_data

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論