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