对应于所写QPSK调制的解调 1.0
一开始接收到的y都是0,从y变成1开始,说明收到的是调制信号了,其中收到的前8个时钟周期的是初始当输入信号是00时候的调制信号,但是我们可以利用它作为我们解调的开始。
当y变成1,则启动模8计数器,将y依次左移入8 bit寄存器,共8次,从而得到连续的8位y信号,然后根据其选择对应的解调信号输出
以clk为单位,则对应为:(左边为收到的调制信号,右边为解调输出)
1111 0000——0000 0000
0011 1100——1111 0000
0000 1111——1111 1111
1100 0011——0000 1111
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 module Dqpsk_1(clk,y,en,x,count,rg_y,rg_x
2 );
3 input clk; //时钟信号
4 input y; //接收到的调制信号
5 input en; //使能信号
6 output x; //输出解调结果
7 output [2:0] count; //计数
8 output [7:0] rg_y; //8bit寄存器,用来存放连续的8位调制信号
9 output [1:0] rg_x; //2bit寄存器,用来存放需要输出的2位解调结果
10
11 reg x;
12 reg [2:0] count;
13 reg [7:0] rg_y;
14 //reg [1:0] rg_x;
15 reg start; //用来启动计数
16
17 wire [1:0] rg_x;
18
19 assign rg_x=(en==0||count!=0)?2'b00: //根据收到的8位调制信号选择解调结果
20 (rg_y==8'b1111_0000)?2'b00:
21 (rg_y==8'b0011_1100)?2'b10:
22 (rg_y==8'b0000_1111)?2'b11:
23 (rg_y==8'b1100_0011)?2'b01:
24 2'b00;
25
26 initialbegin//初始化寄存器
27 start<=0;
28 x<=0;
29 count<=3'b000;
30 rg_y<=8'h00;
31 end
32
33 always @(posedge clk) begin//给start赋值
34 if(en==0) start<=0;
35 elseif(y==1) start<=1;
36 end
37
38 always @(posedge clk) begin//count开始计数
39 if(start==1)
40 begin
41 rg_y<={rg_y[6:0],y}; //将y依次移入rg_y
42 if(count==3'b111) count<=0; //当111变成000为移位最后一个周期,因而在count=000的时候,rg_y才是准备好的连续8位数据
43 elsebegin
44 if(count==3'b000) x<=rg_x[1];
45 elseif(count==3'b100) x<=rg_x[0];
46 else x<=x;
47 end
48 count<=count+1;
49 end
50 else count<=0;
51 end
52
53 endmodule
但是,可以看到由于一个周期的延迟,导致第一位没有移入rg_y,而导致丢失了一位。