基于FPGA的16QAM調制系統_第1頁
基于FPGA的16QAM調制系統_第2頁
基于FPGA的16QAM調制系統_第3頁
基于FPGA的16QAM調制系統_第4頁
基于FPGA的16QAM調制系統_第5頁
已閱讀5頁,還剩14頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

1、基于FPGA的16QAM調制器的實現目錄一、QAM調制原理4二、16QAM調制器的實現5三、16QAM調制器的仿真結果7四、附錄111 頂層模塊112 時鐘分頻模塊123 串并轉換模塊134 差分模塊和星座映射模塊145 DDS 和加法器模塊166 testbench 源程序217 用matlab 進行頻譜分析22一、QAM調制原理正交幅度調制(QAM)是一種把數字信息包含在載波的振幅和相位中的數字調制方式,也是ASK和PSK的結合。式(1)表示了QAM信號,它還可用式(2)來表示在QAM中是如何結合幅度和相位調制的。 (1) (2)16QAM信號的產生有兩種基本方法:正交調幅法是用兩路正交的

2、四電平振幅鍵控信號疊加而成;四相疊加法是用兩路獨立的四相移相鍵控信號疊加而成。其中,16QAM正交調幅法的調制方框圖如圖1所示。輸入的二進制數據經過串一并變換分別進入a1、a2、b1和b2,4個信道:每個信道的數據速率降為原來的14。24電平轉換器產生一個四電平的PAM信號,每個24電平轉換器的輸出有2種量值和2種相位。兩個PAM信號分別調制同相和正交載波,每一個調制器有4種可能的輸出,經線性加法器合并產生16QAM信號。 圖1 16QAM調制原理圖每路PAM信號的量值和相位由輸入的二進制數據及其比特分配模式星座圖決定。16QAM星座圖通常有自然碼邏輯和Gray碼邏輯2種比特模式。因為Gray

3、碼可以消除相鄰點間符號差錯中的2比特誤差,即可減小相同符號差錯率中的誤比特率,IEEE8021la和HiperLAN2標準中所有的星座都是Gray碼的。本文在設計16QAM的時候,采用圖2的Gray模式進行編碼,圖中4個比特位從左至右的順序為blb2ala2。圖2 16QAM星座圖的Gray碼邏輯模式二、16QAM調制器的實現系統輸入數據速率為100 Kbs;系統正交調制載波頻率為1 MHz。調制部分主要由Ahera公司推出的Cyclone系列器件EPlC6Q240C8實現該器件完成對輸入數據串并變換、差分編碼、星座影射等。設計EDA工具為Ahera集成設計軟件Quartus II 72版本;

4、硬件描述Verilog HDL語言完成邏輯設計。本系統還用到仿真工具Matlab,搭建16QAM調制器的simulink模塊,采用示波器觀看波形。 1 系統總體框圖 16QAM調制器的實現主要包括時鐘模塊、串并變換模塊、查分編碼模塊、星座映射、DDS模塊、加法器模塊。系統總體框圖如下: 圖3 系統總體框圖系統頂層設計如下:圖4 系統頂層設計2 時鐘分頻時鐘分頻模塊clk利用N分頻器對10MHz系統時鐘信號進行N分頻,以產生調制器模塊所需的工作時鐘。N分頻器是由模N2計數器實現的,分頻輸出信號模N2可自動取反,以產生占空比為1:1的時鐘信號。由于信號源產生的基帶信號為1bit串行數據,其速率為1

5、00 kbps,經并串轉換后的4 bit并行數據速率為400 kbps,所以,本設計還采用了100分頻器和400分頻器。另外將10Mhz直接送入到DDS模塊,使得輸出的載波頻率為1Mhz.3 串并轉換 1bit的數據送過來后,通過串并變換,將輸入的第一個數據同它后面的三個數據同時輸出,形成4bit的并行信號。4 差分編碼和星座映射 在本模塊,同樣根據調制方式不同,選用不同位的數據來進行處理。由于幾乎都采用相干檢測的方式進行解調,因此在解調端載波恢復存在著4個相位穩定點,即提取的相干載波可能與接收信號載波有4種相位關系,稱作4重相位模糊度舊3。部分差分編碼能消除4重相位模糊度對解調的影響。而部分

