基于Verilog的QPSK调制
输入x,串行输入;
首先串行输入经过串并转化,从而每两比特组成一个符号,然后产生相位分别为0,45,90,135的不同波形,按照2bit的符号选择相应的输出。
程序采用8分频,所得输出y会延后对应的输入x8个clk周期(由于是8分频,8个周期对应1个符号,也就是2个比特,因此输入x每一个比特持续4个周期)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //要得到45度相位差别的四个波形,则优先??虑8进制,初始en=0,在en=1时进行赋值
2 module QPSK(clk,x,en,y,yy,quad,xx,count);
3
4 input x; //输入信号x
5 input en; //使能信号
6 input clk; //时钟
7 output y;
8 output [1:0] yy; //必须把yy,quad设置端口,否则编译不通过。原因不详。
9 output [3:0] quad;
10 output [1:0] xx;
11 output [2:0] count;
12
13 reg [1:0] yy;
14 reg [2:0] count; //采用二进制,之前的q从0~7估计不合理
15 reg [3:0] quad; //将四个相位分别对应于每一位
16 reg [1:0] xx;
17
18 wire y; //QPSK输出
19
20 assign y=(yy==2'b00)?quad[3]:(yy==2'b10)?quad[2]:(yy==2'b11)?quad[1]:(yy==2'b01)?quad[0]:0; //随时根据yy的值对QPSK输出进行赋值
21
22 always @(posedge clk) begin //产生计数
23 if(en==0) count<=3'b000;
24 else
25 begin
26 if(count==3'b111) count<=3'b000;
27 else count<=count+1;
28 end
29 end
30
31 always @(posedge clk) begin //产生不同相位波形
32 if(en==0) quad<=4'b0000;
33 else begin
34 case (count)
35 3'b000:quad<=4'b1001;
36 3'b010:quad<=4'b1100;
37 3'b100:quad<=4'b0110;
38 3'b110:quad<=4'b0011;
39 default:quad<=quad;
40 endcase
41 end
42 end
43
44 always @(posedge clk) begin //串并转化
45 if(en==0) begin
46 xx<=2'b00;
47 yy<=2'b00;
48 end
49 else begin
50 if(count==3'b000) begin
51 xx[1]<=x;
52 yy<=xx;
53 end
54 else if(count==3'b100) xx[0]<=x;
55 end
56 end
57
58 endmodule