QPSK解调1.1
之所以之前会有一位的延迟,导致y第一位的丢失,主要是因为start信号的延迟置位所引起的,因此可以把start信号设置为线型变量。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 module dqpsk(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
15 wire start;
16 wire [1:0] rg_x;
17
18 assign start=(y==1&&en==1)?1:(en==0)?0:start; //将start设置为线类,从而避免了延迟
19
20 assign rg_x=(en==0||count!=0)?2'b00: //根据收到的8位调制信号选择解调结果
21 (rg_y==8'b1111_0000)?2'b00:
22 (rg_y==8'b0011_1100)?2'b10:
23 (rg_y==8'b0000_1111)?2'b11:
24 (rg_y==8'b1100_0011)?2'b01:
25 2'b00;
26
27 initial begin //初始化寄存器
28 x<=0;
29 count<=3'b000;
30 rg_y<=8'h00;
31 end
32
33 always @(posedge clk) begin //count开始计数
34 if(start==1)
35 begin
36 rg_y<={rg_y[6:0],y}; //将y依次移入rg_y
37 if(count==3'b111) count<=0; //当111变成000为移位最后一个周期,因而在count=000的时候,rg_y才是准备好的连续8位数据
38 else begin
39 if(count==3'b000) x<=rg_x[1];
40 else if(count==3'b100) x<=rg_x[0];
41 else x<=x;
42 end
43 count<=count+1;
44 end
45 else count<=0;
46 end
47
48 endmodule
输出正确!