基于verilog的16QAM调制
思路1:正交调幅法——实现16QAM调制,可以理解为时相位相差90度的两个正弦波的4PAM叠加。
4比特输入经过2->4进制转化得到两路2比特输入,然后分别经过4PAM后叠加所得输出即为16QAM调制结果。
具体程序稍后编写。
思路2:复合相移法——可以借助前面编写的QPSK,相当于两路幅度不同的QPSK的叠加,比如幅度分别取1和3 。
思路1正交调幅法的设计方案:
两正弦波相位差90°,因此至少采用4分频(360°/4=90°,在只考虑上升沿置位的情况下)。
为了使得输出波形富有正负幅值的特点,因此我生成的波是有正负的!!!非平常的1、0振幅波。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 module qam(x,clk,en,count,rg_cos,rg_sin,cos,sin,am_cos,am_sin,out_qam
2 );
3 input x; //串行输入
4 input clk; //时钟
5 input en;
6 output [1:0] count; //4分频计数器
7 output [1:0] rg_cos; //A3A2并行数据
8 output [1:0] rg_sin; //A1A0并行数据
9 output [2:0] cos; //根据当前rg_cos决定幅值产生的cos波
10 output [2:0] sin; //根据当前rg_sin决定幅值产生的90°相位差的sin波
11 output [2:0] am_cos; //cos波的幅值
12 output [2:0] am_sin; //sin波的幅值
13 output [3:0] out_qam; //16-qam的输出
14
15 reg [1:0] count;
16 reg [1:0] rg_cos;
17 reg [1:0] rg_sin;
18 reg [2:0] cos;
19 reg [2:0] sin;
20
21 wire [2:0] am_cos;
22 wire [2:0] am_sin;
23 wire [3:0] out_qam;
24
25 assign am_cos=(en==0)?0:(count!=00)?am_cos:(rg_cos==2'b00)?-3'd3:(rg_cos==2'b01)?-3'd1:(rg_cos==2'b11)?3'd1:3'd3; //随时根据rg值更新对应幅值
26 assign am_sin=(en==0)?0:(count!=00)?am_sin:(rg_sin==2'b00)?-3'd3:(rg_sin==2'b01)?-3'd1:(rg_sin==2'b11)?3'd1:3'd3;
27
28 assign out_qam=(en==0)?0:cos+sin;
29 //线类太好用了,无延迟!!!
30
31 always @(posedge clk) begin //产生四分频计数
32 if(en==0) count<=2'b00;
33 else begin
34 count<=count+1;
35 if(count==2'b11) count<=2'b00;
36 end
37 end
38
39 always @(posedge clk) begin //2进制-4进制转化;
40 if(en==0) begin
41 rg_cos<=2'b00;
42 rg_sin<=2'b00;
43 end
44 else begin
45 if(count==2'b00) rg_cos[1]<=x;
46 else if(count==2'b01) rg_cos[0]<=x;
47 else if(count==2'b10) rg_sin[1]<=x;
48 else rg_sin[0]<=x;
49 end
50 end
51
52 always @(posedge clk) begin //根据幅值生成周期的cos,sin波,均从count=0为开始,四个时钟周期为一周期
53 if(en==0) begin
54 cos<=0;
55 sin<=0;
56 end
57 else begin
58 if(count==2'b00) begin //sin为正,cos为负
59 sin<=am_sin;
60 cos<=~am_cos+1;
61 end
62 else if(count==2'b01) begin //cos变号
63 cos<=~cos+1;
64 end
65 else if(count==2'b10) begin //sin变号
66 sin<=~sin+1;
67 end
68 else begin //cos变号
69 cos<=~cos+1;
70 end
71 end
72 end
73
74 endmodule