| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333 |
- `timescale 1ns / 1ps
- //////////////////////////////////////////////////////////////////////////////////
- // Company:
- // Engineer:
- //
- // Create Date: 14:22:41 09/18/2019
- // Design Name:
- // Module Name: MeasCtrlModule
- // Project Name:
- // Target Devices:
- // Tool versions:
- // Description:
- //
- // Dependencies:
- //
- // Revision:
- // Revision 0.01 - File Created
- // Additional Comments:
- //
- //////////////////////////////////////////////////////////////////////////////////
- module MeasCtrlModule
- #(
- parameter WindPNumWidth = 48,
- localparam TukeyWinAlpha = 4
- )
- (
- input Clk_i,
- input Rst_i,
- output OscWind_o,
-
- input StartMeas_i,
- input StartMeasDsp_i,
- input [7:0] FilterCmd_i,
- input Mode_i,
- input OscDataRdFlag_i,
-
- input [32-1:0] MeasNum_i,
- input [WindPNumWidth-1:0] WindPointsNum_i,
-
- input [32-1:0] WindPhInc_i,
- input [32-1:0] WindPhIncStart_i,
- output [32-1:0] WindArg_o,
-
- output StartFpConv_o,
- output MeasWind_o,
- output MeasWindDel_o,
- output StopMeas_o,
- output MeasEnd_o,
- output WinCtrl_o,
- output [1:0] TukeyCtrl_o
- );
- //================================================================================
- // REG/WIRE
- reg startFpConv;
- reg [1:0] startFpConvPipe [3:0];
- integer i;
- reg measWind;
- reg measWindR;
-
- reg startMeasReg;
- reg startMeasDspReg;
- wire startMeasCmd = (StartMeas_i & !startMeasReg); //esli prihodit bol'she chem 1 sigtal zapuska na 1 izmerenie, to ostal'nie ignoriruutsya
- wire stopMeasCmd = (!StartMeasDsp_i & startMeasDspReg);
- wire startMeasDspPos = (StartMeasDsp_i & !startMeasDspReg);
-
- reg [31:0] measCnt;
-
- reg [WindPNumWidth-1:0] pNumCnt;
- reg measWindEnd;
- reg pMeasEnd;
- wire pNumCntRes = !measWind;
- wire measCntRes = pMeasEnd|!StartMeasDsp_i;
-
- wire stopCalc = (stopMeasCmd|measWindEnd);
- reg [32-1:0] windArg;
-
- wire oscMode = (Mode_i == 1'b1);
-
- reg oscWind;
-
- wire [31:0] tukeyCosPNum = WindPointsNum_i/TukeyWinAlpha;
-
- wire [31:0] tukeyCosPNumDiv2 = tukeyCosPNum/2;
- wire [31:0] tukeyFirstCosValues = tukeyCosPNum/2;
- wire [31:0] tukeyFirstCosValuesDiv2 = tukeyFirstCosValues/2;
- wire [31:0] tukeySecondCosValuesDiv2 = (WindPointsNum_i-tukeyFirstCosValuesDiv2);
- wire [31:0] tukeySecondCosValues = (WindPointsNum_i-tukeyCosPNum/2);
- reg [1:0] tukeyCtrl;
- reg [1:0] tukeyCtrlR;
- reg [1:0] tukeyCtrlRR;
-
- wire incPhase = (pNumCnt <= tukeyFirstCosValues);
- wire decrPhase = (pNumCnt >= tukeySecondCosValues-1 & pNumCnt <= WindPointsNum_i-1);
-
- wire wideFilterFlag = (FilterCmd_i>=8'h54 & FilterCmd_i!=8'h70);
- //================================================================================
- // ASSIGNMENTS
- assign StartFpConv_o = startFpConvPipe [2];
- assign MeasWind_o = measWind;
- assign MeasWindDel_o = measWindR;
- assign StopMeas_o = pMeasEnd;
- assign MeasEnd_o = stopMeasCmd;
- assign WindArg_o = windArg;
- assign OscWind_o = oscWind;
- assign TukeyCtrl_o = tukeyCtrl;
- assign WinCtrl_o = (pNumCnt<=tukeyFirstCosValuesDiv2+1|pNumCnt>tukeySecondCosValuesDiv2);
- //================================================================================
- // CODING
-
- always @(*) begin
- if (!Rst_i) begin
- if (measWind) begin
- if (pNumCnt != 0) begin
- if (pNumCnt <= tukeyFirstCosValues-1 | pNumCnt > tukeySecondCosValues) begin
- tukeyCtrl = 2'd2;
- end else begin
- tukeyCtrl = 2'd1;
- end
- end else begin
- tukeyCtrl = 2'd0;
- end
- end else begin
- tukeyCtrl = 2'd0;
- end
- end else begin
- tukeyCtrl = 2'd0;
- end
- end
-
- always @(posedge Clk_i) begin
- if (!Rst_i) begin
- measWindR <= measWind;
- end else begin
- measWindR <= 1'b0;
- end
- end
-
- always @(posedge Clk_i) begin
- if (!Rst_i) begin
- tukeyCtrlR <= tukeyCtrl;
- tukeyCtrlRR <= tukeyCtrlR;
- end else begin
- tukeyCtrlR <= 1'b0;
- tukeyCtrlRR <= 1'b0;
- end
- end
-
- always @(posedge Clk_i) begin
- if (!Rst_i) begin
- if (measWindR) begin
- if (pNumCnt == WindPointsNum_i-1) begin
- measWindEnd <= 1'b1;
- end else begin
- measWindEnd <= 1'b0;
- end
- end else begin
- measWindEnd <= 1'b0;
- end
- end else begin
- measWindEnd <= 1'b0;
- end
- end
-
- always @(posedge Clk_i) begin
- if (!Rst_i) begin
- if (!oscMode) begin
- if (measCnt == MeasNum_i-1) begin
- if (measWindEnd) begin
- pMeasEnd <= 1'b1;
- end else begin
- pMeasEnd <= 1'b0;
- end
- end else begin
- pMeasEnd <= 1'b0;
- end
- end else begin
- if (measCnt == MeasNum_i-1) begin
- if (OscDataRdFlag_i) begin
- pMeasEnd <= 1'b1;
- end else begin
- pMeasEnd <= 1'b0;
- end
- end else begin
- pMeasEnd <= 1'b0;
- end
- end
- end else begin
- pMeasEnd <= 1'b0;
- end
- end
-
- always @(posedge Clk_i) begin
- if (!Rst_i) begin
- if (wideFilterFlag) begin
- if (measWind) begin
- windArg <= windArg+WindPhInc_i;
- end else begin
- windArg <= WindPhInc_i>>1;
- end
- end else begin
- if (measWind) begin
- if (incPhase) begin
- windArg <= windArg+WindPhInc_i;
- end
- if (decrPhase) begin
- windArg <= windArg-WindPhInc_i;
- end
- end else begin
- windArg <= WindPhIncStart_i;
- end
- end
- end else begin
- windArg <= 0;
- end
- end
-
- always @(posedge Clk_i) begin
- if (!Rst_i) begin
- if (!measCntRes) begin
- if (!oscMode) begin
- if (measCnt != MeasNum_i-1) begin
- if (measWindEnd) begin
- measCnt <= measCnt+1;
- end
- end
- end else begin
- if (measCnt != MeasNum_i-1) begin
- if (OscDataRdFlag_i) begin
- measCnt <= measCnt+1;
- end
- end
- end
- end else begin
- measCnt <= 0;
- end
- end else begin
- measCnt <= 0;
- end
- end
-
- always @(posedge Clk_i) begin
- if (!Rst_i) begin
- if (oscMode) begin
- if (startMeasDspPos) begin
- oscWind <= 1'b1;
- end
- if (pMeasEnd) begin
- oscWind <= 1'b0;
- end
- end else begin
- oscWind <= 1'b0;
- end
- end else begin
- oscWind <= 1'b0;
- end
- end
-
- always @(posedge Clk_i) begin
- if (!Rst_i) begin
- if (measWindEnd) begin
- startFpConv <= 1'b1;
- end else begin
- startFpConv <= 1'b0;
- end
- end else begin
- startFpConv <= 1'b0;
- end
- end
- always @(posedge Clk_i) begin
- startFpConvPipe[0] <= startFpConv;
- for(i=1; i<4; i=i+1) begin
- startFpConvPipe [i]<=startFpConvPipe[i-1];
- end
- end
-
- always @(posedge Clk_i) begin
- if (!Rst_i) begin
- if (pNumCntRes) begin
- pNumCnt <= {WindPNumWidth{1'b0}};
- end else begin
- pNumCnt <= pNumCnt + {{WindPNumWidth-1{1'b0}},1'b1};
- end
- end else begin
- pNumCnt <= {WindPNumWidth{1'b0}};
- end
- end
- always @(posedge Clk_i) begin
- if (!Rst_i) begin
- startMeasReg <= StartMeas_i;
- end else begin
- startMeasReg <= 1'b0;
- end
- end
-
- always @(posedge Clk_i) begin
- if (!Rst_i) begin
- startMeasDspReg <= StartMeasDsp_i;
- end else begin
- startMeasDspReg <= 1'b0;
- end
- end
-
- always @(*) begin
- if (!Rst_i) begin
- if (StartMeasDsp_i) begin
- if (!measWind) begin
- if (startMeasCmd) begin
- measWind = 1'b1;
- end
- end else if (stopCalc) begin
- measWind = 1'b0;
- end
- end else begin
- measWind = 1'b0;
- end
- end else begin
- measWind = 1'b0;
- end
- end
- endmodule
|