6、差分編碼相對于全差分編碼由于減少了差分編碼的bit數。因而減少了誤碼擴散,具有較好的誤碼性能。 由于同樣的符號誤碼率下,采用格雷編碼比自然碼的比特誤碼率小,所以多幅度電平的電平邏輯采用格雷編碼映射。星座影射模塊輸入4bit并行數據,輸出為IQ路對應的四幅值之一;4 bit并行信號需要將其影射到信號平面,星座影射實現采用查表法分別輸出I/Q對應的幅值.對應的量化表如下:表1 星座映射I/Q路輸入數據對應的量化值00-201-11111025 DDS和線性加法器 在DDS模塊中,采用系統時鐘10Mhz,由公式可知:但取頻率字為K=32'b11001100110011001100110011

7、001, fc=10MHZ, N=32時,可得到輸出的正余弦波的頻率為1MHz。三、16QAM調制器的仿真結果1 使用Quartus 自帶仿真器仿真,其總體仿真圖如下:圖5 16QAM調制器的quartus仿真2將程序導入到modelsim中,通過編寫testbench,得到如下仿真結果:圖6 16QAM調制器的modeldsim仿真3 使用MATLAB中simulink庫文件搭建一個16QAM調制系統:圖7 16QAM調制系統在MATLAB中的仿真實現 觀察最后的兩個示波器,首先是沒有加入噪聲的波形,顯示如下圖8 沒有噪聲的輸出波形讓輸出信號通過10dB噪聲的AWGN 信道后,輸出波形如下:

8、圖9 通過AWGN信道后的輸出波形同時會得到映射在星座圖上的點,圖形如下:圖10 星座映射圖4 對輸出的數據進行頻譜分析 通過在testbench中編寫程序,保存輸出的數據,再用MATLAB進行頻譜分析,得到結果如下:圖11 輸出信號的頻譜分析四、附錄1 頂層模塊 module top(clk, /系統時鐘rst, /復位en, /使能信號data_in, /1bit信號輸入data_out, /16QAM信號輸出DATA_I, /I路對應的量化值DATA_Q); /Q路對應的量化值 input clk,rst,en; input data_in; output signed17:0 data

9、_out; output signed 3:0 DATA_I,DATA_Q; wire clk_dds; /DDS塊的輸入時鐘 wire clk_100; /100kbs wire clk_400; /25kbs wire 3:0 data1; wire 3:0 data2; clk clkqam( .clk_sys(clk), .rst(rst), .clk_dds(clk_dds), .clk_100(clk_100), .clk_400(clk_400) );shift shiftqam( .clk_in(clk_100), .clk_out(clk_dds), .data_in(dat

10、a_in), .rst(rst), .en(en), .data_out(data1) );diff diffqam( .clk(clk_dds), .rst(rst), .data_in(data1), .data_out_i(DATA_I), .data_out_q(DATA_Q), .data(data2) );add addqam ( .clk_dds(clk_dds), .rst(rst), .en(en), .data(data2), .dataout(data_out) );endmodulemodule clk( clk_sys, /10MHz rst, clk_dds, /1

11、0MHz clk_400, / 25Kbs clk_100); /100Kbs input clk_sys; input rst; output clk_dds,clk_400,clk_100; reg clk_400,clk_10,clk_100; reg 7:0 count2,count3,count4; assign clk_dds=clk_sys;always (posedge clk_sys or posedge rst) begin if (rst) begin count2<=0; clk_100<=0; end else begin if (count2=49) b

12、egin count2<=0; clk_100<=clk_100; end else begin count2<=count2+'b1; clk_100<= clk_100; end end endalways (posedge clk_100 or posedge rst) begin if (rst) begin count3<=0; clk_400<=0; end else begin if (count3=1) begin count3<=0; clk_400<=clk_400; end else begin count3<

13、=count3+'b1; clk_400<= clk_400; end end endendmodule2 時鐘分頻模塊3 串并轉換模塊 module shift (clk_in, /寫入信號的時鐘clk_out, /輸出信號的時鐘data_in, /輸入信號data_out, / 輸出信號rst,en);input clk_in,clk_out,rst,en;input data_in;output reg 3:0 data_out;reg 3:0 dout;always (posedge clk_in or posedge rst) begin if(rst) begin d

