`timescale 1ns / 1ps (* keep_hierarchy = "yes" *) ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 18:00:25 07/10/2019 // Design Name: // Module Name: internal_dsp // Project Name: // Target Devices: // Tool versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module InternalDsp #( parameter AdcDataWidth = 14, parameter WindWidth = 18, parameter WindNcoPhIncWidth = 32, parameter NcoWidth = 18, parameter ChNum = 4, parameter ResultWidth = 32, parameter WinTypeWidth = 3, parameter BandCmdWidth = 8, parameter WindPNumWidth = 32, parameter WindNormCoefWidth = 32, parameter WindCorrCoefWidth = 32, parameter CmdDataRegWith = 24, parameter IntermediateWidth = 18, parameter CorrAdcDataWidth = 20, parameter AccWidth = 80 ) ( input wire Clk_i, input wire WindCalcClk_i, input wire Rst_i, input wire NcoRst_i, output wire OscWind_o, input wire [AdcDataWidth-1:0] Adc1ChT1Data_i, //A input wire [AdcDataWidth-1:0] Adc1ChR1Data_i, //R1 input wire [AdcDataWidth-1:0] Adc2ChR2Data_i, //R2 input wire [AdcDataWidth-1:0] Adc2ChT2Data_i, //B input wire GatingPulse_i, input wire StartMeas_i, input wire StartMeasDsp_i, input wire OscDataRdFlag_i, input wire [32-1:0] MeasNum_i, input wire [CmdDataRegWith-1:0] MeasCtrl_i, input wire [CmdDataRegWith-1:0] FilterCorrCoefL_i, input wire [CmdDataRegWith-1:0] FilterCorrCoefH_i, output wire EndMeas_o, input wire CalModeEn_i, output wire CalModeDone_o, input wire [CmdDataRegWith-1:0] IfFtwL_i, input wire [CmdDataRegWith-1:0] IfFtwH_i, output wire [ResultWidth-1:0] Adc1ImT1Data_o, output wire [ResultWidth-1:0] Adc1ReT1Data_o, output wire [ResultWidth-1:0] Adc1ImR1Data_o, output wire [ResultWidth-1:0] Adc1ReR1Data_o, //adc2 output wire [ResultWidth-1:0] Adc2ImR2Data_o, output wire [ResultWidth-1:0] Adc2ReR2Data_o, output wire [ResultWidth-1:0] Adc2ImT2Data_o, output wire [ResultWidth-1:0] Adc2ReT2Data_o, output wire [NcoWidth-1:0] NcoSin_o, output wire [NcoWidth-1:0] NcoCos_o, output wire MeasDataRdy_o, output wire MeasWind_o, output wire MeasEnd_o, output wire SampleStrobeGenRst_o ); //================================================================================ // REG/WIRE wire [WindNormCoefWidth-1:0] windNormCoef; wire [WindPNumWidth-1:0] windPointsNum; wire [WindPNumWidth-1:0] averageNoizeLvl; wire [WindNcoPhIncWidth-1:0] windPhInc; wire [WindNcoPhIncWidth-1:0] winPhIncStart; wire [WindWidth-1:0] wind; wire [NcoWidth-1:0] ncoCos; wire [NcoWidth-1:0] ncoSin; wire [CorrAdcDataWidth-1:0] adcDataBus [ChNum-1:0]; wire [CorrAdcDataWidth-1:0] adcDataBusExt [ChNum-1:0]; wire [CorrAdcDataWidth-1:0] gatedAdcDataBus [ChNum-1:0]; wire [CorrAdcDataWidth-1:0] calAdcData [ChNum-1:0]; wire [CorrAdcDataWidth-1:0] prngData; reg [CorrAdcDataWidth-1:0] prngDataBus [ChNum-1:0]; wire [ChNum-1:0] calDone; genvar g; integer i; wire [ResultWidth-1:0] resultImBus [ChNum-1:0]; wire [ResultWidth-1:0] resultReBus [ChNum-1:0]; wire [ChNum-1:0] resultValBus; wire measWind; wire measWindDelayed; wire stopMeas; wire [1:0] tukeyCtrl; reg [CmdDataRegWith-1:0] measCtrlReg; reg [32-1:0] windPointsNumReg; reg [32-1:0] measNumReg; reg [WindCorrCoefWidth-1:0] filterCorrCoeffReg; reg [CmdDataRegWith-1:0] ifFtwLReg; reg [CmdDataRegWith-1:0] ifFtwHReg; reg [CmdDataRegWith-1:0] filterCorrCoefLReg; reg [CmdDataRegWith-1:0] filterCorrCoefHReg; wire [31:0] windArg; wire [CorrAdcDataWidth-1:0] adc1ChT1DataGated = (GatingPulse_i)? adcDataBusExt[ChNum-4]:{CorrAdcDataWidth{1'b0}}; wire [CorrAdcDataWidth-1:0] adc1ChR1DataGated = (GatingPulse_i)? adcDataBusExt[ChNum-3]:{CorrAdcDataWidth{1'b0}}; wire [CorrAdcDataWidth-1:0] adc2ChR2DataGated = (GatingPulse_i)? adcDataBusExt[ChNum-2]:{CorrAdcDataWidth{1'b0}}; wire [CorrAdcDataWidth-1:0] adc2ChT2DataGated = (GatingPulse_i)? adcDataBusExt[ChNum-1]:{CorrAdcDataWidth{1'b0}}; wire [WindNcoPhIncWidth-1:0] ncoPhInc = {ifFtwHReg[0+:WindNcoPhIncWidth-CmdDataRegWith],ifFtwLReg}; //================================================================================ // ASSIGNMENTS assign adcDataBus [ChNum-1] = {{2{Adc2ChT2Data_i[AdcDataWidth-1]}},Adc2ChT2Data_i,4'b0}; assign adcDataBus [ChNum-2] = {{2{Adc2ChR2Data_i[AdcDataWidth-1]}},Adc2ChR2Data_i,4'b0}; assign adcDataBus [ChNum-3] = {{2{Adc1ChR1Data_i[AdcDataWidth-1]}},Adc1ChR1Data_i,4'b0}; assign adcDataBus [ChNum-4] = {{2{Adc1ChT1Data_i[AdcDataWidth-1]}},Adc1ChT1Data_i,4'b0}; assign adcDataBusExt [ChNum-1] = calAdcData [ChNum-1]+prngDataBus[ChNum-1]; assign adcDataBusExt [ChNum-2] = calAdcData [ChNum-2]+prngDataBus[ChNum-2]; assign adcDataBusExt [ChNum-3] = calAdcData [ChNum-3]+prngDataBus[ChNum-3]; assign adcDataBusExt [ChNum-4] = calAdcData [ChNum-4]+prngDataBus[ChNum-4]; assign gatedAdcDataBus [ChNum-1] = adc2ChT2DataGated; assign gatedAdcDataBus [ChNum-2] = adc2ChR2DataGated; assign gatedAdcDataBus [ChNum-3] = adc1ChR1DataGated; assign gatedAdcDataBus [ChNum-4] = adc1ChT1DataGated; assign Adc1ImT1Data_o = resultImBus [ChNum-4]; assign Adc1ReT1Data_o = resultReBus [ChNum-4]; assign Adc1ImR1Data_o = resultImBus [ChNum-3]; assign Adc1ReR1Data_o = resultReBus [ChNum-3]; //adc2 assign Adc2ImR2Data_o = resultImBus [ChNum-2]; assign Adc2ReR2Data_o = resultReBus [ChNum-2]; assign Adc2ImT2Data_o = resultImBus [ChNum-1]; assign Adc2ReT2Data_o = resultReBus [ChNum-1]; assign MeasDataRdy_o = &resultValBus; assign EndMeas_o = stopMeas; assign NcoCos_o = ncoCos; assign NcoSin_o = ncoSin; assign MeasWind_o = measWind; assign CalModeDone_o = &calDone; //================================================================================ // INSTANTIATIONS //---------------------------------------------- //Module generates event signals for measurement always @(posedge Clk_i) begin if (!Rst_i) begin if (!StartMeas_i) begin measCtrlReg <= MeasCtrl_i; ifFtwLReg <= IfFtwL_i; ifFtwHReg <= IfFtwH_i; filterCorrCoefLReg <= FilterCorrCoefL_i; filterCorrCoefHReg <= FilterCorrCoefH_i; measNumReg <= MeasNum_i; windPointsNumReg <= windPointsNum; end end else begin measCtrlReg <= 0; ifFtwLReg <= 0; ifFtwHReg <= 0; filterCorrCoefLReg <= 0; filterCorrCoefHReg <= 0; measNumReg <= 0; windPointsNumReg <= 0; end end MeasCtrlModule #( .WindPNumWidth (WindPNumWidth) ) MeasCtrlModule ( .Clk_i (Clk_i), .Rst_i (Rst_i), .OscWind_o (OscWind_o), .FilterCmd_i (measCtrlReg[15-:8]), .MeasNum_i (measNumReg), .StartMeas_i (StartMeas_i), .StartMeasDsp_i (StartMeasDsp_i), .Mode_i (measCtrlReg[0]), .OscDataRdFlag_i (OscDataRdFlag_i), .WindPointsNum_i (windPointsNumReg), .WindPhInc_i (windPhInc), .WindPhIncStart_i (winPhIncStart), .WindArg_o (windArg), .StartFpConv_o (StartFpConv), .MeasWind_o (measWind), .MeasWindDel_o (measWindDelayed), .StopMeas_o (stopMeas), .MeasEnd_o (MeasEnd_o), .WinCtrl_o (winCtrl), .TukeyCtrl_o (tukeyCtrl), .SampleStrobeGenRst_o (SampleStrobeGenRst_o) ); //---------------------------------------------- //Module selects settings for current window WinParameters #( .WindPhIncWidth (WindNcoPhIncWidth), .WindNormCoefWidth (WindNormCoefWidth), .WindPNumWidth (WindPNumWidth), .BandCmdWidth (BandCmdWidth) ) WinParameters ( .Clk_i (Clk_i), .Rst_i (Rst_i), .FilterCmd_i (measCtrlReg[15-:8]), .WinPhInc_o (windPhInc), .WinPhIncStart_o (winPhIncStart), .WinNormCoef_o (windNormCoef), .WinPointsNum_o (windPointsNum), .AverageNoiseLvl_o (averageNoizeLvl) ); //---------------------------------------------- //Module generates win samples Win_calc WinCalcInst ( .clk_i (Clk_i), .wind_clk (WindCalcClk_i), .filterCmd_i (measCtrlReg[15-:8]), .reset_i (Rst_i), .WinCtrl_i (winCtrl), .TukeyCtrl_i (tukeyCtrl), .MeasWind_i (measWind), .win_value_i (windArg), .win_type_i (measCtrlReg[2:0]), .win_o (wind) ); //---------------------------------------------- //Module generates Sin and Cos for measurement CordicNco #( .ODatWidth (NcoWidth), .PhIncWidth (WindNcoPhIncWidth), .IterNum (15), .EnSinN (0) ) ncoInst ( .Clk_i (Clk_i), .Rst_i (Rst_i|NcoRst_i), .Val_i (1'b1), .PhaseInc_i ({ifFtwHReg[0+:WindNcoPhIncWidth-CmdDataRegWith],ifFtwLReg}), .WindVal_i (1'b1), .WinType_i (), .Wind_o (), .Sin_o (ncoSin), .Cos_o (ncoCos), .Val_o () ); ComplPrng #( .DataPrngWidth (8), .InDataWidth (CorrAdcDataWidth), .OutDataWidth (CorrAdcDataWidth) ) ComplPrngAdderInst ( .Clk_i (Clk_i), .Rst_i (Rst_i), .PrngData_o (prngData) ); always @(posedge Clk_i) begin prngDataBus[0] <= prngData; for(i=1; i<4; i=i+1) begin prngDataBus [i]<=prngDataBus[i-1]; end end //------------------------------------------------ //Generating needed amount of calculating channels generate for (g=0; g