ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-06-29 22:03:49  阅读:257  来源: 互联网

标签:wire 15 补码 Verilog 格式 相角 input reg 复数


相位偏转角估计(复数相角计算)---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

 

标签:wire,15,补码,Verilog,格式,相角,input,reg,复数
来源: https://www.cnblogs.com/chensimin1990/p/13210617.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有