14、out<=0; end else begin if(en) begin dout<=dout2:0,data_in; end else dout<=dout; end end always (posedge clk_out or posedge rst) begin if(rst) data_out<=0; else data_out<=dout;endendmodule4 差分模塊和星座映射模塊module diff(clk, data_in, / 輸入信號data_out_i, /I路對應的量化值data_out_q, /Q路對應的量化值rst,data);

15、/輸出信號 input clk,rst;input 3:0 data_in;output signed 3:0 data_out_i,data_out_q;reg 3:0 data_out_i,data_out_q;output reg 3:0 data;wire a,b,c,d;reg dataa,datab;reg prea,preb;reg 1:0regi,regq;assign a=data_in3;assign b=data_in2;assign c=data_in1;assign d=data_in0;/assign data=regi,regq;always (posedge c

16、lk or posedge rst) begin if (rst) begin prea<=0; end else begin dataa <= (a=0)? prea : prea;prea <= dataa;endendalways (posedge clk or posedge rst) begin if (rst) begin preb<=0; end else begin datab <= (b=0)? preb : preb;preb <= datab; endend always (posedge clk or posedge rst) beg

17、in if (rst) begin regi<=0; regq<=0; end else begin regi<=dataa,c; regq<=datab,d; endendalways (posedge clk )begin case(regi) 'b00 : data_out_i<=-'d2; 'b01 : data_out_i<=-'d1; 'b11 : data_out_i<='d1; 'b10 : data_out_i<='d2; endcaseendalways (pos

18、edge clk)begin case(regq) 'b00 : data_out_q<=-'d2; 'b01 : data_out_q<=-'d1; 'b11 : data_out_q<='d1; 'b10 : data_out_q<='d2; endcaseendalways (posedge clk or posedge rst)begin if(rst) begin data<=0; end else begin data<=regi,regq; endendendmodule5 DDS

19、 和加法器模塊module add(clk_dds, /輸入信號時鐘rst,en,data, dataout,); /16QAM信號input rst,en,clk_dds;input 3:0 data;output signed17:0 dataout;reg signed16:0 csignal,ssignal;wire signed 15:0 cosine; /cos值wire signed 15:0 sine; /sin值wire 31:0 addra; / DDS頻率字assign addra='b11001100110011001100110011001;assign da

20、taout= csignal16,csignal+ ssignal16,ssignal;always (posedge clk_dds or posedge rst)begin if(rst) begin csignal <= 0;ssignal <= 0; end else begin case(data) 4'b0000: begin /-2cos-2sin csignal16:1 <= cosine15:0; csignal0 <= 0; ssignal16:1 <= sine15:0; ssignal0 <= 0; end4'b000

21、1: begin / -2cos-sin csignal16:1 <= cosine15:0; csignal0 <= 0; ssignal16 <= sine15; ssignal15:0 <= sine15:0;end4'b0010: begin / -2cos+2sin csignal16:1 <= cosine15:0; csignal0 <= 0; ssignal16:1 <= sine15:0; ssignal0 <= 0; end4'b0011: begin / -2cos+sin csignal16:1 <=

22、 cosine15:0; csignal0 <= 0; ssignal16 <= sine15; ssignal15:0 <= sine15:0; end4'b0100: begin / -cos-2sin csignal16 <= cosine15; csignal15:0 <= cosine15:0; ssignal16:1 <= sine15:0; ssignal0 <= 0; end4'b0101: begin / -cos-sin csignal16 <= cosine15; csignal15:0 <= cosi

23、ne15:0; ssignal16 <= sine15; ssignal15:0 <= sine15:0; end4'b0110: begin/ -cos+2sin csignal16 <= cosine15; csignal15:0 <= cosine15:0; ssignal16:1 <= sine15:0; ssignal0 <= 0; end4'b0111: begin / -cos+sin csignal16 <= cosine15; csignal15:0 <= cosine15:0; ssignal16 <=

24、sine15; ssignal15:0 <= sine15:0; end4'b1000: begin / 2cos-2sin csignal16:1 <= cosine15:0; csignal0 <= 0; ssignal16:1 <= sine15:0; ssignal0 <= 0; end4'b1001: begin / 2cos-sin csignal16:1 <= cosine15:0; csignal0 <= 0; ssignal16:1 <= sine15:0; ssignal0 <= 0; end4'

