|
|
@@ -0,0 +1,135 @@
|
|
|
+`timescale 1ns / 1ps
|
|
|
+
|
|
|
+module TableSinGen #(
|
|
|
+ parameter PHASE_WIDTH = 32,
|
|
|
+ parameter AMPLITUDE_BITS = 16,
|
|
|
+ parameter TABLE_SIZE = 512
|
|
|
+) (
|
|
|
+ input wire Clk_i,
|
|
|
+ input wire RstN_i,
|
|
|
+ input wire Val_i,
|
|
|
+ input wire [PHASE_WIDTH-1:0] PointsNum_i,
|
|
|
+ input wire [PHASE_WIDTH-1:0] PhaseIncr_i,
|
|
|
+ output reg signed [AMPLITUDE_BITS+1:0] WindSamplesOut_o,
|
|
|
+ output WindVal_o,
|
|
|
+ output FilterEnd_o
|
|
|
+);
|
|
|
+
|
|
|
+assign WindVal_o = winVal;
|
|
|
+assign FilterEnd_o = filterEnd;
|
|
|
+// assign WindSamplesOut_o = (WindVal_o)? winSample:0;
|
|
|
+assign WindSamplesOut_o = (WindVal_o)? {{2{winSample[AMPLITUDE_BITS-1]}},winSample}:0;
|
|
|
+
|
|
|
+logic signed [AMPLITUDE_BITS-1:0] cosValue2pi;
|
|
|
+logic signed [AMPLITUDE_BITS-1:0] cosValue4pi;
|
|
|
+
|
|
|
+parameter [AMPLITUDE_BITS-1:0] A0_COEFF_SCALED = 13978;
|
|
|
+parameter signed [AMPLITUDE_BITS-1:0] A1_COEFF_SCALED = 16270;
|
|
|
+parameter signed [AMPLITUDE_BITS-1:0] A2_COEFF_SCALED = 2518;
|
|
|
+
|
|
|
+logic signed [AMPLITUDE_BITS*2-1:0] a1CosMultProd;
|
|
|
+assign a1CosMultProd = A1_COEFF_SCALED*cosValue2pi;
|
|
|
+logic signed [AMPLITUDE_BITS-1:0] a1CosMultProdCut;
|
|
|
+assign a1CosMultProdCut = a1CosMultProd[AMPLITUDE_BITS*2-2-:AMPLITUDE_BITS];
|
|
|
+
|
|
|
+logic signed [AMPLITUDE_BITS*2-1:0] a2CosMultProd;
|
|
|
+assign a2CosMultProd = A2_COEFF_SCALED*cosValue4pi;
|
|
|
+logic signed [AMPLITUDE_BITS-1:0] a2CosMultProdCut;
|
|
|
+assign a2CosMultProdCut = a2CosMultProd[AMPLITUDE_BITS*2-2-:AMPLITUDE_BITS];
|
|
|
+
|
|
|
+logic signed [AMPLITUDE_BITS-1:0] a0a1Diff;
|
|
|
+assign a0a1Diff = A0_COEFF_SCALED - a1CosMultProdCut;
|
|
|
+
|
|
|
+logic signed [AMPLITUDE_BITS-1:0] winSample;
|
|
|
+// assign winSample = a0a1Diff + a2CosMultProdCut;
|
|
|
+
|
|
|
+// logic signed [AMPLITUDE_BITS-1:0] winSampleCorr;
|
|
|
+// assign winSampleCorr = winSample[AMPLITUDE_BITS-:AMPLITUDE_BITS];
|
|
|
+
|
|
|
+
|
|
|
+logic [31:0] pNumCnt;
|
|
|
+logic filterEnd;
|
|
|
+assign filterEnd = (pNumCnt==PointsNum_i);
|
|
|
+
|
|
|
+logic winVal;
|
|
|
+logic valR;
|
|
|
+assign winVal = (valR & !filterEnd);
|
|
|
+
|
|
|
+always_ff @(posedge Clk_i or negedge RstN_i) begin
|
|
|
+ if(~RstN_i) begin
|
|
|
+ valR <= 0;
|
|
|
+ end else begin
|
|
|
+ valR <= Val_i;
|
|
|
+ end
|
|
|
+end
|
|
|
+
|
|
|
+always_ff @(posedge Clk_i or negedge RstN_i) begin
|
|
|
+ if(~RstN_i) begin
|
|
|
+ winSample <= 0;
|
|
|
+ end else begin
|
|
|
+ if (Val_i) begin
|
|
|
+ winSample <= a0a1Diff + a2CosMultProdCut;
|
|
|
+ end else begin
|
|
|
+ winSample <= 0;
|
|
|
+ end
|
|
|
+ end
|
|
|
+end
|
|
|
+
|
|
|
+always_ff @(posedge Clk_i or negedge RstN_i) begin
|
|
|
+ if(~RstN_i) begin
|
|
|
+ pNumCnt <= 0;
|
|
|
+ end else begin
|
|
|
+ if (valR) begin
|
|
|
+ if (pNumCnt != PointsNum_i) begin
|
|
|
+ pNumCnt <= pNumCnt+1;
|
|
|
+ end
|
|
|
+ end else begin
|
|
|
+ pNumCnt <= 0;
|
|
|
+ end
|
|
|
+ end
|
|
|
+end
|
|
|
+// Регистры накопителей фазы
|
|
|
+reg [PHASE_WIDTH-1:0] phaseInc;
|
|
|
+always @(posedge Clk_i or negedge RstN_i) begin
|
|
|
+ if(~RstN_i) begin
|
|
|
+ phaseInc <= {PHASE_WIDTH{1'b0}};
|
|
|
+ end else begin
|
|
|
+ if (Val_i) begin
|
|
|
+ phaseInc <= phaseInc + PhaseIncr_i;
|
|
|
+ end else begin
|
|
|
+ phaseInc <= 0;
|
|
|
+ end
|
|
|
+ end
|
|
|
+end
|
|
|
+
|
|
|
+// Адрес в таблице (верхние разряды фазы)
|
|
|
+wire [8:0] lutAddrUpper = phaseInc[31:23];
|
|
|
+
|
|
|
+SinPeriodMem SinPeriodMem (
|
|
|
+ .a(lutAddrUpper), // input wire [8 : 0] a
|
|
|
+ .spo(cosValue2pi) // output wire [15 : 0] spo
|
|
|
+);
|
|
|
+
|
|
|
+SinPeriodMem4pi SinPeriodMem4pi (
|
|
|
+ .a(lutAddrUpper), // input wire [8 : 0] a
|
|
|
+ .spo(cosValue4pi) // output wire [15 : 0] spo
|
|
|
+);
|
|
|
+
|
|
|
+endmodule
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|