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


    相位偏转角估计(复数相角计算)---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
  • 相关阅读:
    ASP.NET 概述
    用vs调试项目页面无样式
    eniac世界第二台计算机
    汇编语言
    操作系统发展史
    网站架构发展
    简单分布式系统构建知识
    Android常用adb命令
    USB 3.0规范中译本 第4章 超高速数据流模型
    ECMAScript 6 &ECMAScript 5(在线手册)
  • 原文地址:https://www.cnblogs.com/chensimin1990/p/13210617.html
Copyright © 2020-2023  润新知