25、b1010: begin /2cos+2sin csignal16:1 <= cosine15:0; csignal0 <= 0; ssignal16:1 <= sine15:0; ssignal0 <= 0; end4'b1011: begin / 2cos+sin csignal16:1 <= cosine15:0; csignal0 <= 0; ssignal16 <= sine15; ssignal15:0 <= sine15:0; end4'b1100: begin / cos-2sin csignal16 <=

26、cosine15; csignal15:0 <= cosine15:0; ssignal16:1 <= sine15:0; ssignal0 <= 0; end4'b1101: begin / cos-sin csignal16 <= cosine15; csignal15:0 <= cosine15:0; ssignal16 <= sine15; ssignal15:0 <= sine15:0; end4'b1110: begin / cos+2sin csignal16 <= cosine15; csignal15:0 <

27、;= cosine15:0; ssignal16:1 <= sine15:0; ssignal0 <= 0; end 4'b1111: begin / cos+sin csignal16 <= cosine15; csignal15:0 <= cosine15:0; ssignal16 <= sine15; ssignal15:0 <= sine15:0; end default: begin csignal <= 0; ssignal <= 0;endendcaseendend dds ddsqam( .data(addra), .en

28、(en), .reset(rst), .clk(clk_dds), .sine(sine), .cose(cosine) );Endmodule/module dds(data, en, clk, reset, sine, cose); / DDS模塊input 31 : 0 data; /頻率控制字input en; /頻率控制字寫使能input clk; input reset; output signed15 : 0 sine; /正弦信號輸出output signed15 : 0 cose; /余弦信號輸出reg 31 : 0 ADD_A; /正弦波產生模塊的相位累加器reg 31 :

29、 0 ADD_B; /余弦波產生模塊的相位累加器÷reg signed 15 : 0 cose_DR; /余弦波的查找表地址reg signed 15 : 0 sine_DR; /wire 31 : 0 data; /頻率控制字wire 9 : 0 ROM_A;wire signed 15 : 0 cose_D;wire signed 15 : 0sine_D;assign cose = cose_DR;assign sine = sine_DR;assign ROM_A = ADD_B31 : 22; begin if(reset) /系統初始化時,默認的頻率控制字為0 ADD_A

30、 <= 0; else if(en) ADD_A <= data; else ADD_A <= ADD_A ;endalways (posedge clk or posedge reset)begin if(reset) ADD_B <= 0; else ADD_B <= ADD_B + ADD_A; /ADD_B為累加的結果endalways (posedge clk or posedge reset)begin if(reset) cose_DR <= 0; else cose_DR <= cose_D;endalways (posedge clk

31、 or posedge reset)begin if(reset) sine_DR <= 0; else sine_DR <= sine_D;end/調用兩個ROM,存儲著正余弦波形一個周期的數值。rom_cose cose1( .addra(ROM_A), .clka(clk), .douta(cose_D);rom_sine sine1( .addra(ROM_A), .clka(clk), .douta(sine_D);endmodule module rom_sine( /產生sin信號模塊addra,clka,douta);inputclka;input9:0addra;

32、output15:0douta;regsigned15:0douta;always (posedge clka) begin case(addra)10'd 1 : douta= 16'd 1 ;10'd 2 : douta= 16'd 1 ;10'd 3 : douta= 16'd 2 ; 10'd 1021 : douta= -16'd2 ;10'd 1022 : douta= -16'd1 ;10'd 1023 : douta= -16'd1 ;10'd 1024 : douta= &

33、#39;d0 ;endcaseend endmodulemodule rom_cose( /產生cos信號模塊addra,clka,douta);inputclka;input9:0addra;output15:0douta;regsigned15:0douta;always (posedge clka) begin case(addra)10'd 0 : douta=16'd100 ;10'd 1 : douta=16'd100 ;10'd 2 : douta=16'd100 ;10'd 3 : douta=16'd100 ;10'd 4 : douta=16'd100 ; 10'd 1020 : douta=16'd100 ;10'd 1021 : douta=16'd100 ;10'd 1022 : douta=16

溫馨提示

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

評論

0/150

提交評論