博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

相位偏转角估计(复数相角计算)---Verilog

Posted on 2020-06-29 22:00  沉默改良者  阅读(2013)  评论(2编辑  收藏  举报

相位偏转角估计(复数相角计算)---Verilog

  1 /********************************************************************/
  2 /*模块名称:Estimation_Phase                                          ******///////
  3 /*                                                                    ******///////
  4 /*                                                                    ******///////
  5 /*模块功能:在Estimation_SlideWindow输出                              ******///////
  6 /*          脉冲有效SlideWindowOutEnable下                            ******///////
  7 /*          接收SlideWindowOutRe                                      ******///////
  8 /*             SlideWindowOutIm 2路数据并计算角度                          ******///////  
  9 /*             PhaseOut = artan(SlideWindowOutIm/SlideWindowOutRe)         ******///////
 10 /*          Cordic的默认数据格式为:                                      ******///////
 11 /*          输入数据Xin, Yin为1QN  补码格式 所有位数中1位符号位和1位整数位******///////
 12 /*          输出数据Pout      2QN    补码格式 所有位数中1位符号位和2位整数位 ******///////
 13 /*                                                                    ******///////
 14 /*                                                                    ******///////
 15 /*模块端口:1输入端口                                               ******///////  
 16 /*            Clk:  全局时钟                                               ******///////
 17 /*            Rst_n:   全局复位 异步                                       ******///////
 18 /*            DataInEnable:  数据输入有效                                  ******///////
 19 /*             DataInRe                                                   ******///////
 20 /*            DataInIm:          输入数据 经过位数缩短后的相关窗口累加值       ******///////
 21 /*                        补码格式                                            ******///////
 22 /*                        16位位宽 1位符号位 7位整数位 8位小数位              ******///////
 23 /*                                                                    ******///////
 24 /*          2,输出端口                                                   ******///////
 25 /*            PhaseOutEnable: 输出角度有效 脉冲有效                        ******///////
 26 /*            PhaseOut:         输出角度值 参照2QN格式                       ******///////
 27 /*                         补码格式                                           ******/////// 
 28 /*                         16位位宽 1位符号位 2位整数位 13位小数位            ******///////
 29 /*
 30 /*                                                                    ******///////
 31 
 32 
 33 /********************************************************************/
 34 module Estimation_phase(
 35 
 36     /*moduel clock */
 37     input                  wire                 Clk,
 38     /*the reset signal */
 39     input                  wire                 Rst_n,
 40     /*the enable of the input datas*/
 41     input                  wire                 DataInEnable,
 42     /*the input datas: the correlation results: signed 7QN format. 经过位数缩短后的相关窗口累加值******///////
 43     /*补码格式******///////
 44     /*16位位宽 1位符号位 7位整数位 8位小数位******///////
 45     input                  wire   [15:0]        DataInRe,
 46     input                  wire   [15:0]        DataInIm,
 47 
 48     output                 wire                 TempPhaseOutEnable,
 49     output                 wire   [15:0]        TempPhaseOut,
 50     /*输出角度有效 脉冲有效******///////
 51     output                 reg                  PhaseOutEnable,
 52     /*输出角度值 参照2QN格式******///////
 53     /*补码格式******///////
 54     /*16位位宽 1位符号位 2位整数位 13位小数位******///////
 55     output                 reg    [15:0]        PhaseOut);
 56 
 57 //-----------------------------------------------------------------------------
 58 //输入级缓存
 59 /*the enable signal buffer,输入数据有效缓存******///////
 60 reg BufferEnable;
 61 /*the input datas buffer,输入数缓存******///////
 62 reg [15:0] BufferDataRe;
 63 reg [15:0] BufferDataIm;
 64 always@(posedge Clk or negedge Rst_n)
 65 begin
 66     if (!Rst_n)
 67     begin
 68         /*输入数据有效缓存******///////
 69         BufferEnable <= 0;
 70         /*输入数据缓存******///////
 71         BufferDataRe <= 16'b00000000_00000000;
 72         BufferDataIm <= 16'b00000000_00000000;
 73     end
 74        else
 75     begin
 76            if (DataInEnable)
 77           begin
 78               /*输入数据有效下******///////
 79                 
 80             /*输入数据有效缓存******///////
 81             BufferEnable <= 1;
 82             /*输入数据缓存******///////
 83             BufferDataRe <= DataInRe;
 84             BufferDataIm <= DataInIm;
 85           end
 86         else
 87            begin
 88              /*//输入数据无效下******///////
 89     
 90               /*输入数据有效缓存******///////
 91                BufferEnable <= 0;
 92               /*输入数据缓存******///////
 93              BufferDataRe <= 16'b00000000_00000000;
 94             BufferDataIm <= 16'b00000000_00000000;          
 95           end
 96     end
 97 end
 98 
 99 //-----------------------------------------------------------------------------
100 //完成角度幅度限制
101 /*对输入累加值做幅度限制******///////
102 reg NewData;
103 reg [15:0] TempX;
104 reg [15:0] TempY;
105 always@(posedge Clk or negedge Rst_n)
106 begin
107        if (!Rst_n)
108        begin
109            /*//对输入累加值做幅度限制     ******///////       
110         NewData <= 0;
111         TempX <= 16'b00000000_00000000;
112         TempY <= 16'b00000000_00000000;
113      end
114     else
115       begin
116         if (BufferEnable)
117           begin
118               /*输入缓存的数据有效******///////
119              NewData <= 1;
120             /*对输入累加值做幅度限制******///////
121             /*对数据缓存 进行移位******///////
122             /*保存数据位 ******///////
123             /*在右移下 不会有数据扩展 所以直接从高位移入 符号位******///////
124             TempX <= {BufferDataRe[15],BufferDataRe[15:1]};
125             TempY <= {BufferDataIm[15],BufferDataIm[15:1]};
126           end
127         else
128            begin
129              /*//对输入累加值做幅度限制    ******///////
130             NewData <= 0;
131               TempX <= 16'b00000000_00000000;
132               TempY <= 16'b00000000_00000000;
133           end
134      end
135 end
136 
137 //-----------------------------------------------------------------------------
138 //调用Cordic计算角度模块
139 /*修改CordicDemo生成方式 由并行方式转换为串行方式******///////
140 wire TempRFD;
141 wire TempPhaseOutEnable;
142 wire [15:0] TempPhaseOut;
143 wire Rst;
144 assign Rst = ~Rst_n;
145 
146 cordicdemonew CordicDemoForPhase (
147     .x_in(TempX),
148     .y_in(TempY),
149     .nd(NewData),
150     .phase_out(TempPhaseOut),
151     .rdy(TempPhaseOutEnable),
152     .rfd(TempRFD),
153     .clk(Clk),
154     .sclr(Rst));
155 
156 //-----------------------------------------------------------------------------
157 
158 /*在Cordic角度计算完四次角度完后,对四次角度估计的结果进行累加******///////
159 reg [17:0]sum_phase;
160 reg sumEnable;
161 reg [1:0]dataIndex;
162 
163 always @(posedge Clk or negedge Rst_n)
164 begin
165     if(!Rst_n)
166     begin
167         sum_phase <= 0;
168         sumEnable <= 0;
169         dataIndex <= 0;
170     end
171     else
172     begin
173         if(TempPhaseOutEnable)
174         begin
175             dataIndex <= dataIndex + 1;
176             sum_phase <= sum_phase + {{2{TempPhaseOut[15]}},TempPhaseOut};
177             if(dataIndex == 2'b11)
178                 sumEnable <= 1;
179             else
180                 sumEnable <= 0;                        
181         end
182         else
183             sumEnable <= 0;
184 
185         if(PhaseOutEnable)
186             sum_phase <= 0;
187     end
188 end
189                     
190                             
191 //-----------------------------------------------------------------------------
192 //累加和获得后,对其先求平均除以4,再除以16,即总共右移6位
193 /*********************************输出级********************************/
194 
195 always@(posedge Clk or negedge Rst_n)
196 begin
197     if (!Rst_n)
198       begin
199         PhaseOutEnable <= 0;
200         PhaseOut <= 16'b00000000_00000000;
201     end
202     else
203     begin
204         if (sumEnable)
205         begin
206               PhaseOutEnable <= 1;
207             PhaseOut <= {{4{sum_phase[17]}},sum_phase[17:6]};//sum_phase>>2>>4;
208         end
209         else
210         begin
211             PhaseOutEnable <= 0;
212             PhaseOut <= 16'b00000000_00000000;
213         end
214     end
215 end
216 
217 
218 endmodule