Compare commits
12 Commits
52efa3a769
...
cdea3f4d6a
Author | SHA1 | Date |
---|---|---|
|
cdea3f4d6a | |
|
270d149d1f | |
|
79a0eae046 | |
|
22ceafb511 | |
|
5433610d48 | |
|
596b32273b | |
|
7057a430d1 | |
|
9c0a3a7acf | |
|
685e094c03 | |
|
84f84448df | |
|
e058191d12 | |
|
08484e4771 |
99
DW02_mult.v
99
DW02_mult.v
|
@ -1,99 +0,0 @@
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// This confidential and proprietary software may be used only
|
|
||||||
// as authorized by a licensing agreement from Synopsys Inc.
|
|
||||||
// In the event of publication, the following notice is applicable:
|
|
||||||
//
|
|
||||||
// (C) COPYRIGHT 1994 - 2018 SYNOPSYS INC.
|
|
||||||
// ALL RIGHTS RESERVED
|
|
||||||
//
|
|
||||||
// The entire notice above must be reproduced on all authorized
|
|
||||||
// copies.
|
|
||||||
//
|
|
||||||
// AUTHOR: KB WSFDB June 30, 1994
|
|
||||||
//
|
|
||||||
// VERSION: Simulation Architecture
|
|
||||||
//
|
|
||||||
// DesignWare_version: 714fe7a9
|
|
||||||
// DesignWare_release: O-2018.06-DWBB_201806.3
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
//-----------------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// ABSTRACT: Multiplier
|
|
||||||
// A_width-Bits * B_width-Bits => A_width+B_width Bits
|
|
||||||
// Operands A and B can be either both signed (two's complement) or
|
|
||||||
// both unsigned numbers. TC determines the coding of the input operands.
|
|
||||||
// ie. TC = '1' => signed multiplication
|
|
||||||
// TC = '0' => unsigned multiplication
|
|
||||||
//
|
|
||||||
// FIXED: by replacement with A tested working version
|
|
||||||
// that not only doesn't multiplies right it does it
|
|
||||||
// two times faster!
|
|
||||||
// RPH 07/17/2002
|
|
||||||
// Rewrote to comply with the new guidelines
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
module DW02_mult(A,B,TC,PRODUCT);
|
|
||||||
parameter integer A_width = 8;
|
|
||||||
parameter integer B_width = 8;
|
|
||||||
|
|
||||||
input [A_width-1:0] A;
|
|
||||||
input [B_width-1:0] B;
|
|
||||||
input TC;
|
|
||||||
output [A_width+B_width-1:0] PRODUCT;
|
|
||||||
|
|
||||||
wire [A_width+B_width-1:0] PRODUCT;
|
|
||||||
|
|
||||||
wire [A_width-1:0] temp_a;
|
|
||||||
wire [B_width-1:0] temp_b;
|
|
||||||
wire [A_width+B_width-2:0] long_temp1,long_temp2;
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------------
|
|
||||||
// Parameter legality check
|
|
||||||
//-------------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
initial begin : parameter_check
|
|
||||||
integer param_err_flg;
|
|
||||||
|
|
||||||
param_err_flg = 0;
|
|
||||||
|
|
||||||
|
|
||||||
if (A_width < 1) begin
|
|
||||||
param_err_flg = 1;
|
|
||||||
$display(
|
|
||||||
"ERROR: %m :\n Invalid value (%d) for parameter A_width (lower bound: 1)",
|
|
||||||
A_width );
|
|
||||||
end
|
|
||||||
|
|
||||||
if (B_width < 1) begin
|
|
||||||
param_err_flg = 1;
|
|
||||||
$display(
|
|
||||||
"ERROR: %m :\n Invalid value (%d) for parameter B_width (lower bound: 1)",
|
|
||||||
B_width );
|
|
||||||
end
|
|
||||||
|
|
||||||
if ( param_err_flg == 1) begin
|
|
||||||
$display(
|
|
||||||
"%m :\n Simulation aborted due to invalid parameter value(s)");
|
|
||||||
$finish;
|
|
||||||
end
|
|
||||||
|
|
||||||
end // parameter_check
|
|
||||||
|
|
||||||
|
|
||||||
assign temp_a = (A[A_width-1])? (~A + 1'b1) : A;
|
|
||||||
assign temp_b = (B[B_width-1])? (~B + 1'b1) : B;
|
|
||||||
|
|
||||||
assign long_temp1 = temp_a * temp_b;
|
|
||||||
assign long_temp2 = ~(long_temp1 - 1'b1);
|
|
||||||
|
|
||||||
assign PRODUCT = ((^(A ^ A) !== 1'b0) || (^(B ^ B) !== 1'b0) || (^(TC ^ TC) !== 1'b0) ) ? {A_width+B_width{1'bX}} :
|
|
||||||
(TC)? (((A[A_width-1] ^ B[B_width-1]) && (|long_temp1))?
|
|
||||||
{1'b1,long_temp2} : {1'b0,long_temp1})
|
|
||||||
: A * B;
|
|
||||||
endmodule
|
|
||||||
|
|
||||||
|
|
103
IIR_Filter.v
103
IIR_Filter.v
|
@ -1,103 +0,0 @@
|
||||||
module IIR_Filter (
|
|
||||||
clk,
|
|
||||||
rstn,
|
|
||||||
din_re,
|
|
||||||
din_im,
|
|
||||||
a_re,
|
|
||||||
a_im,
|
|
||||||
b_re,
|
|
||||||
b_im,
|
|
||||||
dout
|
|
||||||
);
|
|
||||||
|
|
||||||
input rstn;
|
|
||||||
input clk;
|
|
||||||
input signed [15:0] din_re;
|
|
||||||
input signed [15:0] din_im;
|
|
||||||
input signed [31:0] a_re;
|
|
||||||
input signed [31:0] a_im;
|
|
||||||
input signed [31:0] b_re;
|
|
||||||
input signed [31:0] b_im;
|
|
||||||
|
|
||||||
output signed [15:0] dout;
|
|
||||||
|
|
||||||
wire signed [48:0] mult_x_re;
|
|
||||||
wire signed [48:0] mult_x_im;
|
|
||||||
wire signed [54:0] mult_y_re;
|
|
||||||
wire signed [54:0] mult_y_im;
|
|
||||||
wire signed [15:0] dout_t;
|
|
||||||
wire signed [50:0] Ysum_re;
|
|
||||||
wire signed [50:0] Ysum_im;
|
|
||||||
|
|
||||||
reg signed [15:0] dout_r1;
|
|
||||||
reg signed [50:0] YsumR_re;
|
|
||||||
reg signed [50:0] YsumR_im;
|
|
||||||
reg signed [50:0] YsumR1_re;
|
|
||||||
reg signed [50:0] YsumR1_im;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
mult_C #(16,16,32,32) inst_c1 ( .a (din_re ),
|
|
||||||
.b (din_im ),
|
|
||||||
.c (a_re ),
|
|
||||||
.d (a_im ),
|
|
||||||
.Re (mult_x_re ),
|
|
||||||
.Im (mult_x_im )
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
mult_C #(32,32,32,32) inst_c2 ( .a (YsumR_re ),
|
|
||||||
.b (YsumR_im ),
|
|
||||||
.c (b_re ),
|
|
||||||
.d (b_im ),
|
|
||||||
.Re (mult_y_re ),
|
|
||||||
.Im (mult_y_im )
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
assign Ysum_re = mult_x_re - mult_y_re;
|
|
||||||
assign Ysum_im = mult_x_im - mult_y_im;
|
|
||||||
|
|
||||||
|
|
||||||
always @(posedge clk or negedge rstn)
|
|
||||||
if (!rstn)
|
|
||||||
begin
|
|
||||||
YsumR_re <= 'h0;
|
|
||||||
YsumR_im <= 'h0;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
YsumR_re <= {{20{Ysum_re[50]}},Ysum_re[50:20]} + Ysum_re[50];
|
|
||||||
YsumR_im <= {{20{Ysum_im[50]}},Ysum_im[50:20]} + Ysum_im[50];
|
|
||||||
end
|
|
||||||
|
|
||||||
always @(posedge clk or negedge rstn)
|
|
||||||
if (!rstn)
|
|
||||||
begin
|
|
||||||
YsumR1_re <= 'h0;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
YsumR1_re <= {{16{YsumR_re[50]}},YsumR_re[50:16]};
|
|
||||||
end
|
|
||||||
|
|
||||||
always @(posedge clk or negedge rstn)
|
|
||||||
if (!rstn)
|
|
||||||
begin
|
|
||||||
dout_r1 <= 'h0;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
|
|
||||||
if(YsumR1_re[16:15]==2'b01)
|
|
||||||
dout_r1 <= 16'd32767;
|
|
||||||
else if(YsumR1_re[16:15]==2'b10)
|
|
||||||
dout_r1 <= -16'd32768;
|
|
||||||
else
|
|
||||||
dout_r1 <= YsumR1_re[15:0];
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
assign dout = dout_r1;
|
|
||||||
|
|
||||||
endmodule
|
|
209
TailCorr_top.v
209
TailCorr_top.v
|
@ -1,209 +0,0 @@
|
||||||
module TailCorr_top
|
|
||||||
|
|
||||||
(
|
|
||||||
clk,
|
|
||||||
rstn,
|
|
||||||
din_re,
|
|
||||||
din_im,
|
|
||||||
a0_re,
|
|
||||||
a0_im,
|
|
||||||
b0_re,
|
|
||||||
b0_im,
|
|
||||||
a1_re,
|
|
||||||
a1_im,
|
|
||||||
b1_re,
|
|
||||||
b1_im,
|
|
||||||
a2_re,
|
|
||||||
a2_im,
|
|
||||||
b2_re,
|
|
||||||
b2_im,
|
|
||||||
a3_re,
|
|
||||||
a3_im,
|
|
||||||
b3_re,
|
|
||||||
b3_im,
|
|
||||||
a4_re,
|
|
||||||
a4_im,
|
|
||||||
b4_re,
|
|
||||||
b4_im,
|
|
||||||
a5_re,
|
|
||||||
a5_im,
|
|
||||||
b5_re,
|
|
||||||
b5_im,
|
|
||||||
dout
|
|
||||||
);
|
|
||||||
|
|
||||||
input rstn;
|
|
||||||
input clk;
|
|
||||||
input signed [15:0] din_re;
|
|
||||||
input signed [15:0] din_im;
|
|
||||||
input signed [31:0] a0_re;
|
|
||||||
input signed [31:0] a0_im;
|
|
||||||
input signed [31:0] b0_re;
|
|
||||||
input signed [31:0] b0_im;
|
|
||||||
input signed [31:0] a1_re;
|
|
||||||
input signed [31:0] a1_im;
|
|
||||||
input signed [31:0] b1_re;
|
|
||||||
input signed [31:0] b1_im;
|
|
||||||
input signed [31:0] a2_re;
|
|
||||||
input signed [31:0] a2_im;
|
|
||||||
input signed [31:0] b2_re;
|
|
||||||
input signed [31:0] b2_im;
|
|
||||||
input signed [31:0] a3_re;
|
|
||||||
input signed [31:0] a3_im;
|
|
||||||
input signed [31:0] b3_re;
|
|
||||||
input signed [31:0] b3_im;
|
|
||||||
input signed [31:0] a4_re;
|
|
||||||
input signed [31:0] a4_im;
|
|
||||||
input signed [31:0] b4_re;
|
|
||||||
input signed [31:0] b4_im;
|
|
||||||
input signed [31:0] a5_re;
|
|
||||||
input signed [31:0] a5_im;
|
|
||||||
input signed [31:0] b5_re;
|
|
||||||
input signed [31:0] b5_im;
|
|
||||||
|
|
||||||
output signed [15:0] dout;
|
|
||||||
|
|
||||||
|
|
||||||
wire signed [15:0] IIRin_re;
|
|
||||||
wire signed [15:0] IIRin_im;
|
|
||||||
wire signed [15:0] dout_0;
|
|
||||||
wire signed [15:0] dout_1;
|
|
||||||
wire signed [15:0] dout_2;
|
|
||||||
wire signed [15:0] dout_3;
|
|
||||||
wire signed [15:0] dout_4;
|
|
||||||
wire signed [15:0] dout_5;
|
|
||||||
wire signed [18:0] Ysum;
|
|
||||||
|
|
||||||
reg signed [15:0] din_r0;
|
|
||||||
reg signed [15:0] din_r1;
|
|
||||||
reg signed [15:0] din_r2;
|
|
||||||
reg signed [15:0] din_r3;
|
|
||||||
reg signed [15:0] din_r4;
|
|
||||||
reg signed [15:0] dout_r;
|
|
||||||
|
|
||||||
diff inst_diffRe
|
|
||||||
(
|
|
||||||
.clk (clk ),
|
|
||||||
.rstn (rstn ),
|
|
||||||
.din (din_re ),
|
|
||||||
.dout (IIRin_re )
|
|
||||||
);
|
|
||||||
|
|
||||||
diff inst_diffIm
|
|
||||||
(
|
|
||||||
.clk (clk ),
|
|
||||||
.rstn (rstn ),
|
|
||||||
.din (din_im ),
|
|
||||||
.dout (IIRin_im )
|
|
||||||
);
|
|
||||||
|
|
||||||
IIR_Filter inst_iir_0 (
|
|
||||||
.clk (clk ),
|
|
||||||
.rstn (rstn ),
|
|
||||||
.din_re (IIRin_re ),
|
|
||||||
.din_im (IIRin_im ),
|
|
||||||
.a_re (a0_re ),
|
|
||||||
.a_im (a0_im ),
|
|
||||||
.b_re (b0_re ),
|
|
||||||
.b_im (b0_im ),
|
|
||||||
.dout (dout_0 )
|
|
||||||
);
|
|
||||||
|
|
||||||
IIR_Filter inst_iir_1 (
|
|
||||||
.clk (clk ),
|
|
||||||
.rstn (rstn ),
|
|
||||||
.din_re (IIRin_re ),
|
|
||||||
.din_im (IIRin_im ),
|
|
||||||
.a_re (a1_re ),
|
|
||||||
.a_im (a1_im ),
|
|
||||||
.b_re (b1_re ),
|
|
||||||
.b_im (b1_im ),
|
|
||||||
.dout (dout_1 )
|
|
||||||
);
|
|
||||||
|
|
||||||
IIR_Filter inst_iir_2 (
|
|
||||||
.clk (clk ),
|
|
||||||
.rstn (rstn ),
|
|
||||||
.din_re (IIRin_re ),
|
|
||||||
.din_im (IIRin_im ),
|
|
||||||
.a_re (a2_re ),
|
|
||||||
.a_im (a2_im ),
|
|
||||||
.b_re (b2_re ),
|
|
||||||
.b_im (b2_im ),
|
|
||||||
.dout (dout_2 )
|
|
||||||
);
|
|
||||||
|
|
||||||
IIR_Filter inst_iir_3 (
|
|
||||||
.clk (clk ),
|
|
||||||
.rstn (rstn ),
|
|
||||||
.din_re (IIRin_re ),
|
|
||||||
.din_im (IIRin_im ),
|
|
||||||
.a_re (a3_re ),
|
|
||||||
.a_im (a3_im ),
|
|
||||||
.b_re (b3_re ),
|
|
||||||
.b_im (b3_im ),
|
|
||||||
.dout (dout_3 )
|
|
||||||
);
|
|
||||||
|
|
||||||
IIR_Filter inst_iir_4 (
|
|
||||||
.clk (clk ),
|
|
||||||
.rstn (rstn ),
|
|
||||||
.din_re (IIRin_re ),
|
|
||||||
.din_im (IIRin_im ),
|
|
||||||
.a_re (a4_re ),
|
|
||||||
.a_im (a4_im ),
|
|
||||||
.b_re (b4_re ),
|
|
||||||
.b_im (b4_im ),
|
|
||||||
.dout (dout_4 )
|
|
||||||
);
|
|
||||||
|
|
||||||
IIR_Filter inst_iir_5 (
|
|
||||||
.clk (clk ),
|
|
||||||
.rstn (rstn ),
|
|
||||||
.din_re (IIRin_re ),
|
|
||||||
.din_im (IIRin_im ),
|
|
||||||
.a_re (a5_re ),
|
|
||||||
.a_im (a5_im ),
|
|
||||||
.b_re (b5_re ),
|
|
||||||
.b_im (b5_im ),
|
|
||||||
.dout (dout_5 )
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
always @(posedge clk or negedge rstn)
|
|
||||||
if (!rstn)
|
|
||||||
begin
|
|
||||||
din_r0 <= 'h0;
|
|
||||||
din_r1 <= 'h0;
|
|
||||||
din_r2 <= 'h0;
|
|
||||||
din_r3 <= 'h0;
|
|
||||||
din_r4 <= 'h0;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
din_r0 <= din_re;
|
|
||||||
din_r1 <= din_r0;
|
|
||||||
din_r2 <= din_r1;
|
|
||||||
din_r3 <= din_r2;
|
|
||||||
din_r4 <= din_r3;
|
|
||||||
end
|
|
||||||
|
|
||||||
assign Ysum = dout_0 + dout_1 + dout_2 + dout_3 + dout_4 + dout_5 + din_r4;
|
|
||||||
|
|
||||||
always@(posedge clk or negedge rstn)
|
|
||||||
if (!rstn)
|
|
||||||
begin
|
|
||||||
dout_r <= 'h0;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
if(Ysum[16:15]==2'b01)
|
|
||||||
dout_r <= 16'd32767;
|
|
||||||
else if(Ysum[16:15]==2'b10)
|
|
||||||
dout_r <= -16'd32768;
|
|
||||||
else
|
|
||||||
dout_r <= Ysum[15:0];
|
|
||||||
end
|
|
||||||
assign dout = dout_r;
|
|
||||||
endmodule
|
|
||||||
|
|
37
diff.v
37
diff.v
|
@ -1,37 +0,0 @@
|
||||||
module diff(
|
|
||||||
clk,
|
|
||||||
rstn,
|
|
||||||
din,
|
|
||||||
dout
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
input rstn;
|
|
||||||
input clk;
|
|
||||||
input signed [15:0] din;
|
|
||||||
|
|
||||||
output signed [15:0] dout;
|
|
||||||
|
|
||||||
|
|
||||||
reg [15:0] din_r;
|
|
||||||
reg [15:0] din_r1;
|
|
||||||
reg [15:0] out_r;
|
|
||||||
|
|
||||||
always@(posedge clk or negedge rstn)
|
|
||||||
if(!rstn)
|
|
||||||
begin
|
|
||||||
din_r <= 16'd0;
|
|
||||||
din_r1 <= 16'd0;
|
|
||||||
|
|
||||||
out_r <= 16'd0;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
din_r <= din;
|
|
||||||
din_r1 <= din_r;
|
|
||||||
|
|
||||||
out_r <= din_r - din_r1;
|
|
||||||
end
|
|
||||||
assign dout = out_r;
|
|
||||||
|
|
||||||
endmodule
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,84 @@
|
||||||
|
|
||||||
|
//+FHDR--------------------------------------------------------------------------------------------------------
|
||||||
|
// Company:
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// File Name : Z_dsp.v
|
||||||
|
// Department :
|
||||||
|
// Author : thfu
|
||||||
|
// Author's Tel :
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Relese History
|
||||||
|
// Version Date Author Description
|
||||||
|
// 0.3 2024-11-09 thfu to fit the addition of IP core
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Keywords :
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Parameter
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Purpose :
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Target Device:
|
||||||
|
// Tool versions:
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Reuse Issues
|
||||||
|
// Reset Strategy:
|
||||||
|
// Clock Domains:
|
||||||
|
// Critical Timing:
|
||||||
|
// Asynchronous I/F:
|
||||||
|
// Synthesizable (y/n):
|
||||||
|
// Other:
|
||||||
|
//-FHDR--------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
module z_dsp
|
||||||
|
(
|
||||||
|
input clk,
|
||||||
|
input rstn,
|
||||||
|
input en, //enable
|
||||||
|
input [1:0] dac_mode_sel, //2'b00:NRZ mode;2'b01:Double data mode;
|
||||||
|
//2'b10:Double Double data mode;2'b11:reserve;
|
||||||
|
input tc_bypass,
|
||||||
|
input [1:0] intp_mode, //2'b00:x1;2'b01:x2,'b10:x4;other:reserve;
|
||||||
|
input vldi,
|
||||||
|
input signed [15:0] din_re,
|
||||||
|
input signed [15:0] din_im,
|
||||||
|
input signed [31:0] a0_re, //a0's real part
|
||||||
|
input signed [31:0] a0_im, //a0's image part
|
||||||
|
input signed [31:0] b0_re,
|
||||||
|
input signed [31:0] b0_im,
|
||||||
|
input signed [31:0] a1_re,
|
||||||
|
input signed [31:0] a1_im,
|
||||||
|
input signed [31:0] b1_re,
|
||||||
|
input signed [31:0] b1_im,
|
||||||
|
input signed [31:0] a2_re,
|
||||||
|
input signed [31:0] a2_im,
|
||||||
|
input signed [31:0] b2_re,
|
||||||
|
input signed [31:0] b2_im,
|
||||||
|
input signed [31:0] a3_re,
|
||||||
|
input signed [31:0] a3_im,
|
||||||
|
input signed [31:0] b3_re,
|
||||||
|
input signed [31:0] b3_im,
|
||||||
|
input signed [31:0] a4_re,
|
||||||
|
input signed [31:0] a4_im,
|
||||||
|
input signed [31:0] b4_re,
|
||||||
|
input signed [31:0] b4_im,
|
||||||
|
input signed [31:0] a5_re,
|
||||||
|
input signed [31:0] a5_im,
|
||||||
|
input signed [31:0] b5_re,
|
||||||
|
input signed [31:0] b5_im,
|
||||||
|
output signed [15:0] dout0,
|
||||||
|
output signed [15:0] dout1,
|
||||||
|
output signed [15:0] dout2,
|
||||||
|
output signed [15:0] dout3,
|
||||||
|
output vldo,
|
||||||
|
output saturation_0,
|
||||||
|
output saturation_1,
|
||||||
|
output saturation_2,
|
||||||
|
output saturation_3,
|
||||||
|
output saturation_4,
|
||||||
|
output saturation_5
|
||||||
|
);
|
||||||
|
|
||||||
|
endmodule
|
File diff suppressed because it is too large
Load Diff
53
mulc_C.v
53
mulc_C.v
|
@ -1,53 +0,0 @@
|
||||||
module mult_C(
|
|
||||||
a,
|
|
||||||
b,
|
|
||||||
c,
|
|
||||||
d,
|
|
||||||
Re,
|
|
||||||
Im
|
|
||||||
);
|
|
||||||
|
|
||||||
parameter integer A_width = 8;
|
|
||||||
parameter integer B_width = 8;
|
|
||||||
parameter integer C_width = 8;
|
|
||||||
parameter integer D_width = 8;
|
|
||||||
|
|
||||||
input signed [A_width-1:0] a;
|
|
||||||
input signed [B_width-1:0] b;
|
|
||||||
input signed [C_width-1:0] c;
|
|
||||||
input signed [D_width-1:0] d;
|
|
||||||
|
|
||||||
output signed [A_width+C_width:0] Re;
|
|
||||||
output signed [A_width+D_width:0] Im;
|
|
||||||
|
|
||||||
wire signed [A_width+C_width-1:0] ac;
|
|
||||||
wire signed [B_width+D_width-1:0] bd;
|
|
||||||
wire signed [A_width+D_width-1:0] ad;
|
|
||||||
wire signed [B_width+C_width-1:0] bc;
|
|
||||||
|
|
||||||
DW02_mult #(A_width,C_width) inst_c1( .A (a ),
|
|
||||||
.B (c ),
|
|
||||||
.TC (1'b1 ),
|
|
||||||
.PRODUCT (ac )
|
|
||||||
);
|
|
||||||
|
|
||||||
DW02_mult #(B_width,D_width) inst_c2( .A (b ),
|
|
||||||
.B (d ),
|
|
||||||
.TC (1'b1 ),
|
|
||||||
.PRODUCT (bd )
|
|
||||||
);
|
|
||||||
|
|
||||||
DW02_mult #(A_width,D_width) inst_c3( .A (a ),
|
|
||||||
.B (d ),
|
|
||||||
.TC (1'b1 ),
|
|
||||||
.PRODUCT (ad )
|
|
||||||
);
|
|
||||||
DW02_mult #(B_width,C_width) inst_c4( .A (b ),
|
|
||||||
.B (c ),
|
|
||||||
.TC (1'b1 ),
|
|
||||||
.PRODUCT (bc )
|
|
||||||
);
|
|
||||||
assign Re = ac - bd;
|
|
||||||
assign Im = ad + bc;
|
|
||||||
|
|
||||||
endmodule
|
|
|
@ -0,0 +1,150 @@
|
||||||
|
module COEF_C(
|
||||||
|
index ,
|
||||||
|
C0_C ,
|
||||||
|
C1_C ,
|
||||||
|
C2_C
|
||||||
|
);
|
||||||
|
input [4:0] index;
|
||||||
|
|
||||||
|
output [17:0] C0_C;
|
||||||
|
output [11:0] C1_C;
|
||||||
|
output [5:0] C2_C;
|
||||||
|
|
||||||
|
reg [17:0] C0_C;
|
||||||
|
reg [11:0] C1_C;
|
||||||
|
reg [5:0] C2_C;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------
|
||||||
|
//----C0_C OK
|
||||||
|
always@(*)
|
||||||
|
begin
|
||||||
|
|
||||||
|
case(index)
|
||||||
|
5'd 0 : C0_C =18'h3ffff;
|
||||||
|
5'd 1 : C0_C =18'h3ffb1;
|
||||||
|
5'd 2 : C0_C =18'h3fec4;
|
||||||
|
5'd 3 : C0_C =18'h3fd3a;
|
||||||
|
5'd 4 : C0_C =18'h3fb12;
|
||||||
|
5'd 5 : C0_C =18'h3f84d;
|
||||||
|
5'd 6 : C0_C =18'h3f4eb;
|
||||||
|
5'd 7 : C0_C =18'h3f0ed;
|
||||||
|
5'd 8 : C0_C =18'h3ec53;
|
||||||
|
5'd 9 : C0_C =18'h3e71e;
|
||||||
|
5'd10 : C0_C =18'h3e150;
|
||||||
|
5'd11 : C0_C =18'h3dae8;
|
||||||
|
5'd12 : C0_C =18'h3d3e8;
|
||||||
|
5'd13 : C0_C =18'h3cc51;
|
||||||
|
5'd14 : C0_C =18'h3c424;
|
||||||
|
5'd15 : C0_C =18'h3bb62;
|
||||||
|
5'd16 : C0_C =18'h3b20d;
|
||||||
|
5'd17 : C0_C =18'h3a827;
|
||||||
|
5'd18 : C0_C =18'h39daf;
|
||||||
|
5'd19 : C0_C =18'h392a9;
|
||||||
|
5'd20 : C0_C =18'h38716;
|
||||||
|
5'd21 : C0_C =18'h37af8;
|
||||||
|
5'd22 : C0_C =18'h36e50;
|
||||||
|
5'd23 : C0_C =18'h36121;
|
||||||
|
5'd24 : C0_C =18'h3536d;
|
||||||
|
5'd25 : C0_C =18'h34535;
|
||||||
|
5'd26 : C0_C =18'h3367c;
|
||||||
|
5'd27 : C0_C =18'h32744;
|
||||||
|
5'd28 : C0_C =18'h31790;
|
||||||
|
5'd29 : C0_C =18'h30762;
|
||||||
|
5'd30 : C0_C =18'h2f6bc;
|
||||||
|
5'd31 : C0_C =18'h2e5a1;
|
||||||
|
// default : C0_C = C0_C;
|
||||||
|
endcase
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
//------------------------
|
||||||
|
//----C1_C OK
|
||||||
|
always@(*)
|
||||||
|
begin
|
||||||
|
|
||||||
|
case(index)
|
||||||
|
5'd 0 : C1_C =12'd 0;
|
||||||
|
5'd 1 : C1_C =12'd 79;
|
||||||
|
5'd 2 : C1_C =12'd 158;
|
||||||
|
5'd 3 : C1_C =12'd 237;
|
||||||
|
5'd 4 : C1_C =12'd 315;
|
||||||
|
5'd 5 : C1_C =12'd 394;
|
||||||
|
5'd 6 : C1_C =12'd 472;
|
||||||
|
5'd 7 : C1_C =12'd 550;
|
||||||
|
5'd 8 : C1_C =12'd 628;
|
||||||
|
5'd 9 : C1_C =12'd 705;
|
||||||
|
5'd10 : C1_C =12'd 782;
|
||||||
|
5'd11 : C1_C =12'd 858;
|
||||||
|
5'd12 : C1_C =12'd 934;
|
||||||
|
5'd13 : C1_C =12'd1009;
|
||||||
|
5'd14 : C1_C =12'd1084;
|
||||||
|
5'd15 : C1_C =12'd1158;
|
||||||
|
5'd16 : C1_C =12'd1231;
|
||||||
|
5'd17 : C1_C =12'd1304;
|
||||||
|
5'd18 : C1_C =12'd1376;
|
||||||
|
5'd19 : C1_C =12'd1446;
|
||||||
|
5'd20 : C1_C =12'd1517;
|
||||||
|
5'd21 : C1_C =12'd1586;
|
||||||
|
5'd22 : C1_C =12'd1654;
|
||||||
|
5'd23 : C1_C =12'd1721;
|
||||||
|
5'd24 : C1_C =12'd1787;
|
||||||
|
5'd25 : C1_C =12'd1852;
|
||||||
|
5'd26 : C1_C =12'd1916;
|
||||||
|
5'd27 : C1_C =12'd1979;
|
||||||
|
5'd28 : C1_C =12'd2041;
|
||||||
|
5'd29 : C1_C =12'd2101;
|
||||||
|
5'd30 : C1_C =12'd2161;
|
||||||
|
5'd31 : C1_C =12'd2218;
|
||||||
|
// default : C1_C = C1_C;
|
||||||
|
endcase
|
||||||
|
|
||||||
|
end
|
||||||
|
//------------------------
|
||||||
|
//----C2_C
|
||||||
|
always@(*)
|
||||||
|
begin
|
||||||
|
|
||||||
|
|
||||||
|
case(index)
|
||||||
|
5'd 0 : C2_C =6'd39;
|
||||||
|
5'd 1 : C2_C =6'd39;
|
||||||
|
5'd 2 : C2_C =6'd39;
|
||||||
|
5'd 3 : C2_C =6'd39;
|
||||||
|
5'd 4 : C2_C =6'd39;
|
||||||
|
5'd 5 : C2_C =6'd39;
|
||||||
|
5'd 6 : C2_C =6'd39;
|
||||||
|
5'd 7 : C2_C =6'd39;
|
||||||
|
5'd 8 : C2_C =6'd39;
|
||||||
|
5'd 9 : C2_C =6'd38;
|
||||||
|
5'd10 : C2_C =6'd38;
|
||||||
|
5'd11 : C2_C =6'd38;
|
||||||
|
5'd12 : C2_C =6'd38;
|
||||||
|
5'd13 : C2_C =6'd37;
|
||||||
|
5'd14 : C2_C =6'd37;
|
||||||
|
5'd15 : C2_C =6'd37;
|
||||||
|
5'd16 : C2_C =6'd36;
|
||||||
|
5'd17 : C2_C =6'd36;
|
||||||
|
5'd18 : C2_C =6'd35;
|
||||||
|
5'd19 : C2_C =6'd35;
|
||||||
|
5'd20 : C2_C =6'd35;
|
||||||
|
5'd21 : C2_C =6'd34;
|
||||||
|
5'd22 : C2_C =6'd34;
|
||||||
|
5'd23 : C2_C =6'd33;
|
||||||
|
5'd24 : C2_C =6'd33;
|
||||||
|
5'd25 : C2_C =6'd32;
|
||||||
|
5'd26 : C2_C =6'd31;
|
||||||
|
5'd27 : C2_C =6'd31;
|
||||||
|
5'd28 : C2_C =6'd30;
|
||||||
|
5'd29 : C2_C =6'd30;
|
||||||
|
5'd30 : C2_C =6'd29;
|
||||||
|
5'd31 : C2_C =6'd28;
|
||||||
|
// default : C2_C = C2_C;
|
||||||
|
endcase
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,155 @@
|
||||||
|
module COEF_S(
|
||||||
|
|
||||||
|
index ,
|
||||||
|
C0_S ,
|
||||||
|
C1_S ,
|
||||||
|
C2_S
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
input [4:0] index;
|
||||||
|
|
||||||
|
output [17:0] C0_S;
|
||||||
|
output [11:0] C1_S;
|
||||||
|
output [4:0] C2_S;
|
||||||
|
|
||||||
|
|
||||||
|
reg [17:0] C0_S;
|
||||||
|
reg [11:0] C1_S;
|
||||||
|
reg [4:0] C2_S;
|
||||||
|
|
||||||
|
//------------------------
|
||||||
|
//----C0_S
|
||||||
|
always@(*)
|
||||||
|
begin
|
||||||
|
|
||||||
|
case(index)
|
||||||
|
5'd 0 : C0_S =18'd 0;
|
||||||
|
5'd 1 : C0_S =18'd 6433;
|
||||||
|
5'd 2 : C0_S =18'd 12863;
|
||||||
|
5'd 3 : C0_S =18'd 19284;
|
||||||
|
5'd 4 : C0_S =18'd 25695;
|
||||||
|
5'd 5 : C0_S =18'd 32089;
|
||||||
|
5'd 6 : C0_S =18'd 38464;
|
||||||
|
5'd 7 : C0_S =18'd 44817;
|
||||||
|
5'd 8 : C0_S =18'd 51142;
|
||||||
|
5'd 9 : C0_S =18'd 57436;
|
||||||
|
5'd10 : C0_S =18'd 63696;
|
||||||
|
5'd11 : C0_S =18'd 69917;
|
||||||
|
5'd12 : C0_S =18'd 76096;
|
||||||
|
5'd13 : C0_S =18'd 82230;
|
||||||
|
5'd14 : C0_S =18'd 88314;
|
||||||
|
5'd15 : C0_S =18'd 94344;
|
||||||
|
5'd16 : C0_S =18'd100318;
|
||||||
|
5'd17 : C0_S =18'd106232;
|
||||||
|
5'd18 : C0_S =18'd112081;
|
||||||
|
5'd19 : C0_S =18'd117863;
|
||||||
|
5'd20 : C0_S =18'd123574;
|
||||||
|
5'd21 : C0_S =18'd129210;
|
||||||
|
5'd22 : C0_S =18'd134769;
|
||||||
|
5'd23 : C0_S =18'd140246;
|
||||||
|
5'd24 : C0_S =18'd145639;
|
||||||
|
5'd25 : C0_S =18'd150945;
|
||||||
|
5'd26 : C0_S =18'd156159;
|
||||||
|
5'd27 : C0_S =18'd161279;
|
||||||
|
5'd28 : C0_S =18'd166302;
|
||||||
|
5'd29 : C0_S =18'd171225;
|
||||||
|
5'd30 : C0_S =18'd176045;
|
||||||
|
5'd31 : C0_S =18'd180759;
|
||||||
|
// default : C0_S = C0_S;
|
||||||
|
endcase
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
//------------------------
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------
|
||||||
|
//----C1_S OK
|
||||||
|
always@(*)
|
||||||
|
begin
|
||||||
|
|
||||||
|
case(index)
|
||||||
|
5'd 0 : C1_S =12'd3217;
|
||||||
|
5'd 1 : C1_S =12'd3216;
|
||||||
|
5'd 2 : C1_S =12'd3213;
|
||||||
|
5'd 3 : C1_S =12'd3208;
|
||||||
|
5'd 4 : C1_S =12'd3202;
|
||||||
|
5'd 5 : C1_S =12'd3193;
|
||||||
|
5'd 6 : C1_S =12'd3182;
|
||||||
|
5'd 7 : C1_S =12'd3170;
|
||||||
|
5'd 8 : C1_S =12'd3155;
|
||||||
|
5'd 9 : C1_S =12'd3139;
|
||||||
|
5'd10 : C1_S =12'd3121;
|
||||||
|
5'd11 : C1_S =12'd3101;
|
||||||
|
5'd12 : C1_S =12'd3079;
|
||||||
|
5'd13 : C1_S =12'd3055;
|
||||||
|
5'd14 : C1_S =12'd3029;
|
||||||
|
5'd15 : C1_S =12'd3002;
|
||||||
|
5'd16 : C1_S =12'd2972;
|
||||||
|
5'd17 : C1_S =12'd2941;
|
||||||
|
5'd18 : C1_S =12'd2908;
|
||||||
|
5'd19 : C1_S =12'd2874;
|
||||||
|
5'd20 : C1_S =12'd2837;
|
||||||
|
5'd21 : C1_S =12'd2799;
|
||||||
|
5'd22 : C1_S =12'd2759;
|
||||||
|
5'd23 : C1_S =12'd2718;
|
||||||
|
5'd24 : C1_S =12'd2675;
|
||||||
|
5'd25 : C1_S =12'd2630;
|
||||||
|
5'd26 : C1_S =12'd2584;
|
||||||
|
5'd27 : C1_S =12'd2536;
|
||||||
|
5'd28 : C1_S =12'd2487;
|
||||||
|
5'd29 : C1_S =12'd2436;
|
||||||
|
5'd30 : C1_S =12'd2384;
|
||||||
|
5'd31 : C1_S =12'd2330;
|
||||||
|
// default : C1_S = C1_S;
|
||||||
|
endcase
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
//------------------------
|
||||||
|
//----C2_S
|
||||||
|
always@(*)
|
||||||
|
begin
|
||||||
|
|
||||||
|
case(index)
|
||||||
|
5'd 0 : C2_S =5'd 0;
|
||||||
|
5'd 1 : C2_S =5'd 1;
|
||||||
|
5'd 2 : C2_S =5'd 2;
|
||||||
|
5'd 3 : C2_S =5'd 3;
|
||||||
|
5'd 4 : C2_S =5'd 4;
|
||||||
|
5'd 5 : C2_S =5'd 5;
|
||||||
|
5'd 6 : C2_S =5'd 6;
|
||||||
|
5'd 7 : C2_S =5'd 7;
|
||||||
|
5'd 8 : C2_S =5'd 8;
|
||||||
|
5'd 9 : C2_S =5'd 9;
|
||||||
|
5'd10 : C2_S =5'd10;
|
||||||
|
5'd11 : C2_S =5'd11;
|
||||||
|
5'd12 : C2_S =5'd12;
|
||||||
|
5'd13 : C2_S =5'd13;
|
||||||
|
5'd14 : C2_S =5'd14;
|
||||||
|
5'd15 : C2_S =5'd15;
|
||||||
|
5'd16 : C2_S =5'd16;
|
||||||
|
5'd17 : C2_S =5'd16;
|
||||||
|
5'd18 : C2_S =5'd17;
|
||||||
|
5'd19 : C2_S =5'd18;
|
||||||
|
5'd20 : C2_S =5'd19;
|
||||||
|
5'd21 : C2_S =5'd20;
|
||||||
|
5'd22 : C2_S =5'd21;
|
||||||
|
5'd23 : C2_S =5'd22;
|
||||||
|
5'd24 : C2_S =5'd22;
|
||||||
|
5'd25 : C2_S =5'd23;
|
||||||
|
5'd26 : C2_S =5'd24;
|
||||||
|
5'd27 : C2_S =5'd25;
|
||||||
|
5'd28 : C2_S =5'd25;
|
||||||
|
5'd29 : C2_S =5'd26;
|
||||||
|
5'd30 : C2_S =5'd27;
|
||||||
|
5'd31 : C2_S =5'd28;
|
||||||
|
// default : C2_S = C2_S;
|
||||||
|
endcase
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,144 @@
|
||||||
|
module COS_OP(
|
||||||
|
clk ,
|
||||||
|
rstn ,
|
||||||
|
pha_map ,
|
||||||
|
pha_indx_msb ,
|
||||||
|
cos_op_o
|
||||||
|
);
|
||||||
|
|
||||||
|
input clk;
|
||||||
|
input rstn;
|
||||||
|
input [18:0] pha_map;
|
||||||
|
output [2:0] pha_indx_msb;
|
||||||
|
output [14:0] cos_op_o;
|
||||||
|
|
||||||
|
wire [2:0] pha_indx_msb_w;
|
||||||
|
assign pha_indx_msb_w=pha_map[18:16];
|
||||||
|
|
||||||
|
wire [15:0] pha_indx_lsb;
|
||||||
|
assign pha_indx_lsb=pha_map[15:0];
|
||||||
|
wire [15:0] pha_op;
|
||||||
|
assign pha_op=pha_indx_msb_w[0]?(~pha_indx_lsb):pha_indx_lsb;
|
||||||
|
|
||||||
|
wire [4:0] indx;
|
||||||
|
assign indx=pha_op[15:11];
|
||||||
|
wire [10:0] x_w;
|
||||||
|
assign x_w=pha_op[10:0];
|
||||||
|
wire [17:0] c0;
|
||||||
|
wire [11:0] c1;
|
||||||
|
wire [5:0] c2;
|
||||||
|
|
||||||
|
|
||||||
|
COEF_C coef_c_inst1(
|
||||||
|
.index(indx) ,
|
||||||
|
.C0_C(c0) ,
|
||||||
|
.C1_C(c1) ,
|
||||||
|
.C2_C(c2)
|
||||||
|
);
|
||||||
|
|
||||||
|
reg[17:0] c0_r1;
|
||||||
|
reg[17:0] c0_r2;
|
||||||
|
reg[17:0] c0_r3;
|
||||||
|
reg[17:0] c0_r4;
|
||||||
|
reg[17:0] c0_r5;
|
||||||
|
reg[17:0] c0_r6;
|
||||||
|
always@(posedge clk)
|
||||||
|
begin
|
||||||
|
c0_r1<=c0;
|
||||||
|
c0_r2<=c0_r1;
|
||||||
|
c0_r3<=c0_r2;
|
||||||
|
c0_r4<=c0_r3;
|
||||||
|
c0_r5<=c0_r4;
|
||||||
|
c0_r6<=c0_r5;
|
||||||
|
end
|
||||||
|
reg [11:0] c1_r1;
|
||||||
|
reg [11:0] c1_r2;
|
||||||
|
reg [11:0] c1_r3;
|
||||||
|
always@(posedge clk)
|
||||||
|
begin
|
||||||
|
c1_r1<=c1;
|
||||||
|
c1_r2<=c1_r1;
|
||||||
|
c1_r3<=c1_r2;
|
||||||
|
end
|
||||||
|
reg [5:0] c2_r1;
|
||||||
|
always@(posedge clk)
|
||||||
|
c2_r1<=c2;
|
||||||
|
reg[10:0] x_r1;
|
||||||
|
reg[10:0] x_r2;
|
||||||
|
reg[10:0] x_r3;
|
||||||
|
reg[10:0] x_r4;
|
||||||
|
always@(posedge clk)
|
||||||
|
begin
|
||||||
|
x_r1<=x_w;
|
||||||
|
x_r2<=x_r1;
|
||||||
|
x_r3<=x_r2;
|
||||||
|
x_r4<=x_r3;
|
||||||
|
end
|
||||||
|
|
||||||
|
wire [16:0] c2x;
|
||||||
|
|
||||||
|
DW_mult_pipe #(11,6,2,0,1) inst_mult_0(
|
||||||
|
.clk (clk ),
|
||||||
|
.rst_n (rstn ),
|
||||||
|
.en (1'b1 ),
|
||||||
|
.a (x_r1 ),
|
||||||
|
.b (c2_r1 ),
|
||||||
|
.tc (1'b0 ),
|
||||||
|
.product (c2x )
|
||||||
|
);
|
||||||
|
|
||||||
|
wire [5:0] c2x_w;
|
||||||
|
assign c2x_w=c2x[10]?(c2x[16:11]+6'd1):c2x[16:11];
|
||||||
|
|
||||||
|
reg [11:0] c2xc1;
|
||||||
|
always@(posedge clk)
|
||||||
|
c2xc1<=c1_r2+c2x_w;
|
||||||
|
wire [22:0] c2xc1x;
|
||||||
|
DW_mult_pipe #(11,12,3,0,1) inst_mult_1(
|
||||||
|
.clk (clk ),
|
||||||
|
.rst_n (rstn ),
|
||||||
|
.en (1'b1 ),
|
||||||
|
.a (x_r3 ),
|
||||||
|
.b (c2xc1 ),
|
||||||
|
.tc (1'b0 ),
|
||||||
|
.product (c2xc1x )
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
wire [12:0] c2xc1x_w;
|
||||||
|
assign c2xc1x_w=c2xc1x[9]?(c2xc1x[22:10]+13'd1):c2xc1x[22:10];
|
||||||
|
reg [12:0] c2xc1x_r;
|
||||||
|
always@(posedge clk)
|
||||||
|
c2xc1x_r<=c2xc1x_w;
|
||||||
|
wire [17:0] c2xc1xc0;
|
||||||
|
assign c2xc1xc0 =c0_r6-c2xc1x_r;
|
||||||
|
|
||||||
|
wire[15:0] c2xc1xc0_w1;
|
||||||
|
assign c2xc1xc0_w1=c2xc1xc0[2]?({1'b0,c2xc1xc0[17:3]}+15'd1):{1'b0,c2xc1xc0[17:3]};
|
||||||
|
|
||||||
|
wire[14:0] c2xc1xc0_w;
|
||||||
|
assign c2xc1xc0_w=(c2xc1xc0_w1>=15'd32767)?15'd32767:c2xc1xc0_w1[14:0];
|
||||||
|
reg [14:0] c2xc1xc0_r;
|
||||||
|
always@(posedge clk)
|
||||||
|
c2xc1xc0_r<=c2xc1xc0_w;
|
||||||
|
assign cos_op_o=c2xc1xc0_r;
|
||||||
|
reg[2:0] pha_indx_msb_r1;
|
||||||
|
reg[2:0] pha_indx_msb_r2;
|
||||||
|
reg[2:0] pha_indx_msb_r3;
|
||||||
|
reg[2:0] pha_indx_msb_r4;
|
||||||
|
reg[2:0] pha_indx_msb_r5;
|
||||||
|
reg[2:0] pha_indx_msb_r6;
|
||||||
|
reg[2:0] pha_indx_msb_r7;
|
||||||
|
always@(posedge clk)
|
||||||
|
begin
|
||||||
|
pha_indx_msb_r1<=pha_indx_msb_w;
|
||||||
|
pha_indx_msb_r2<=pha_indx_msb_r1;
|
||||||
|
pha_indx_msb_r3<=pha_indx_msb_r2;
|
||||||
|
pha_indx_msb_r4<=pha_indx_msb_r3;
|
||||||
|
pha_indx_msb_r5<=pha_indx_msb_r4;
|
||||||
|
pha_indx_msb_r6<=pha_indx_msb_r5;
|
||||||
|
pha_indx_msb_r7<=pha_indx_msb_r6;
|
||||||
|
end
|
||||||
|
|
||||||
|
assign pha_indx_msb=pha_indx_msb_r7;
|
||||||
|
endmodule
|
|
@ -0,0 +1,51 @@
|
||||||
|
module NCO(
|
||||||
|
clk,
|
||||||
|
rstn,
|
||||||
|
phase_manual_clr,
|
||||||
|
phase_auto_clr,
|
||||||
|
fcw,
|
||||||
|
pha,
|
||||||
|
|
||||||
|
cos,
|
||||||
|
|
||||||
|
sin
|
||||||
|
);
|
||||||
|
|
||||||
|
input clk;
|
||||||
|
input rstn;
|
||||||
|
input phase_manual_clr;
|
||||||
|
input phase_auto_clr;
|
||||||
|
input [47:0] fcw;
|
||||||
|
input [15:0] pha;
|
||||||
|
|
||||||
|
output [15:0] cos;
|
||||||
|
output [15:0] sin;
|
||||||
|
|
||||||
|
|
||||||
|
wire clr_acc;
|
||||||
|
wire clr_fix;
|
||||||
|
assign clr_acc = phase_auto_clr | phase_manual_clr;
|
||||||
|
assign clr_fix = phase_manual_clr;
|
||||||
|
|
||||||
|
wire [15:0] s1_i_o;
|
||||||
|
wire [15:0] s2_i_o;
|
||||||
|
wire [15:0] s3_i_o;
|
||||||
|
|
||||||
|
P_NCO inst_p_nco(
|
||||||
|
.clk (clk ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.clr (clr_fix ),
|
||||||
|
.clr_acc (clr_acc ),
|
||||||
|
.pha (pha ),
|
||||||
|
.s1 (s1_i_o ),
|
||||||
|
.s2 (s2_i_o ),
|
||||||
|
.s3 (s3_i_o ),
|
||||||
|
.s1_o (s1_i_o ),
|
||||||
|
.s2_o (s2_i_o ),
|
||||||
|
.s3_o (s3_i_o ),
|
||||||
|
.fcw (fcw ),
|
||||||
|
.cos (cos ),
|
||||||
|
.sin (sin )
|
||||||
|
|
||||||
|
);
|
||||||
|
endmodule
|
|
@ -0,0 +1,62 @@
|
||||||
|
module P_NCO(
|
||||||
|
clk,
|
||||||
|
rstn,
|
||||||
|
clr,
|
||||||
|
clr_acc,
|
||||||
|
pha,
|
||||||
|
|
||||||
|
s1,
|
||||||
|
s2,
|
||||||
|
s3,
|
||||||
|
|
||||||
|
s1_o,
|
||||||
|
s2_o,
|
||||||
|
s3_o,
|
||||||
|
|
||||||
|
fcw,
|
||||||
|
|
||||||
|
cos,
|
||||||
|
sin
|
||||||
|
);
|
||||||
|
|
||||||
|
input clk;
|
||||||
|
input rstn;
|
||||||
|
input clr;
|
||||||
|
input clr_acc;
|
||||||
|
input [15:0] pha;
|
||||||
|
|
||||||
|
input [15:0] s1;
|
||||||
|
input [15:0] s2;
|
||||||
|
input [15:0] s3;
|
||||||
|
|
||||||
|
output [15:0] s1_o;
|
||||||
|
output [15:0] s2_o;
|
||||||
|
output [15:0] s3_o;
|
||||||
|
|
||||||
|
output [15:0] cos;
|
||||||
|
output [15:0] sin;
|
||||||
|
|
||||||
|
|
||||||
|
input [47:0] fcw;
|
||||||
|
|
||||||
|
|
||||||
|
reg [15:0] pha_r;
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
pha_r <= 16'd0;
|
||||||
|
else
|
||||||
|
pha_r <= pha;
|
||||||
|
|
||||||
|
wire [18:0] pha0;
|
||||||
|
|
||||||
|
PIPE3_ACC_48BIT inst_pipe(.clk(clk),.rstn(rstn),.in(fcw),.clr(clr_acc),.ptw(pha),.s_o_1(s1_o),.s_o_2(s2_o),.s_o_3(s3_o),.s_i_1(s1),.s_i_2(s2),.s_i_3(s3),.out(pha0));
|
||||||
|
|
||||||
|
PH2AMP inst_ph2amp_0(
|
||||||
|
.clk(clk) ,
|
||||||
|
.rstn(rstn) ,
|
||||||
|
.pha_map(pha0) ,
|
||||||
|
.sin_o(sin) ,
|
||||||
|
.cos_o(cos)
|
||||||
|
);
|
||||||
|
|
||||||
|
endmodule
|
|
@ -0,0 +1,83 @@
|
||||||
|
module PH2AMP(
|
||||||
|
clk ,
|
||||||
|
rstn ,
|
||||||
|
pha_map ,
|
||||||
|
sin_o ,
|
||||||
|
cos_o
|
||||||
|
);
|
||||||
|
input clk;
|
||||||
|
input rstn;
|
||||||
|
input [18:0] pha_map;
|
||||||
|
|
||||||
|
output [15:0] sin_o;
|
||||||
|
output [15:0] cos_o;
|
||||||
|
|
||||||
|
//wire [2:0] pha_indx_msb_s;
|
||||||
|
wire [14:0] sin_w;
|
||||||
|
SIN_OP inst_sin_op(
|
||||||
|
.clk(clk),
|
||||||
|
.rstn(rstn),
|
||||||
|
.pha_map(pha_map),
|
||||||
|
// .pha_indx_msb(pha_indx_msb_s),
|
||||||
|
.sin_op_o(sin_w)
|
||||||
|
);
|
||||||
|
wire [2:0] pha_indx_msb_c;
|
||||||
|
wire [14:0] cos_w;
|
||||||
|
COS_OP inst_cos_op(
|
||||||
|
.clk(clk) ,
|
||||||
|
.rstn(rstn) ,
|
||||||
|
.pha_map(pha_map) ,
|
||||||
|
.pha_indx_msb(pha_indx_msb_c),
|
||||||
|
.cos_op_o(cos_w)
|
||||||
|
);
|
||||||
|
wire[15:0] cos_w_1;
|
||||||
|
wire[15:0] sin_w_1;
|
||||||
|
wire[15:0] cos_w_0;
|
||||||
|
wire[15:0] sin_w_0;//0:-,1:+
|
||||||
|
|
||||||
|
assign cos_w_1={1'b0,cos_w};
|
||||||
|
assign sin_w_1={1'b0,sin_w};
|
||||||
|
assign cos_w_0=(cos_w_1==16'd0)?16'd0:~cos_w_1+16'd1;
|
||||||
|
assign sin_w_0=(sin_w_1==16'd0)?16'd0:~sin_w_1+16'd1;
|
||||||
|
|
||||||
|
reg[15:0] cos_tmp;
|
||||||
|
reg[15:0] sin_tmp;
|
||||||
|
always@(posedge clk)
|
||||||
|
case(pha_indx_msb_c)//synopsys parallel_case
|
||||||
|
3'b000:begin
|
||||||
|
cos_tmp<=cos_w_1;
|
||||||
|
sin_tmp<=sin_w_1;
|
||||||
|
end
|
||||||
|
3'b001:begin
|
||||||
|
cos_tmp<=sin_w_1;
|
||||||
|
sin_tmp<=cos_w_1;
|
||||||
|
end
|
||||||
|
3'b010:begin
|
||||||
|
cos_tmp<=sin_w_0;
|
||||||
|
sin_tmp<=cos_w_1;
|
||||||
|
end
|
||||||
|
3'b011:begin
|
||||||
|
cos_tmp<=cos_w_0;
|
||||||
|
sin_tmp<=sin_w_1;
|
||||||
|
end
|
||||||
|
3'b100:begin
|
||||||
|
cos_tmp<=cos_w_0;
|
||||||
|
sin_tmp<=sin_w_0;
|
||||||
|
end
|
||||||
|
3'b101:begin
|
||||||
|
cos_tmp<=sin_w_0;
|
||||||
|
sin_tmp<=cos_w_0;
|
||||||
|
end
|
||||||
|
3'b110:begin
|
||||||
|
cos_tmp<=sin_w_1;
|
||||||
|
sin_tmp<=cos_w_0;
|
||||||
|
end
|
||||||
|
3'b111:begin
|
||||||
|
cos_tmp<=cos_w_1;
|
||||||
|
sin_tmp<=sin_w_0;
|
||||||
|
end
|
||||||
|
endcase
|
||||||
|
|
||||||
|
assign sin_o=sin_tmp;
|
||||||
|
assign cos_o=cos_tmp;
|
||||||
|
endmodule
|
|
@ -0,0 +1,64 @@
|
||||||
|
|
||||||
|
|
||||||
|
module PIPE3_ACC_48BIT(
|
||||||
|
clk,
|
||||||
|
rstn,
|
||||||
|
in,
|
||||||
|
clr,
|
||||||
|
ptw,
|
||||||
|
s_i_1,
|
||||||
|
s_i_2,
|
||||||
|
s_i_3,
|
||||||
|
s_o_1,
|
||||||
|
s_o_2,
|
||||||
|
s_o_3,
|
||||||
|
out
|
||||||
|
);
|
||||||
|
|
||||||
|
//---
|
||||||
|
|
||||||
|
input clk;
|
||||||
|
input rstn;
|
||||||
|
input [47:0] in;
|
||||||
|
input clr;
|
||||||
|
input [15:0] ptw;
|
||||||
|
|
||||||
|
input [15:0] s_i_1;
|
||||||
|
input [15:0] s_i_2;
|
||||||
|
input [15:0] s_i_3;
|
||||||
|
|
||||||
|
output [15:0] s_o_1;
|
||||||
|
output [15:0] s_o_2;
|
||||||
|
output [15:0] s_o_3;
|
||||||
|
output [18:0] out;
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
reg [47:0] acc;
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
acc<=48'h0;
|
||||||
|
else if(clr)
|
||||||
|
acc<=48'h0;
|
||||||
|
else
|
||||||
|
acc<={s_i_1,s_i_2,s_i_3}+in;
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------
|
||||||
|
wire [15:0] s1;
|
||||||
|
wire [15:0] s2;
|
||||||
|
wire [15:0] s3;
|
||||||
|
|
||||||
|
assign s_o_1 = acc[47:32];
|
||||||
|
assign s_o_2 = acc[31:16];
|
||||||
|
assign s_o_3 = acc[15:0];
|
||||||
|
|
||||||
|
wire[18:0] pha_w;
|
||||||
|
assign pha_w=acc[47:29];
|
||||||
|
reg[18:0] pha_r;
|
||||||
|
always@(posedge clk)
|
||||||
|
pha_r<=pha_w+{ptw,3'b0};
|
||||||
|
|
||||||
|
assign out=pha_r;
|
||||||
|
//END
|
||||||
|
endmodule
|
|
@ -0,0 +1,50 @@
|
||||||
|
|
||||||
|
|
||||||
|
module PIPE3_ADD_48BIT(
|
||||||
|
clk,
|
||||||
|
rstn,
|
||||||
|
in,
|
||||||
|
clr,
|
||||||
|
ptw,
|
||||||
|
s1,
|
||||||
|
s2,
|
||||||
|
s3,
|
||||||
|
out
|
||||||
|
);
|
||||||
|
|
||||||
|
//---
|
||||||
|
|
||||||
|
input clk;
|
||||||
|
input rstn;
|
||||||
|
input [47:0] in;
|
||||||
|
input clr;
|
||||||
|
input [15:0] ptw;
|
||||||
|
|
||||||
|
input [15:0] s1;
|
||||||
|
input [15:0] s2;
|
||||||
|
input [15:0] s3;
|
||||||
|
output [18:0] out;
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
reg [47:0] acc;
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
acc<=48'h0;
|
||||||
|
else if(clr)
|
||||||
|
acc<=48'h0;
|
||||||
|
else
|
||||||
|
acc<={s1,s2,s3}+in;
|
||||||
|
//---
|
||||||
|
|
||||||
|
wire[18:0] pha_w;
|
||||||
|
assign pha_w=acc[47:29];
|
||||||
|
reg[18:0] pha_r;
|
||||||
|
always@(posedge clk)
|
||||||
|
pha_r<=pha_w+{ptw,3'b0};
|
||||||
|
|
||||||
|
|
||||||
|
assign out=pha_r;
|
||||||
|
//END
|
||||||
|
endmodule
|
|
@ -0,0 +1,144 @@
|
||||||
|
module SIN_OP(
|
||||||
|
clk,
|
||||||
|
rstn,
|
||||||
|
pha_map,
|
||||||
|
// pha_indx_msb,
|
||||||
|
sin_op_o
|
||||||
|
);
|
||||||
|
|
||||||
|
input clk;
|
||||||
|
input rstn;
|
||||||
|
input[18:0] pha_map;
|
||||||
|
//output [2:0] pha_indx_msb;
|
||||||
|
output [14:0] sin_op_o;
|
||||||
|
|
||||||
|
wire [2:0] pha_indx_msb_w;
|
||||||
|
assign pha_indx_msb_w=pha_map[18:16];
|
||||||
|
|
||||||
|
wire [15:0] pha_indx_lsb;
|
||||||
|
assign pha_indx_lsb=pha_map[15:0];
|
||||||
|
wire [15:0] pha_op;
|
||||||
|
assign pha_op=pha_indx_msb_w[0]?(~pha_indx_lsb):pha_indx_lsb;
|
||||||
|
|
||||||
|
wire [4:0] indx;
|
||||||
|
assign indx=pha_op[15:11];
|
||||||
|
wire [10:0] x_w;
|
||||||
|
assign x_w=pha_op[10:0];
|
||||||
|
wire [17:0] c0;
|
||||||
|
wire [11:0] c1;
|
||||||
|
wire [4:0] c2;
|
||||||
|
|
||||||
|
COEF_S coef_s_inst1(
|
||||||
|
.index(indx) ,
|
||||||
|
.C0_S(c0) ,
|
||||||
|
.C1_S(c1) ,
|
||||||
|
.C2_S(c2)
|
||||||
|
);
|
||||||
|
|
||||||
|
reg[17:0] c0_r1;
|
||||||
|
reg[17:0] c0_r2;
|
||||||
|
reg[17:0] c0_r3;
|
||||||
|
reg[17:0] c0_r4;
|
||||||
|
reg[17:0] c0_r5;
|
||||||
|
reg[17:0] c0_r6;
|
||||||
|
always@(posedge clk)
|
||||||
|
begin
|
||||||
|
c0_r1<=c0;
|
||||||
|
c0_r2<=c0_r1;
|
||||||
|
c0_r3<=c0_r2;
|
||||||
|
c0_r4<=c0_r3;
|
||||||
|
c0_r5<=c0_r4;
|
||||||
|
c0_r6<=c0_r5;
|
||||||
|
end
|
||||||
|
reg [11:0] c1_r1;
|
||||||
|
reg [11:0] c1_r2;
|
||||||
|
reg [11:0] c1_r3;
|
||||||
|
always@(posedge clk)
|
||||||
|
begin
|
||||||
|
c1_r1<=c1;
|
||||||
|
c1_r2<=c1_r1;
|
||||||
|
c1_r3<=c1_r2;
|
||||||
|
end
|
||||||
|
reg [4:0] c2_r1;
|
||||||
|
always@(posedge clk)
|
||||||
|
c2_r1<=c2;
|
||||||
|
reg[10:0] x_r1;
|
||||||
|
reg[10:0] x_r2;
|
||||||
|
reg[10:0] x_r3;
|
||||||
|
reg[10:0] x_r4;
|
||||||
|
always@(posedge clk)
|
||||||
|
begin
|
||||||
|
x_r1<=x_w;
|
||||||
|
x_r2<=x_r1;
|
||||||
|
x_r3<=x_r2;
|
||||||
|
x_r4<=x_r3;
|
||||||
|
end
|
||||||
|
|
||||||
|
wire [15:0] c2x;
|
||||||
|
|
||||||
|
DW_mult_pipe #(11,5,2,0,1) inst_mult_0(
|
||||||
|
.clk (clk ),
|
||||||
|
.rst_n (rstn ),
|
||||||
|
.en (1'b1 ),
|
||||||
|
.a (x_r1 ),
|
||||||
|
.b (c2_r1 ),
|
||||||
|
.tc (1'b0 ),
|
||||||
|
.product (c2x )
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
wire [4:0] c2x_w;
|
||||||
|
assign c2x_w=c2x[10]?(c2x[15:11]+5'd1):c2x[15:11];
|
||||||
|
reg [11:0] c2xc1;
|
||||||
|
always@(posedge clk)
|
||||||
|
c2xc1<=c1_r2-c2x_w;
|
||||||
|
|
||||||
|
wire [22:0] c2xc1x;
|
||||||
|
|
||||||
|
DW_mult_pipe #(11,12,3,0,1) inst_mult_1(
|
||||||
|
.clk (clk ),
|
||||||
|
.rst_n (rstn ),
|
||||||
|
.en (1'b1 ),
|
||||||
|
.a (x_r3 ),
|
||||||
|
.b (c2xc1 ),
|
||||||
|
.tc (1'b0 ),
|
||||||
|
.product (c2xc1x )
|
||||||
|
);
|
||||||
|
|
||||||
|
wire [12:0] c2xc1x_w;
|
||||||
|
assign c2xc1x_w=c2xc1x[9]?(c2xc1x[22:10]+13'd1):c2xc1x[22:10];
|
||||||
|
reg [12:0] c2xc1x_r;
|
||||||
|
always@(posedge clk)
|
||||||
|
c2xc1x_r<=c2xc1x_w;
|
||||||
|
wire[17:0] c2xc1xc0;
|
||||||
|
assign c2xc1xc0=c0_r6+c2xc1x_r;
|
||||||
|
wire [14:0] c2xc1xc0_w;
|
||||||
|
assign c2xc1xc0_w=c2xc1xc0[2]?(c2xc1xc0[17:3]+13'd1):c2xc1xc0[17:3];
|
||||||
|
reg [14:0] c2xc1xc0_r;
|
||||||
|
always@(posedge clk)
|
||||||
|
c2xc1xc0_r<=c2xc1xc0_w;
|
||||||
|
|
||||||
|
assign sin_op_o=c2xc1xc0_r;
|
||||||
|
/*
|
||||||
|
reg[2:0] pha_indx_msb_r1;
|
||||||
|
reg[2:0] pha_indx_msb_r2;
|
||||||
|
reg[2:0] pha_indx_msb_r3;
|
||||||
|
reg[2:0] pha_indx_msb_r4;
|
||||||
|
reg[2:0] pha_indx_msb_r5;
|
||||||
|
reg[2:0] pha_indx_msb_r6;
|
||||||
|
reg[2:0] pha_indx_msb_r7;
|
||||||
|
always@(posedge clk)
|
||||||
|
begin
|
||||||
|
pha_indx_msb_r1<=pha_indx_msb_w;
|
||||||
|
pha_indx_msb_r2<=pha_indx_msb_r1;
|
||||||
|
pha_indx_msb_r3<=pha_indx_msb_r2;
|
||||||
|
pha_indx_msb_r4<=pha_indx_msb_r3;
|
||||||
|
pha_indx_msb_r5<=pha_indx_msb_r4;
|
||||||
|
pha_indx_msb_r6<=pha_indx_msb_r5;
|
||||||
|
pha_indx_msb_r7<=pha_indx_msb_r6;
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
assign pha_indx_msb=pha_indx_msb_r7;
|
||||||
|
*/
|
||||||
|
endmodule
|
|
@ -0,0 +1,380 @@
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// This confidential and proprietary software may be used only
|
||||||
|
// as authorized by a licensing agreement from Synopsys Inc.
|
||||||
|
// In the event of publication, the following notice is applicable:
|
||||||
|
//
|
||||||
|
// (C) COPYRIGHT 1995 - 2018 SYNOPSYS INC.
|
||||||
|
// ALL RIGHTS RESERVED
|
||||||
|
//
|
||||||
|
// The entire notice above must be reproduced on all authorized
|
||||||
|
// copies.
|
||||||
|
//
|
||||||
|
// AUTHOR: KB May 20, 1995
|
||||||
|
//
|
||||||
|
// VERSION: Verilog Simulation Model for DW_iir_dc
|
||||||
|
//
|
||||||
|
// DesignWare_version: 10b10551
|
||||||
|
// DesignWare_release: O-2018.06-DWBB_201806.1
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//-----------------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// ABSTRACT: Verilog simulation model for IIR filter with dynamic coefficients
|
||||||
|
//
|
||||||
|
// MODIFIED:
|
||||||
|
// Doug Lee 06/02/2008
|
||||||
|
// Fix for STAR#9000245949
|
||||||
|
// data_out and saturation results were wrong
|
||||||
|
// compared to synthetic and VHDL simulation
|
||||||
|
// models in a specific negative number
|
||||||
|
// boundary case. Re-wrote rounding/saturation
|
||||||
|
// function to resemble VHDL simulation model
|
||||||
|
// approach.
|
||||||
|
//
|
||||||
|
// Zhijun (Jerry) Huang 02/12/2004
|
||||||
|
// Changed interface names
|
||||||
|
// Added parameter legality check
|
||||||
|
// Added asynchronous reset signal rst_n
|
||||||
|
// Added optional output register controlled by parameter out_reg
|
||||||
|
// Added X-processing
|
||||||
|
// Fixed verilog analysis warning about zero multiconcat multiplier
|
||||||
|
// Fixed verilog analysis error about negative array index
|
||||||
|
// Fixed logic errors with saturation and negative/positive handling
|
||||||
|
// Fixed logic errors with feedback_data when feedback_width > data_out_width
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
module DW_iir_dc_m(clk,rst_n,init_n,enable,
|
||||||
|
A1_coef,A2_coef,B0_coef,B1_coef,B2_coef,
|
||||||
|
data_in,data_out,saturation);
|
||||||
|
parameter integer data_in_width = 8;
|
||||||
|
parameter integer data_out_width = 16;
|
||||||
|
parameter integer frac_data_out_width = 4;
|
||||||
|
parameter integer feedback_width = 12;
|
||||||
|
parameter integer max_coef_width = 8;
|
||||||
|
parameter integer frac_coef_width = 4;
|
||||||
|
parameter integer saturation_mode = 0;
|
||||||
|
parameter integer out_reg = 1;
|
||||||
|
input clk,rst_n,init_n,enable;
|
||||||
|
input [max_coef_width-1:0] A1_coef,A2_coef,B0_coef,B1_coef,B2_coef;
|
||||||
|
input [data_in_width-1:0] data_in;
|
||||||
|
output [data_out_width-1:0] data_out;
|
||||||
|
output saturation;
|
||||||
|
|
||||||
|
parameter integer psum_width = (feedback_width-frac_data_out_width > data_in_width)?
|
||||||
|
feedback_width+max_coef_width+3
|
||||||
|
: data_in_width+frac_data_out_width+max_coef_width+3;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function [feedback_width+data_out_width:0] rnd_sat;
|
||||||
|
input [psum_width-1:0] psum0;
|
||||||
|
|
||||||
|
reg signed [psum_width:0] psum0_shiftedby1;
|
||||||
|
reg signed [data_out_width-1:0] data_out_noreg;
|
||||||
|
reg signed [feedback_width-1:0] feedback_data;
|
||||||
|
reg signed [frac_coef_width:0] round_limit;
|
||||||
|
reg signed [frac_coef_width-1:0] psum0_frac_part;
|
||||||
|
reg signed [data_out_width-1:0] max_pos_output;
|
||||||
|
reg signed [data_out_width-1:0] max_neg_output;
|
||||||
|
reg signed [feedback_width-1:0] max_pos_feedback;
|
||||||
|
reg signed [feedback_width-1:0] max_neg_feedback;
|
||||||
|
reg signed [data_out_width-1:0] output_inc_data;
|
||||||
|
reg signed [feedback_width-1:0] feedback_inc_data;
|
||||||
|
reg output_to_big;
|
||||||
|
reg feedback_to_big;
|
||||||
|
reg saturation_internal;
|
||||||
|
|
||||||
|
integer i, j, k, l;
|
||||||
|
|
||||||
|
begin
|
||||||
|
for (i=0; i<data_out_width; i=i+1) begin
|
||||||
|
if (i == data_out_width-1)
|
||||||
|
max_pos_output[i] = 0;
|
||||||
|
else
|
||||||
|
max_pos_output[i] = 1;
|
||||||
|
end
|
||||||
|
|
||||||
|
for (j=0; j<data_out_width; j=j+1) begin
|
||||||
|
if (j == data_out_width-1)
|
||||||
|
max_neg_output[j] = 1;
|
||||||
|
else if (j == 0)
|
||||||
|
if (saturation_mode == 0)
|
||||||
|
max_neg_output[j] = 0;
|
||||||
|
else
|
||||||
|
max_neg_output[j] = 1;
|
||||||
|
else
|
||||||
|
max_neg_output[j] = 0;
|
||||||
|
end
|
||||||
|
|
||||||
|
for (k=0; k<feedback_width; k=k+1) begin
|
||||||
|
if (k == feedback_width-1)
|
||||||
|
max_pos_feedback[k] = 0;
|
||||||
|
else
|
||||||
|
max_pos_feedback[k] = 1;
|
||||||
|
end
|
||||||
|
|
||||||
|
for (l=0; l<feedback_width; l=l+1) begin
|
||||||
|
if (l == feedback_width-1)
|
||||||
|
max_neg_feedback[l] = 1;
|
||||||
|
else if (l == 0)
|
||||||
|
if (saturation_mode == 0)
|
||||||
|
max_neg_feedback[l] = 0;
|
||||||
|
else
|
||||||
|
max_neg_feedback[l] = 1;
|
||||||
|
else
|
||||||
|
max_neg_feedback[l] = 0;
|
||||||
|
end
|
||||||
|
|
||||||
|
// round_limit = -2^(frac_coef_width-1)
|
||||||
|
for (i=0; i<=frac_coef_width; i=i+1) begin
|
||||||
|
if (i == frac_coef_width)
|
||||||
|
round_limit[i] = 1;
|
||||||
|
else if (i == frac_coef_width-1)
|
||||||
|
round_limit[i] = 1;
|
||||||
|
else
|
||||||
|
round_limit[i] = 0;
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
if (frac_coef_width > 0) begin
|
||||||
|
psum0_shiftedby1 = psum0 << 1;
|
||||||
|
|
||||||
|
// Break out the frac_coef portion of psum0
|
||||||
|
for (i=0; i<frac_coef_width; i=i+1) begin
|
||||||
|
psum0_frac_part[i] = psum0[i];
|
||||||
|
end
|
||||||
|
|
||||||
|
if ($signed(psum0_shiftedby1[psum_width:frac_coef_width]) >= $signed({max_pos_output, 1'b1})) begin
|
||||||
|
data_out_noreg = max_pos_output;
|
||||||
|
output_to_big = 1;
|
||||||
|
end else begin
|
||||||
|
if ($signed(psum0_shiftedby1[psum_width:frac_coef_width+1]) < $signed(max_neg_output)) begin
|
||||||
|
data_out_noreg = max_neg_output;
|
||||||
|
output_to_big = 1;
|
||||||
|
end else begin
|
||||||
|
if (psum0_shiftedby1[frac_coef_width] &&
|
||||||
|
(!psum0_shiftedby1[psum_width] || (($signed(psum0_frac_part)) > $signed(round_limit)))) begin
|
||||||
|
output_inc_data = psum0[data_out_width+frac_coef_width-1:frac_coef_width] + 1;
|
||||||
|
data_out_noreg = output_inc_data;
|
||||||
|
output_to_big = 0;
|
||||||
|
end else begin
|
||||||
|
data_out_noreg = psum0[data_out_width+frac_coef_width-1:frac_coef_width];
|
||||||
|
output_to_big = 0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if ($signed(psum0_shiftedby1[psum_width:frac_coef_width]) >= $signed({max_pos_feedback, 1'b1})) begin
|
||||||
|
feedback_data = max_pos_feedback;
|
||||||
|
feedback_to_big = 1;
|
||||||
|
end else begin
|
||||||
|
if ($signed(psum0_shiftedby1[psum_width:frac_coef_width+1]) < $signed(max_neg_feedback)) begin
|
||||||
|
feedback_data = max_neg_feedback;
|
||||||
|
feedback_to_big = 1;
|
||||||
|
end else begin
|
||||||
|
if (psum0_shiftedby1[frac_coef_width] &&
|
||||||
|
(!psum0_shiftedby1[psum_width] || (($signed(psum0_frac_part)) > $signed(round_limit)))) begin
|
||||||
|
feedback_inc_data = psum0[feedback_width+frac_coef_width-1:frac_coef_width] + 1;
|
||||||
|
feedback_data = feedback_inc_data;
|
||||||
|
feedback_to_big = 0;
|
||||||
|
end else begin
|
||||||
|
feedback_data = psum0[feedback_width+frac_coef_width-1:frac_coef_width];
|
||||||
|
feedback_to_big = 0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end else begin
|
||||||
|
if ($signed(psum0) > $signed(max_pos_output)) begin
|
||||||
|
data_out_noreg = max_pos_output;
|
||||||
|
output_to_big = 1;
|
||||||
|
end else begin
|
||||||
|
if ($signed(psum0) < $signed(max_neg_output)) begin
|
||||||
|
data_out_noreg = max_neg_output;
|
||||||
|
output_to_big = 1;
|
||||||
|
end else begin
|
||||||
|
data_out_noreg = psum0[data_out_width-1:0];
|
||||||
|
output_to_big = 0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if ($signed(psum0) > $signed(max_pos_feedback)) begin
|
||||||
|
feedback_data = max_pos_feedback;
|
||||||
|
feedback_to_big = 1;
|
||||||
|
end else begin
|
||||||
|
if ($signed(psum0) < $signed(max_neg_feedback)) begin
|
||||||
|
feedback_data = max_neg_feedback;
|
||||||
|
feedback_to_big = 1;
|
||||||
|
end else begin
|
||||||
|
feedback_data = psum0[feedback_width-1:0];
|
||||||
|
feedback_to_big = 0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
saturation_internal = output_to_big || feedback_to_big;
|
||||||
|
|
||||||
|
rnd_sat = {saturation_internal, feedback_data, data_out_noreg};
|
||||||
|
|
||||||
|
end
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
wire [data_in_width-1:0] gated_data_in;
|
||||||
|
wire [feedback_width-1:0] feedback_data;
|
||||||
|
wire [max_coef_width-1:0] A1_coef_wire,A2_coef_wire,
|
||||||
|
B0_coef_wire,B1_coef_wire,B2_coef_wire;
|
||||||
|
wire [data_in_width+max_coef_width-1:0] B0_product,B1_product,B2_product;
|
||||||
|
wire [feedback_width+max_coef_width-1:0] A1_product,A2_product;
|
||||||
|
wire [psum_width-3:0] psum2;
|
||||||
|
reg [psum_width-3:0] psum2_saved;
|
||||||
|
wire [psum_width-1:0] psum1,psum0;
|
||||||
|
reg [psum_width-1:0] psum1_saved;
|
||||||
|
wire [data_out_width-1:0] data_out_internal;
|
||||||
|
wire saturation_internal;
|
||||||
|
reg [data_out_width-1:0] data_out_reg;
|
||||||
|
reg saturation_reg;
|
||||||
|
|
||||||
|
assign A1_coef_wire = A1_coef;
|
||||||
|
assign A2_coef_wire = A2_coef;
|
||||||
|
assign B0_coef_wire = B0_coef;
|
||||||
|
assign B1_coef_wire = B1_coef;
|
||||||
|
assign B2_coef_wire = B2_coef;
|
||||||
|
assign gated_data_in = (init_n == 1'b0) ? {data_in_width{1'b0}} : data_in;
|
||||||
|
|
||||||
|
|
||||||
|
DW02_mult #(data_in_width,max_coef_width) B0_mult(gated_data_in,B0_coef_wire,1'b1,B0_product);
|
||||||
|
|
||||||
|
DW02_mult #(feedback_width,max_coef_width) A1_mult(feedback_data,A1_coef_wire,1'b1,A1_product);
|
||||||
|
|
||||||
|
|
||||||
|
assign psum1 = {{psum_width{A1_product[feedback_width+max_coef_width-1]}},
|
||||||
|
A1_product[feedback_width+max_coef_width-2:0]};
|
||||||
|
|
||||||
|
assign psum0 = ({{psum_width{B0_product[data_in_width+max_coef_width-1]}},
|
||||||
|
B0_product[data_in_width+max_coef_width-2:0]} << frac_data_out_width)
|
||||||
|
+ psum1_saved;
|
||||||
|
|
||||||
|
assign {saturation_internal,feedback_data,data_out_internal} = rnd_sat(psum0);
|
||||||
|
|
||||||
|
always @ (posedge clk or negedge rst_n)
|
||||||
|
if (rst_n == 1'b0) begin
|
||||||
|
psum1_saved <= {psum_width{1'b0}};
|
||||||
|
data_out_reg <= {data_out_width{1'b0}};
|
||||||
|
saturation_reg <= 1'b0;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
|
||||||
|
if (init_n == 1'b0)
|
||||||
|
psum1_saved <= {psum_width{1'b0}};
|
||||||
|
else if (enable == 1'b1)
|
||||||
|
psum1_saved <= psum1;
|
||||||
|
else
|
||||||
|
psum1_saved <= psum1_saved;
|
||||||
|
|
||||||
|
if (init_n == 1'b0) begin
|
||||||
|
data_out_reg <= {data_out_width{1'b0}};
|
||||||
|
saturation_reg <= 1'b0;
|
||||||
|
end
|
||||||
|
else if (enable == 1'b1) begin
|
||||||
|
data_out_reg <= data_out_internal;
|
||||||
|
saturation_reg <= saturation_internal;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
data_out_reg <= data_out_reg;
|
||||||
|
saturation_reg <= saturation_reg;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
assign data_out = (out_reg == 0) ? data_out_internal : data_out_reg;
|
||||||
|
assign saturation = (out_reg == 0) ? saturation_internal : saturation_reg;
|
||||||
|
|
||||||
|
// synopsys translate_off
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
// Parameter legality check
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
initial begin : parameter_check
|
||||||
|
integer param_err_flg;
|
||||||
|
|
||||||
|
param_err_flg = 0;
|
||||||
|
|
||||||
|
|
||||||
|
if (data_in_width < 2) begin
|
||||||
|
param_err_flg = 1;
|
||||||
|
$display(
|
||||||
|
"ERROR: %m :\n Invalid value (%d) for parameter data_in_width (lower bound: 2)",
|
||||||
|
data_in_width );
|
||||||
|
end
|
||||||
|
|
||||||
|
if ( (data_out_width < 2) || (data_out_width > psum_width-frac_coef_width) ) begin
|
||||||
|
param_err_flg = 1;
|
||||||
|
$display(
|
||||||
|
"ERROR: %m :\n Invalid value (%d) for parameter data_out_width (legal range: 2 to psum_width-frac_coef_width)",
|
||||||
|
data_out_width );
|
||||||
|
end
|
||||||
|
|
||||||
|
if ( (frac_data_out_width < 0) || (frac_data_out_width > data_out_width-1) ) begin
|
||||||
|
param_err_flg = 1;
|
||||||
|
$display(
|
||||||
|
"ERROR: %m :\n Invalid value (%d) for parameter frac_data_out_width (legal range: 0 to data_out_width-1)",
|
||||||
|
frac_data_out_width );
|
||||||
|
end
|
||||||
|
|
||||||
|
if (feedback_width < 2) begin
|
||||||
|
param_err_flg = 1;
|
||||||
|
$display(
|
||||||
|
"ERROR: %m :\n Invalid value (%d) for parameter feedback_width (lower bound: 2)",
|
||||||
|
feedback_width );
|
||||||
|
end
|
||||||
|
|
||||||
|
if (max_coef_width < 2) begin
|
||||||
|
param_err_flg = 1;
|
||||||
|
$display(
|
||||||
|
"ERROR: %m :\n Invalid value (%d) for parameter max_coef_width (lower bound: 2)",
|
||||||
|
max_coef_width );
|
||||||
|
end
|
||||||
|
|
||||||
|
if ( (frac_coef_width < 0) || (frac_coef_width > max_coef_width-1) ) begin
|
||||||
|
param_err_flg = 1;
|
||||||
|
$display(
|
||||||
|
"ERROR: %m :\n Invalid value (%d) for parameter frac_coef_width (legal range: 0 to max_coef_width-1)",
|
||||||
|
frac_coef_width );
|
||||||
|
end
|
||||||
|
|
||||||
|
if ( (saturation_mode < 0) || (saturation_mode > 1) ) begin
|
||||||
|
param_err_flg = 1;
|
||||||
|
$display(
|
||||||
|
"ERROR: %m :\n Invalid value (%d) for parameter saturation_mode (legal range: 0 to 1)",
|
||||||
|
saturation_mode );
|
||||||
|
end
|
||||||
|
|
||||||
|
if ( (out_reg < 0) || (out_reg > 1) ) begin
|
||||||
|
param_err_flg = 1;
|
||||||
|
$display(
|
||||||
|
"ERROR: %m :\n Invalid value (%d) for parameter out_reg (legal range: 0 to 1)",
|
||||||
|
out_reg );
|
||||||
|
end
|
||||||
|
|
||||||
|
if ( param_err_flg == 1) begin
|
||||||
|
$display(
|
||||||
|
"%m :\n Simulation aborted due to invalid parameter value(s)");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
|
||||||
|
end // parameter_check
|
||||||
|
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
// Report unknown clock inputs
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
always @ (clk) begin : clk_monitor
|
||||||
|
if ( (clk !== 1'b0) && (clk !== 1'b1) && ($time > 0) )
|
||||||
|
$display( "WARNING: %m :\n at time = %t, detected unknown value, %b, on clk input.",
|
||||||
|
$time, clk );
|
||||||
|
end // clk_monitor
|
||||||
|
|
||||||
|
// synopsys translate_on
|
||||||
|
endmodule
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
module FixRound #(
|
||||||
|
parameter integer Data_width = 8
|
||||||
|
,parameter integer Fix_frac_coef_width = 31//division
|
||||||
|
|
||||||
|
)
|
||||||
|
(
|
||||||
|
input clk
|
||||||
|
,input rstn
|
||||||
|
,input en
|
||||||
|
,input signed [Data_width-1:0] din
|
||||||
|
,output signed [Data_width-1:0] dout
|
||||||
|
);
|
||||||
|
|
||||||
|
reg signed [Data_width-1:0] din_round;
|
||||||
|
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
begin
|
||||||
|
din_round <= 'h0;
|
||||||
|
end
|
||||||
|
else if(en) begin
|
||||||
|
if(din[Data_width-1] == 1'b0)
|
||||||
|
begin
|
||||||
|
din_round <= din + {{1'b1},{(Fix_frac_coef_width-1){1'b0}}};
|
||||||
|
end
|
||||||
|
else if (din[Data_width-1] == 1'b1)
|
||||||
|
begin
|
||||||
|
din_round <= din + {{1'b1},{(Fix_frac_coef_width-1){1'b0}}} - 1'b1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
din_round <= din_round;
|
||||||
|
end
|
||||||
|
|
||||||
|
assign dout = din_round;
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
|
@ -0,0 +1,229 @@
|
||||||
|
//+FHDR--------------------------------------------------------------------------------------------------------
|
||||||
|
// Company:
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// File Name : MeanIntp_8.v
|
||||||
|
// Department :
|
||||||
|
// Author : thfu
|
||||||
|
// Author's Tel :
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Relese History
|
||||||
|
// Version Date Author Description
|
||||||
|
// 0.1 2024-09-27 thfu top module of 8 mean interpolation
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Keywords :
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Parameter
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Purpose :
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Target Device:
|
||||||
|
// Tool versions:
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Reuse Issues
|
||||||
|
// Reset Strategy:
|
||||||
|
// Clock Domains:
|
||||||
|
// Critical Timing:
|
||||||
|
// Asynchronous I/F:
|
||||||
|
// Synthesizable (y/n):
|
||||||
|
// Other:
|
||||||
|
//-FHDR--------------------------------------------------------------------------------------------------------
|
||||||
|
module MeanIntp_8(
|
||||||
|
clk,
|
||||||
|
rstn,
|
||||||
|
en,
|
||||||
|
intp_mode,
|
||||||
|
din, //input
|
||||||
|
dout_0,//output
|
||||||
|
dout_1,
|
||||||
|
dout_2,
|
||||||
|
dout_3,
|
||||||
|
dout_4,
|
||||||
|
dout_5,
|
||||||
|
dout_6,
|
||||||
|
dout_7
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
input rstn;
|
||||||
|
input clk;
|
||||||
|
input en;
|
||||||
|
input [1:0] intp_mode;
|
||||||
|
input signed [15:0] din;
|
||||||
|
|
||||||
|
output signed [15:0] dout_0;
|
||||||
|
output signed [15:0] dout_1;
|
||||||
|
output signed [15:0] dout_2;
|
||||||
|
output signed [15:0] dout_3;
|
||||||
|
output signed [15:0] dout_4;
|
||||||
|
output signed [15:0] dout_5;
|
||||||
|
output signed [15:0] dout_6;
|
||||||
|
output signed [15:0] dout_7;
|
||||||
|
|
||||||
|
reg [15:0] din_r1;
|
||||||
|
reg [15:0] din_r2;
|
||||||
|
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
begin
|
||||||
|
din_r1 <= 'h0;
|
||||||
|
din_r2 <= 'h0;
|
||||||
|
end
|
||||||
|
else if(en)
|
||||||
|
begin
|
||||||
|
din_r1 <= din;
|
||||||
|
din_r2 <= din_r1;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
din_r1 <= din_r1;
|
||||||
|
din_r2 <= din_r2;
|
||||||
|
end
|
||||||
|
|
||||||
|
wire [16:0] sum_0_1;
|
||||||
|
wire [16:0] sum_0_1_round0;
|
||||||
|
wire [16:0] sum_0_1_round1;
|
||||||
|
wire [16:0] sum_0_1_round2;
|
||||||
|
|
||||||
|
assign sum_0_1 = {{1 {din[15]}},din} - {{1 {din_r1[15]}},din_r1};
|
||||||
|
|
||||||
|
FixRound #(17,1) u_round1 (clk, rstn, en, sum_0_1, sum_0_1_round0);
|
||||||
|
FixRound #(17,2) u_round2 (clk, rstn, en, sum_0_1, sum_0_1_round1);
|
||||||
|
FixRound #(17,3) u_round3 (clk, rstn, en, sum_0_1, sum_0_1_round2);
|
||||||
|
|
||||||
|
wire signed [16:0] diff_1_2;//(din-din_r1)/2
|
||||||
|
wire signed [16:0] diff_1_4;//(din-din_r1)/4
|
||||||
|
wire signed [16:0] diff_1_8;//(din-din_r1)/8
|
||||||
|
|
||||||
|
assign diff_1_2 = {{1 {sum_0_1_round0[16]}},sum_0_1_round0[16:1]};
|
||||||
|
assign diff_1_4 = {{2 {sum_0_1_round1[16]}},sum_0_1_round1[16:2]};
|
||||||
|
assign diff_1_8 = {{3 {sum_0_1_round2[16]}},sum_0_1_round2[16:3]};
|
||||||
|
|
||||||
|
reg signed [16:0] dout_r0;
|
||||||
|
reg signed [16:0] dout_r1;
|
||||||
|
reg signed [16:0] dout_r2;
|
||||||
|
reg signed [16:0] dout_r3;
|
||||||
|
reg signed [16:0] dout_r4;
|
||||||
|
reg signed [16:0] dout_r5;
|
||||||
|
reg signed [16:0] dout_r6;
|
||||||
|
reg signed [16:0] dout_r7;
|
||||||
|
|
||||||
|
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
begin
|
||||||
|
dout_r0 <= 'h0;
|
||||||
|
dout_r1 <= 'h0;
|
||||||
|
dout_r2 <= 'h0;
|
||||||
|
dout_r3 <= 'h0;
|
||||||
|
dout_r4 <= 'h0;
|
||||||
|
dout_r5 <= 'h0;
|
||||||
|
dout_r6 <= 'h0;
|
||||||
|
dout_r7 <= 'h0;
|
||||||
|
end
|
||||||
|
else if(en)
|
||||||
|
begin
|
||||||
|
dout_r0 <= din_r2;
|
||||||
|
dout_r1 <= din_r2 + diff_1_8;
|
||||||
|
dout_r2 <= din_r2 + diff_1_4;
|
||||||
|
dout_r3 <= din_r2 + diff_1_4 + diff_1_8;
|
||||||
|
dout_r4 <= din_r2 + diff_1_2;
|
||||||
|
dout_r5 <= din_r2 + diff_1_2 + diff_1_8;
|
||||||
|
dout_r6 <= din_r2 + diff_1_2 + diff_1_4;
|
||||||
|
dout_r7 <= din_r2 + diff_1_2 + diff_1_4 + diff_1_8;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
dout_r0 <= dout_r0;
|
||||||
|
dout_r1 <= dout_r1;
|
||||||
|
dout_r2 <= dout_r2;
|
||||||
|
dout_r3 <= dout_r3;
|
||||||
|
dout_r4 <= dout_r4;
|
||||||
|
dout_r5 <= dout_r5;
|
||||||
|
dout_r6 <= dout_r6;
|
||||||
|
dout_r7 <= dout_r7;
|
||||||
|
end
|
||||||
|
|
||||||
|
reg signed [15:0] mux_p_0;
|
||||||
|
reg signed [15:0] mux_p_1;
|
||||||
|
reg signed [15:0] mux_p_2;
|
||||||
|
reg signed [15:0] mux_p_3;
|
||||||
|
reg signed [15:0] mux_p_4;
|
||||||
|
reg signed [15:0] mux_p_5;
|
||||||
|
reg signed [15:0] mux_p_6;
|
||||||
|
reg signed [15:0] mux_p_7;
|
||||||
|
|
||||||
|
always@(posedge clk) begin
|
||||||
|
case(intp_mode)
|
||||||
|
2'b00:
|
||||||
|
begin
|
||||||
|
mux_p_0 <= dout_r0;
|
||||||
|
mux_p_1 <= 16'h0;
|
||||||
|
mux_p_2 <= 16'h0;
|
||||||
|
mux_p_3 <= 16'h0;
|
||||||
|
mux_p_4 <= 16'h0;
|
||||||
|
mux_p_5 <= 16'h0;
|
||||||
|
mux_p_6 <= 16'h0;
|
||||||
|
mux_p_7 <= 16'h0;
|
||||||
|
end
|
||||||
|
2'b01:
|
||||||
|
begin
|
||||||
|
mux_p_0 <= dout_r0;
|
||||||
|
mux_p_1 <= dout_r4;
|
||||||
|
mux_p_2 <= 16'h0;
|
||||||
|
mux_p_3 <= 16'h0;
|
||||||
|
mux_p_4 <= 16'h0;
|
||||||
|
mux_p_5 <= 16'h0;
|
||||||
|
mux_p_6 <= 16'h0;
|
||||||
|
mux_p_7 <= 16'h0;
|
||||||
|
end
|
||||||
|
2'b10:
|
||||||
|
begin
|
||||||
|
mux_p_0 <= dout_r0;
|
||||||
|
mux_p_1 <= dout_r2;
|
||||||
|
mux_p_2 <= dout_r4;
|
||||||
|
mux_p_3 <= dout_r6;
|
||||||
|
mux_p_4 <= 16'h0;
|
||||||
|
mux_p_5 <= 16'h0;
|
||||||
|
mux_p_6 <= 16'h0;
|
||||||
|
mux_p_7 <= 16'h0;
|
||||||
|
end
|
||||||
|
2'b11:
|
||||||
|
begin
|
||||||
|
mux_p_0 <= dout_r0;
|
||||||
|
mux_p_1 <= dout_r1;
|
||||||
|
mux_p_2 <= dout_r2;
|
||||||
|
mux_p_3 <= dout_r3;
|
||||||
|
mux_p_4 <= dout_r4;
|
||||||
|
mux_p_5 <= dout_r5;
|
||||||
|
mux_p_6 <= dout_r6;
|
||||||
|
mux_p_7 <= dout_r7;
|
||||||
|
end
|
||||||
|
default:
|
||||||
|
begin
|
||||||
|
mux_p_0 <= 16'h0;
|
||||||
|
mux_p_1 <= 16'h0;
|
||||||
|
mux_p_2 <= 16'h0;
|
||||||
|
mux_p_3 <= 16'h0;
|
||||||
|
mux_p_4 <= 16'h0;
|
||||||
|
mux_p_5 <= 16'h0;
|
||||||
|
mux_p_6 <= 16'h0;
|
||||||
|
mux_p_7 <= 16'h0;
|
||||||
|
end
|
||||||
|
|
||||||
|
endcase
|
||||||
|
end
|
||||||
|
|
||||||
|
assign dout_0 = mux_p_0[15:0];
|
||||||
|
assign dout_1 = mux_p_1[15:0];
|
||||||
|
assign dout_2 = mux_p_2[15:0];
|
||||||
|
assign dout_3 = mux_p_3[15:0];
|
||||||
|
assign dout_4 = mux_p_4[15:0];
|
||||||
|
assign dout_5 = mux_p_5[15:0];
|
||||||
|
assign dout_6 = mux_p_6[15:0];
|
||||||
|
assign dout_7 = mux_p_7[15:0];
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
|
@ -0,0 +1,543 @@
|
||||||
|
//+FHDR--------------------------------------------------------------------------------------------------------
|
||||||
|
// Company:
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// File Name : TailCorr_top.v
|
||||||
|
// Department :
|
||||||
|
// Author : thfu
|
||||||
|
// Author's Tel :
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Relese History
|
||||||
|
// Version Date Author Description
|
||||||
|
// 0.4 2024-11-07 thfu IIR filter using IP core
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Keywords :
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Parameter
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Purpose :
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Target Device:
|
||||||
|
// Tool versions:
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Reuse Issues
|
||||||
|
// Reset Strategy:
|
||||||
|
// Clock Domains:
|
||||||
|
// Critical Timing:
|
||||||
|
// Asynchronous I/F:
|
||||||
|
// Synthesizable (y/n):
|
||||||
|
// Other:
|
||||||
|
//-FHDR--------------------------------------------------------------------------------------------------------
|
||||||
|
module TailCorr_top
|
||||||
|
(
|
||||||
|
clk,
|
||||||
|
rstn,
|
||||||
|
en,
|
||||||
|
tc_bypass,
|
||||||
|
din_re,
|
||||||
|
din_im,
|
||||||
|
a0_re,
|
||||||
|
a0_im,
|
||||||
|
b0_re,
|
||||||
|
b0_im,
|
||||||
|
a1_re,
|
||||||
|
a1_im,
|
||||||
|
b1_re,
|
||||||
|
b1_im,
|
||||||
|
a2_re,
|
||||||
|
a2_im,
|
||||||
|
b2_re,
|
||||||
|
b2_im,
|
||||||
|
a3_re,
|
||||||
|
a3_im,
|
||||||
|
b3_re,
|
||||||
|
b3_im,
|
||||||
|
a4_re,
|
||||||
|
a4_im,
|
||||||
|
b4_re,
|
||||||
|
b4_im,
|
||||||
|
a5_re,
|
||||||
|
a5_im,
|
||||||
|
b5_re,
|
||||||
|
b5_im,
|
||||||
|
dout,
|
||||||
|
saturation_0,
|
||||||
|
saturation_1,
|
||||||
|
saturation_2,
|
||||||
|
saturation_3,
|
||||||
|
saturation_4,
|
||||||
|
saturation_5
|
||||||
|
);
|
||||||
|
|
||||||
|
parameter integer data_in_width = 16;
|
||||||
|
parameter integer max_coef_width = 32;
|
||||||
|
parameter integer frac_data_out_width = 20;//X for in,5
|
||||||
|
parameter integer frac_coef_width = 31;//division
|
||||||
|
parameter integer feedback_width = 36;
|
||||||
|
parameter integer data_out_width = 36;
|
||||||
|
parameter integer saturation_mode = 0;
|
||||||
|
parameter integer out_reg = 1;
|
||||||
|
|
||||||
|
input clk;
|
||||||
|
input rstn;
|
||||||
|
input en;
|
||||||
|
input tc_bypass;
|
||||||
|
input signed [data_in_width-1:0] din_re;
|
||||||
|
input signed [data_in_width-1:0] din_im;
|
||||||
|
input signed [frac_coef_width:0] a0_re;
|
||||||
|
input signed [frac_coef_width:0] a0_im;
|
||||||
|
input signed [frac_coef_width:0] b0_re;
|
||||||
|
input signed [frac_coef_width:0] b0_im;
|
||||||
|
input signed [frac_coef_width:0] a1_re;
|
||||||
|
input signed [frac_coef_width:0] a1_im;
|
||||||
|
input signed [frac_coef_width:0] b1_re;
|
||||||
|
input signed [frac_coef_width:0] b1_im;
|
||||||
|
input signed [frac_coef_width:0] a2_re;
|
||||||
|
input signed [frac_coef_width:0] a2_im;
|
||||||
|
input signed [frac_coef_width:0] b2_re;
|
||||||
|
input signed [frac_coef_width:0] b2_im;
|
||||||
|
input signed [frac_coef_width:0] a3_re;
|
||||||
|
input signed [frac_coef_width:0] a3_im;
|
||||||
|
input signed [frac_coef_width:0] b3_re;
|
||||||
|
input signed [frac_coef_width:0] b3_im;
|
||||||
|
input signed [frac_coef_width:0] a4_re;
|
||||||
|
input signed [frac_coef_width:0] a4_im;
|
||||||
|
input signed [frac_coef_width:0] b4_re;
|
||||||
|
input signed [frac_coef_width:0] b4_im;
|
||||||
|
input signed [frac_coef_width:0] a5_re;
|
||||||
|
input signed [frac_coef_width:0] a5_im;
|
||||||
|
input signed [frac_coef_width:0] b5_re;
|
||||||
|
input signed [frac_coef_width:0] b5_im;
|
||||||
|
output signed [15:0] dout;
|
||||||
|
output saturation_0;
|
||||||
|
output saturation_1;
|
||||||
|
output saturation_2;
|
||||||
|
output saturation_3;
|
||||||
|
output saturation_4;
|
||||||
|
output saturation_5;
|
||||||
|
|
||||||
|
wire signed [data_in_width-1:0] IIRin_re;
|
||||||
|
wire signed [data_in_width-1:0] IIRin_im;
|
||||||
|
wire signed [data_out_width-1:0] dout_0;
|
||||||
|
wire signed [data_out_width-1:0] dout_1;
|
||||||
|
wire signed [data_out_width-1:0] dout_2;
|
||||||
|
wire signed [data_out_width-1:0] dout_3;
|
||||||
|
wire signed [data_out_width-1:0] dout_4;
|
||||||
|
wire signed [data_out_width-1:0] dout_5;
|
||||||
|
wire signed [18:0] Ysum;
|
||||||
|
|
||||||
|
|
||||||
|
reg signed [15:0] dout_r;
|
||||||
|
|
||||||
|
diff inst_diffRe
|
||||||
|
(
|
||||||
|
.clk (clk ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.en (en ),
|
||||||
|
.din (din_re ),
|
||||||
|
.dout (IIRin_re )
|
||||||
|
);
|
||||||
|
|
||||||
|
diff inst_diffIm
|
||||||
|
(
|
||||||
|
.clk (clk ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.en (en ),
|
||||||
|
.din (din_im ),
|
||||||
|
.dout (IIRin_im )
|
||||||
|
);
|
||||||
|
|
||||||
|
DW_iir_dc_m
|
||||||
|
#(
|
||||||
|
.data_in_width (data_in_width ),
|
||||||
|
.data_out_width (data_out_width ),
|
||||||
|
.frac_data_out_width (frac_data_out_width),
|
||||||
|
.feedback_width (feedback_width ),
|
||||||
|
.max_coef_width (max_coef_width ),
|
||||||
|
.frac_coef_width (frac_coef_width ),
|
||||||
|
.saturation_mode (saturation_mode ),
|
||||||
|
.out_reg (out_reg )
|
||||||
|
)
|
||||||
|
inst_iir_0
|
||||||
|
(
|
||||||
|
.clk (clk ),
|
||||||
|
.rst_n (rstn ),
|
||||||
|
.init_n (rstn ),
|
||||||
|
.enable (en ),
|
||||||
|
.A1_coef (b0_re ),//Den
|
||||||
|
.A2_coef ('h0 ),
|
||||||
|
.B0_coef (a0_re ),//Num
|
||||||
|
.B1_coef ('h0 ),
|
||||||
|
.B2_coef ('h0 ),
|
||||||
|
.data_in (IIRin_re ),
|
||||||
|
.data_out (dout_0 ),
|
||||||
|
.saturation (saturation_0 )
|
||||||
|
);
|
||||||
|
|
||||||
|
DW_iir_dc_m
|
||||||
|
#(
|
||||||
|
.data_in_width (data_in_width ),
|
||||||
|
.data_out_width (data_out_width ),
|
||||||
|
.frac_data_out_width (frac_data_out_width),
|
||||||
|
.feedback_width (feedback_width ),
|
||||||
|
.max_coef_width (max_coef_width ),
|
||||||
|
.frac_coef_width (frac_coef_width ),
|
||||||
|
.saturation_mode (saturation_mode ),
|
||||||
|
.out_reg (out_reg )
|
||||||
|
)
|
||||||
|
inst_iir_1
|
||||||
|
(
|
||||||
|
.clk (clk ),
|
||||||
|
.rst_n (rstn ),
|
||||||
|
.init_n (rstn ),
|
||||||
|
.enable (en ),
|
||||||
|
.A1_coef (b1_re ),//Den
|
||||||
|
.A2_coef ('h0 ),
|
||||||
|
.B0_coef (a1_re ),//Num
|
||||||
|
.B1_coef ('h0 ),
|
||||||
|
.B2_coef ('h0 ),
|
||||||
|
.data_in (IIRin_re ),
|
||||||
|
.data_out (dout_1 ),
|
||||||
|
.saturation (saturation_1 )
|
||||||
|
);
|
||||||
|
|
||||||
|
DW_iir_dc_m
|
||||||
|
#(
|
||||||
|
.data_in_width (data_in_width ),
|
||||||
|
.data_out_width (data_out_width ),
|
||||||
|
.frac_data_out_width (frac_data_out_width),
|
||||||
|
.feedback_width (feedback_width ),
|
||||||
|
.max_coef_width (max_coef_width ),
|
||||||
|
.frac_coef_width (frac_coef_width ),
|
||||||
|
.saturation_mode (saturation_mode ),
|
||||||
|
.out_reg (out_reg )
|
||||||
|
)
|
||||||
|
inst_iir_2
|
||||||
|
(
|
||||||
|
.clk (clk ),
|
||||||
|
.rst_n (rstn ),
|
||||||
|
.init_n (rstn ),
|
||||||
|
.enable (en ),
|
||||||
|
.A1_coef (b2_re ),//Den
|
||||||
|
.A2_coef ('h0 ),
|
||||||
|
.B0_coef (a2_re ),//Num
|
||||||
|
.B1_coef ('h0 ),
|
||||||
|
.B2_coef ('h0 ),
|
||||||
|
.data_in (IIRin_re ),
|
||||||
|
.data_out (dout_2 ),
|
||||||
|
.saturation (saturation_2 )
|
||||||
|
);
|
||||||
|
|
||||||
|
DW_iir_dc_m
|
||||||
|
#(
|
||||||
|
.data_in_width (data_in_width ),
|
||||||
|
.data_out_width (data_out_width ),
|
||||||
|
.frac_data_out_width (frac_data_out_width),
|
||||||
|
.feedback_width (feedback_width ),
|
||||||
|
.max_coef_width (max_coef_width ),
|
||||||
|
.frac_coef_width (frac_coef_width ),
|
||||||
|
.saturation_mode (saturation_mode ),
|
||||||
|
.out_reg (out_reg )
|
||||||
|
)
|
||||||
|
inst_iir_3
|
||||||
|
(
|
||||||
|
.clk (clk ),
|
||||||
|
.rst_n (rstn ),
|
||||||
|
.init_n (rstn ),
|
||||||
|
.enable (en ),
|
||||||
|
.A1_coef (b3_re ),//Den
|
||||||
|
.A2_coef ('h0 ),
|
||||||
|
.B0_coef (a3_re ),//Num
|
||||||
|
.B1_coef ('h0 ),
|
||||||
|
.B2_coef ('h0 ),
|
||||||
|
.data_in (IIRin_re ),
|
||||||
|
.data_out (dout_3 ),
|
||||||
|
.saturation (saturation_3 )
|
||||||
|
);
|
||||||
|
|
||||||
|
DW_iir_dc_m
|
||||||
|
#(
|
||||||
|
.data_in_width (data_in_width ),
|
||||||
|
.data_out_width (data_out_width ),
|
||||||
|
.frac_data_out_width (frac_data_out_width),
|
||||||
|
.feedback_width (feedback_width ),
|
||||||
|
.max_coef_width (max_coef_width ),
|
||||||
|
.frac_coef_width (frac_coef_width ),
|
||||||
|
.saturation_mode (saturation_mode ),
|
||||||
|
.out_reg (out_reg )
|
||||||
|
)
|
||||||
|
inst_iir_4
|
||||||
|
(
|
||||||
|
.clk (clk ),
|
||||||
|
.rst_n (rstn ),
|
||||||
|
.init_n (rstn ),
|
||||||
|
.enable (en ),
|
||||||
|
.A1_coef (b4_re ),//Den
|
||||||
|
.A2_coef ('h0 ),
|
||||||
|
.B0_coef (a4_re ),//Num
|
||||||
|
.B1_coef ('h0 ),
|
||||||
|
.B2_coef ('h0 ),
|
||||||
|
.data_in (IIRin_re ),
|
||||||
|
.data_out (dout_4 ),
|
||||||
|
.saturation (saturation_4 )
|
||||||
|
);
|
||||||
|
|
||||||
|
DW_iir_dc_m
|
||||||
|
#(
|
||||||
|
.data_in_width (data_in_width ),
|
||||||
|
.data_out_width (data_out_width ),
|
||||||
|
.frac_data_out_width (frac_data_out_width),
|
||||||
|
.feedback_width (feedback_width ),
|
||||||
|
.max_coef_width (max_coef_width ),
|
||||||
|
.frac_coef_width (frac_coef_width ),
|
||||||
|
.saturation_mode (saturation_mode ),
|
||||||
|
.out_reg (out_reg )
|
||||||
|
)
|
||||||
|
inst_iir_5
|
||||||
|
(
|
||||||
|
.clk (clk ),
|
||||||
|
.rst_n (rstn ),
|
||||||
|
.init_n (rstn ),
|
||||||
|
.enable (en ),
|
||||||
|
.A1_coef (b5_re ),//Den
|
||||||
|
.A2_coef ('h0 ),
|
||||||
|
.B0_coef (a5_re ),//Num
|
||||||
|
.B1_coef ('h0 ),
|
||||||
|
.B2_coef ('h0 ),
|
||||||
|
.data_in (IIRin_re ),
|
||||||
|
.data_out (dout_5 ),
|
||||||
|
.saturation (saturation_5 )
|
||||||
|
);
|
||||||
|
|
||||||
|
reg signed [data_out_width-1:0] dout_round_0;
|
||||||
|
reg signed [data_out_width-1:0] dout_round_1;
|
||||||
|
reg signed [data_out_width-1:0] dout_round_2;
|
||||||
|
reg signed [data_out_width-1:0] dout_round_3;
|
||||||
|
reg signed [data_out_width-1:0] dout_round_4;
|
||||||
|
reg signed [data_out_width-1:0] dout_round_5;
|
||||||
|
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
begin
|
||||||
|
dout_round_0 <= 'h0;
|
||||||
|
end
|
||||||
|
else if(en) begin
|
||||||
|
if(dout_0[35] == 1'b0)
|
||||||
|
begin
|
||||||
|
dout_round_0 <= dout_0 + {{1'b1},{(frac_data_out_width-1){1'b0}}};
|
||||||
|
end
|
||||||
|
else if (dout_0[35] == 1'b1)
|
||||||
|
begin
|
||||||
|
dout_round_0 <= dout_0 + {{1'b1},{(frac_data_out_width-1){1'b0}}} - 1'b1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
dout_round_0 <= dout_round_0;
|
||||||
|
end
|
||||||
|
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
begin
|
||||||
|
dout_round_1 <= 'h0;
|
||||||
|
end
|
||||||
|
else if(en) begin
|
||||||
|
if(dout_1[35] == 1'b0)
|
||||||
|
begin
|
||||||
|
dout_round_1 <= dout_1 + {{1'b1},{(frac_data_out_width-1){1'b0}}};
|
||||||
|
end
|
||||||
|
else if (dout_1[35] == 1'b1)
|
||||||
|
begin
|
||||||
|
dout_round_1 <= dout_1 + {{1'b1},{(frac_data_out_width-1){1'b0}}} - 1'b1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
dout_round_1 <= dout_round_1;
|
||||||
|
end
|
||||||
|
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
begin
|
||||||
|
dout_round_2 <= 'h0;
|
||||||
|
end
|
||||||
|
else if(en) begin
|
||||||
|
if(dout_2[35] == 1'b0)
|
||||||
|
begin
|
||||||
|
dout_round_2 <= dout_2 + {{1'b1},{(frac_data_out_width-1){1'b0}}};
|
||||||
|
end
|
||||||
|
else if (dout_2[35] == 1'b1)
|
||||||
|
begin
|
||||||
|
dout_round_2 <= dout_2 + {{1'b1},{(frac_data_out_width-1){1'b0}}} - 1'b1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
dout_round_2 <= dout_round_2;
|
||||||
|
end
|
||||||
|
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
begin
|
||||||
|
dout_round_3 <= 'h0;
|
||||||
|
end
|
||||||
|
else if(en) begin
|
||||||
|
if(dout_3[35] == 1'b0)
|
||||||
|
begin
|
||||||
|
dout_round_3 <= dout_3 + {{1'b1},{(frac_data_out_width-1){1'b0}}};
|
||||||
|
end
|
||||||
|
else if (dout_3[35] == 1'b1)
|
||||||
|
begin
|
||||||
|
dout_round_3 <= dout_3 + {{1'b1},{(frac_data_out_width-1){1'b0}}} - 1'b1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
dout_round_3 <= dout_round_3;
|
||||||
|
end
|
||||||
|
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
begin
|
||||||
|
dout_round_4 <= 'h0;
|
||||||
|
end
|
||||||
|
else if(en) begin
|
||||||
|
if(dout_4[35] == 1'b0)
|
||||||
|
begin
|
||||||
|
dout_round_4 <= dout_4 + {{1'b1},{(frac_data_out_width-1){1'b0}}};
|
||||||
|
end
|
||||||
|
else if (dout_4[35] == 1'b1)
|
||||||
|
begin
|
||||||
|
dout_round_4 <= dout_4 + {{1'b1},{(frac_data_out_width-1){1'b0}}} - 1'b1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
dout_round_4 <= dout_round_4;
|
||||||
|
end
|
||||||
|
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
begin
|
||||||
|
dout_round_5 <= 'h0;
|
||||||
|
end
|
||||||
|
else if(en) begin
|
||||||
|
if(dout_5[35] == 1'b0)
|
||||||
|
begin
|
||||||
|
dout_round_5 <= dout_5 + {{1'b1},{(frac_data_out_width-1){1'b0}}};
|
||||||
|
end
|
||||||
|
else if (dout_5[35] == 1'b1)
|
||||||
|
begin
|
||||||
|
dout_round_5 <= dout_5 + {{1'b1},{(frac_data_out_width-1){1'b0}}} - 1'b1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
dout_round_5 <= dout_round_5;
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
wire signed [15:0] dout_cut_0;
|
||||||
|
wire signed [15:0] dout_cut_1;
|
||||||
|
wire signed [15:0] dout_cut_2;
|
||||||
|
wire signed [15:0] dout_cut_3;
|
||||||
|
wire signed [15:0] dout_cut_4;
|
||||||
|
wire signed [15:0] dout_cut_5;
|
||||||
|
|
||||||
|
assign dout_cut_0 = dout_round_0[35:20];
|
||||||
|
assign dout_cut_1 = dout_round_1[35:20];
|
||||||
|
assign dout_cut_2 = dout_round_2[35:20];
|
||||||
|
assign dout_cut_3 = dout_round_3[35:20];
|
||||||
|
assign dout_cut_4 = dout_round_4[35:20];
|
||||||
|
assign dout_cut_5 = dout_round_5[35:20];
|
||||||
|
|
||||||
|
reg signed [15:0] dout_cut0_r0;
|
||||||
|
reg signed [15:0] dout_cut1_r0;
|
||||||
|
reg signed [15:0] dout_cut2_r0;
|
||||||
|
reg signed [15:0] dout_cut3_r0;
|
||||||
|
reg signed [15:0] dout_cut4_r0;
|
||||||
|
reg signed [15:0] dout_cut5_r0;
|
||||||
|
|
||||||
|
always @(posedge clk or negedge rstn)
|
||||||
|
if(!rstn) begin
|
||||||
|
dout_cut0_r0 <= 'h0;
|
||||||
|
dout_cut1_r0 <= 'h0;
|
||||||
|
dout_cut2_r0 <= 'h0;
|
||||||
|
dout_cut3_r0 <= 'h0;
|
||||||
|
dout_cut4_r0 <= 'h0;
|
||||||
|
dout_cut5_r0 <= 'h0;
|
||||||
|
end
|
||||||
|
else if(en) begin
|
||||||
|
dout_cut0_r0 <= dout_cut_0;
|
||||||
|
dout_cut1_r0 <= dout_cut_1;
|
||||||
|
dout_cut2_r0 <= dout_cut_2;
|
||||||
|
dout_cut3_r0 <= dout_cut_3;
|
||||||
|
dout_cut4_r0 <= dout_cut_4;
|
||||||
|
dout_cut5_r0 <= dout_cut_5;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
dout_cut0_r0 <= dout_cut0_r0;
|
||||||
|
dout_cut1_r0 <= dout_cut1_r0;
|
||||||
|
dout_cut2_r0 <= dout_cut2_r0;
|
||||||
|
dout_cut3_r0 <= dout_cut3_r0;
|
||||||
|
dout_cut4_r0 <= dout_cut4_r0;
|
||||||
|
dout_cut5_r0 <= dout_cut5_r0;
|
||||||
|
end
|
||||||
|
|
||||||
|
reg signed [15:0] din_r0;
|
||||||
|
reg signed [15:0] din_r1;
|
||||||
|
reg signed [15:0] din_r2;
|
||||||
|
reg signed [15:0] din_r3;
|
||||||
|
reg signed [15:0] din_r4;
|
||||||
|
reg signed [15:0] din_r5;
|
||||||
|
|
||||||
|
always @(posedge clk or negedge rstn)
|
||||||
|
if (!rstn)
|
||||||
|
begin
|
||||||
|
din_r0 <= 'h0;
|
||||||
|
din_r1 <= 'h0;
|
||||||
|
din_r2 <= 'h0;
|
||||||
|
din_r3 <= 'h0;
|
||||||
|
din_r4 <= 'h0;
|
||||||
|
din_r5 <= 'h0;
|
||||||
|
end
|
||||||
|
else if(en)
|
||||||
|
begin
|
||||||
|
din_r0 <= din_re;
|
||||||
|
din_r1 <= din_r0;
|
||||||
|
din_r2 <= din_r1;
|
||||||
|
din_r3 <= din_r2;
|
||||||
|
din_r4 <= din_r3;
|
||||||
|
din_r5 <= din_r4;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
din_r0 <= din_r0;
|
||||||
|
din_r1 <= din_r1;
|
||||||
|
din_r2 <= din_r2;
|
||||||
|
din_r3 <= din_r3;
|
||||||
|
din_r4 <= din_r4;
|
||||||
|
din_r5 <= din_r5;
|
||||||
|
end
|
||||||
|
|
||||||
|
assign Ysum = din_r4 + dout_cut0_r0 + dout_cut1_r0 + dout_cut2_r0 + dout_cut3_r0 + dout_cut4_r0 + dout_cut5_r0;
|
||||||
|
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if (!rstn)begin
|
||||||
|
dout_r <= 'h0;
|
||||||
|
end
|
||||||
|
else if(tc_bypass)begin
|
||||||
|
dout_r <= din_re;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
if (en) begin
|
||||||
|
if(Ysum[16:15]==2'b01)
|
||||||
|
dout_r <= 16'd32767;
|
||||||
|
else if(Ysum[16:15]==2'b10)
|
||||||
|
dout_r <= -16'd32768;
|
||||||
|
else
|
||||||
|
dout_r <= Ysum[15:0];
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
dout_r <= dout_r;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
assign dout = dout_r;
|
||||||
|
endmodule
|
||||||
|
|
|
@ -0,0 +1,76 @@
|
||||||
|
//+FHDR--------------------------------------------------------------------------------------------------------
|
||||||
|
// Company:
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// File Name : diff.v
|
||||||
|
// Department :
|
||||||
|
// Author : thfu
|
||||||
|
// Author's Tel :
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Relese History
|
||||||
|
// Version Date Author Description
|
||||||
|
// 0.1 2024-05-11 thfu
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Keywords :
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Parameter
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Purpose :
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Target Device:
|
||||||
|
// Tool versions:
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Reuse Issues
|
||||||
|
// Reset Strategy:
|
||||||
|
// Clock Domains:
|
||||||
|
// Critical Timing:
|
||||||
|
// Asynchronous I/F:
|
||||||
|
// Synthesizable (y/n):
|
||||||
|
// Other:
|
||||||
|
//-FHDR--------------------------------------------------------------------------------------------------------
|
||||||
|
module diff(
|
||||||
|
clk,
|
||||||
|
rstn,
|
||||||
|
en,
|
||||||
|
din,
|
||||||
|
dout
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
input rstn;
|
||||||
|
input clk;
|
||||||
|
input en;
|
||||||
|
input signed [15:0] din;
|
||||||
|
|
||||||
|
output signed [15:0] dout;
|
||||||
|
|
||||||
|
|
||||||
|
reg [15:0] din_r;
|
||||||
|
reg [15:0] din_r1;
|
||||||
|
reg [15:0] out_r;
|
||||||
|
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
begin
|
||||||
|
din_r <= 16'd0;
|
||||||
|
din_r1 <= 16'd0;
|
||||||
|
out_r <= 16'd0;
|
||||||
|
end
|
||||||
|
else if(en)
|
||||||
|
begin
|
||||||
|
din_r <= din;
|
||||||
|
din_r1 <= din_r;
|
||||||
|
out_r <= din_r - din_r1;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
din_r <= din_r;
|
||||||
|
din_r1 <= din_r1;
|
||||||
|
out_r <= out_r;
|
||||||
|
end
|
||||||
|
|
||||||
|
assign dout = out_r;
|
||||||
|
|
||||||
|
endmodule
|
|
@ -0,0 +1,206 @@
|
||||||
|
//+FHDR--------------------------------------------------------------------------------------------------------
|
||||||
|
// Company:
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// File Name : Z_dsp.v
|
||||||
|
// Department :
|
||||||
|
// Author : thfu
|
||||||
|
// Author's Tel :
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Relese History
|
||||||
|
// Version Date Author Description
|
||||||
|
// 0.3 2024-11-09 thfu to fit the addition of IP core
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Keywords :
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Parameter
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Purpose :
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Target Device:
|
||||||
|
// Tool versions:
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Reuse Issues
|
||||||
|
// Reset Strategy:
|
||||||
|
// Clock Domains:
|
||||||
|
// Critical Timing:
|
||||||
|
// Asynchronous I/F:
|
||||||
|
// Synthesizable (y/n):
|
||||||
|
// Other:
|
||||||
|
//-FHDR--------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
module z_dsp
|
||||||
|
(
|
||||||
|
input clk,
|
||||||
|
input rstn,
|
||||||
|
input en, //enable
|
||||||
|
input [1:0] dac_mode_sel, //2'b00:NRZ mode;2'b01:Double data mode;
|
||||||
|
//2'b10:Double Double data mode;2'b11:reserve;
|
||||||
|
input tc_bypass,
|
||||||
|
input [1:0] intp_mode, //2'b00:x1;2'b01:x2,'b10:x4;other:reserve;
|
||||||
|
input vldi,
|
||||||
|
input signed [15:0] din_re,
|
||||||
|
input signed [15:0] din_im,
|
||||||
|
input signed [31:0] a0_re, //a0's real part
|
||||||
|
input signed [31:0] a0_im, //a0's image part
|
||||||
|
input signed [31:0] b0_re,
|
||||||
|
input signed [31:0] b0_im,
|
||||||
|
input signed [31:0] a1_re,
|
||||||
|
input signed [31:0] a1_im,
|
||||||
|
input signed [31:0] b1_re,
|
||||||
|
input signed [31:0] b1_im,
|
||||||
|
input signed [31:0] a2_re,
|
||||||
|
input signed [31:0] a2_im,
|
||||||
|
input signed [31:0] b2_re,
|
||||||
|
input signed [31:0] b2_im,
|
||||||
|
input signed [31:0] a3_re,
|
||||||
|
input signed [31:0] a3_im,
|
||||||
|
input signed [31:0] b3_re,
|
||||||
|
input signed [31:0] b3_im,
|
||||||
|
input signed [31:0] a4_re,
|
||||||
|
input signed [31:0] a4_im,
|
||||||
|
input signed [31:0] b4_re,
|
||||||
|
input signed [31:0] b4_im,
|
||||||
|
input signed [31:0] a5_re,
|
||||||
|
input signed [31:0] a5_im,
|
||||||
|
input signed [31:0] b5_re,
|
||||||
|
input signed [31:0] b5_im,
|
||||||
|
output signed [15:0] dout0,
|
||||||
|
output signed [15:0] dout1,
|
||||||
|
output signed [15:0] dout2,
|
||||||
|
output signed [15:0] dout3,
|
||||||
|
output vldo,
|
||||||
|
output saturation_0,
|
||||||
|
output saturation_1,
|
||||||
|
output saturation_2,
|
||||||
|
output saturation_3,
|
||||||
|
output saturation_4,
|
||||||
|
output saturation_5
|
||||||
|
);
|
||||||
|
|
||||||
|
parameter Delay = 9-1;
|
||||||
|
|
||||||
|
wire signed [15:0] IIR_out;
|
||||||
|
|
||||||
|
reg [Delay:0] vldo_r;
|
||||||
|
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
begin
|
||||||
|
vldo_r <= 'h0;
|
||||||
|
end
|
||||||
|
else if(en)
|
||||||
|
begin
|
||||||
|
vldo_r <= {vldo_r[Delay:0], vldi};//Delay with 8 clk
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
vldo_r <= vldo_r;
|
||||||
|
end
|
||||||
|
|
||||||
|
assign vldo = vldo_r[Delay];
|
||||||
|
|
||||||
|
TailCorr_top inst_TailCorr_top
|
||||||
|
(
|
||||||
|
.clk (clk ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.en (en ),
|
||||||
|
.tc_bypass (tc_bypass ),
|
||||||
|
.din_re (din_re ),
|
||||||
|
.din_im (din_im ),
|
||||||
|
.a0_re (a0_re ),
|
||||||
|
.a0_im (a0_im ),
|
||||||
|
.b0_re (b0_re ),
|
||||||
|
.b0_im (b0_im ),
|
||||||
|
.a1_re (a1_re ),
|
||||||
|
.a1_im (a1_im ),
|
||||||
|
.b1_re (b1_re ),
|
||||||
|
.b1_im (b1_im ),
|
||||||
|
.a2_re (a2_re ),
|
||||||
|
.a2_im (a2_im ),
|
||||||
|
.b2_re (b2_re ),
|
||||||
|
.b2_im (b2_im ),
|
||||||
|
.a3_re (a3_re ),
|
||||||
|
.a3_im (a3_im ),
|
||||||
|
.b3_re (b3_re ),
|
||||||
|
.b3_im (b3_im ),
|
||||||
|
.a4_re (a4_re ),
|
||||||
|
.a4_im (a4_im ),
|
||||||
|
.b4_re (b4_re ),
|
||||||
|
.b4_im (b4_im ),
|
||||||
|
.a5_re (a5_re ),
|
||||||
|
.a5_im (a5_im ),
|
||||||
|
.b5_re (b5_re ),
|
||||||
|
.b5_im (b5_im ),
|
||||||
|
.dout (IIR_out ),
|
||||||
|
.saturation_0 (saturation_0 ),
|
||||||
|
.saturation_1 (saturation_1 ),
|
||||||
|
.saturation_2 (saturation_2 ),
|
||||||
|
.saturation_3 (saturation_3 ),
|
||||||
|
.saturation_4 (saturation_4 ),
|
||||||
|
.saturation_5 (saturation_5 )
|
||||||
|
);
|
||||||
|
|
||||||
|
wire signed [15:0] dout_0;
|
||||||
|
wire signed [15:0] dout_1;
|
||||||
|
wire signed [15:0] dout_2;
|
||||||
|
wire signed [15:0] dout_3;
|
||||||
|
wire signed [15:0] dout_4;
|
||||||
|
wire signed [15:0] dout_5;
|
||||||
|
wire signed [15:0] dout_6;
|
||||||
|
wire signed [15:0] dout_7;
|
||||||
|
|
||||||
|
|
||||||
|
MeanIntp_8 inst_MeanIntp_8
|
||||||
|
(
|
||||||
|
.clk (clk ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.en (en ),
|
||||||
|
.intp_mode (intp_mode ),
|
||||||
|
.din (IIR_out ),
|
||||||
|
.dout_0 (dout_0 ),
|
||||||
|
.dout_1 (dout_1 ),
|
||||||
|
.dout_2 (dout_2 ),
|
||||||
|
.dout_3 (dout_3 ),
|
||||||
|
.dout_4 (dout_4 ),
|
||||||
|
.dout_5 (dout_5 ),
|
||||||
|
.dout_6 (dout_6 ),
|
||||||
|
.dout_7 (dout_7 )
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
reg signed [15:0] doutf_0;
|
||||||
|
reg signed [15:0] doutf_1;
|
||||||
|
reg signed [15:0] doutf_2;
|
||||||
|
reg signed [15:0] doutf_3;
|
||||||
|
|
||||||
|
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if(!rstn) begin
|
||||||
|
doutf_0 <= 0;
|
||||||
|
doutf_1 <= 0;
|
||||||
|
doutf_2 <= 0;
|
||||||
|
doutf_3 <= 0;
|
||||||
|
end
|
||||||
|
else if(en) begin
|
||||||
|
doutf_0 <= dout_0;
|
||||||
|
doutf_1 <= dout_1;
|
||||||
|
doutf_2 <= dout_2;
|
||||||
|
doutf_3 <= dout_3;
|
||||||
|
end
|
||||||
|
|
||||||
|
else begin
|
||||||
|
doutf_0 <= dout_4;
|
||||||
|
doutf_1 <= dout_5;
|
||||||
|
doutf_2 <= dout_6;
|
||||||
|
doutf_3 <= dout_7;
|
||||||
|
end
|
||||||
|
|
||||||
|
assign dout0 = doutf_0;
|
||||||
|
assign dout1 = doutf_1;
|
||||||
|
assign dout2 = doutf_2;
|
||||||
|
assign dout3 = doutf_3;
|
||||||
|
|
||||||
|
endmodule
|
|
@ -0,0 +1,140 @@
|
||||||
|
//+FHDR--------------------------------------------------------------------------------------------------------
|
||||||
|
// Company:
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// File Name : Z_dsp_en_Test.v
|
||||||
|
// Department :
|
||||||
|
// Author : thfu
|
||||||
|
// Author's Tel :
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Relese History
|
||||||
|
// Version Date Author Description
|
||||||
|
// 0.1 2024-11-12 thfu Test Enable signal using clk divided by 2
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Keywords :
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Parameter
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Purpose :
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Target Device:
|
||||||
|
// Tool versions:
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Reuse Issues
|
||||||
|
// Reset Strategy:
|
||||||
|
// Clock Domains:
|
||||||
|
// Critical Timing:
|
||||||
|
// Asynchronous I/F:
|
||||||
|
// Synthesizable (y/n):
|
||||||
|
// Other:
|
||||||
|
//-FHDR--------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
module z_dsp_en_Test
|
||||||
|
(
|
||||||
|
input clk,
|
||||||
|
input rstn,
|
||||||
|
input [1:0] dac_mode_sel, //2'b00:NRZ mode;2'b01:Double data mode;
|
||||||
|
//2'b10:Double Double data mode;2'b11:reserve;
|
||||||
|
input tc_bypass,
|
||||||
|
input vldi,
|
||||||
|
input [1:0] intp_mode, //2'b00:x1;2'b01:x2,'b10:x4;other:reserve;
|
||||||
|
input signed [15:0] din_re,
|
||||||
|
input signed [15:0] din_im,
|
||||||
|
input signed [31:0] a0_re, //a0's real part
|
||||||
|
input signed [31:0] a0_im, //a0's image part
|
||||||
|
input signed [31:0] b0_re,
|
||||||
|
input signed [31:0] b0_im,
|
||||||
|
input signed [31:0] a1_re,
|
||||||
|
input signed [31:0] a1_im,
|
||||||
|
input signed [31:0] b1_re,
|
||||||
|
input signed [31:0] b1_im,
|
||||||
|
input signed [31:0] a2_re,
|
||||||
|
input signed [31:0] a2_im,
|
||||||
|
input signed [31:0] b2_re,
|
||||||
|
input signed [31:0] b2_im,
|
||||||
|
input signed [31:0] a3_re,
|
||||||
|
input signed [31:0] a3_im,
|
||||||
|
input signed [31:0] b3_re,
|
||||||
|
input signed [31:0] b3_im,
|
||||||
|
input signed [31:0] a4_re,
|
||||||
|
input signed [31:0] a4_im,
|
||||||
|
input signed [31:0] b4_re,
|
||||||
|
input signed [31:0] b4_im,
|
||||||
|
input signed [31:0] a5_re,
|
||||||
|
input signed [31:0] a5_im,
|
||||||
|
input signed [31:0] b5_re,
|
||||||
|
input signed [31:0] b5_im,
|
||||||
|
output signed [15:0] dout0,
|
||||||
|
output signed [15:0] dout1,
|
||||||
|
output signed [15:0] dout2,
|
||||||
|
output signed [15:0] dout3,
|
||||||
|
output vldo,
|
||||||
|
output saturation_0,
|
||||||
|
output saturation_1,
|
||||||
|
output saturation_2,
|
||||||
|
output saturation_3,
|
||||||
|
output saturation_4,
|
||||||
|
output saturation_5
|
||||||
|
);
|
||||||
|
|
||||||
|
wire signed [15:0] IIR_out;
|
||||||
|
|
||||||
|
reg en;
|
||||||
|
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
en <= 0;
|
||||||
|
else
|
||||||
|
en <= ~en;
|
||||||
|
|
||||||
|
z_dsp inst_z_dsp
|
||||||
|
(
|
||||||
|
.clk (clk ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.en (~en ),
|
||||||
|
.vldi (vldi ),
|
||||||
|
.tc_bypass (tc_bypass ),
|
||||||
|
.dac_mode_sel (dac_mode_sel ),
|
||||||
|
.intp_mode (intp_mode ),
|
||||||
|
.din_re (din_re ),
|
||||||
|
.din_im (din_im ),
|
||||||
|
.a0_re (a0_re ),
|
||||||
|
.a0_im (a0_im ),
|
||||||
|
.b0_re (b0_re ),
|
||||||
|
.b0_im (b0_im ),
|
||||||
|
.a1_re (a1_re ),
|
||||||
|
.a1_im (a1_im ),
|
||||||
|
.b1_re (b1_re ),
|
||||||
|
.b1_im (b1_im ),
|
||||||
|
.a2_re (a2_re ),
|
||||||
|
.a2_im (a2_im ),
|
||||||
|
.b2_re (b2_re ),
|
||||||
|
.b2_im (b2_im ),
|
||||||
|
.a3_re (a3_re ),
|
||||||
|
.a3_im (a3_im ),
|
||||||
|
.b3_re (b3_re ),
|
||||||
|
.b3_im (b3_im ),
|
||||||
|
.a4_re (a4_re ),
|
||||||
|
.a4_im (a4_im ),
|
||||||
|
.b4_re (b4_re ),
|
||||||
|
.b4_im (b4_im ),
|
||||||
|
.a5_re (a5_re ),
|
||||||
|
.a5_im (a5_im ),
|
||||||
|
.b5_re (b5_re ),
|
||||||
|
.b5_im (b5_im ),
|
||||||
|
.dout0 (dout0 ),
|
||||||
|
.dout1 (dout1 ),
|
||||||
|
.dout2 (dout2 ),
|
||||||
|
.dout3 (dout3 ),
|
||||||
|
.vldo (vldo ),
|
||||||
|
.saturation_0 (saturation_0 ),
|
||||||
|
.saturation_1 (saturation_1 ),
|
||||||
|
.saturation_2 (saturation_2 ),
|
||||||
|
.saturation_3 (saturation_3 ),
|
||||||
|
.saturation_4 (saturation_4 ),
|
||||||
|
.saturation_5 (saturation_5 )
|
||||||
|
);
|
||||||
|
|
||||||
|
endmodule
|
|
@ -0,0 +1,47 @@
|
||||||
|
clc;clear
|
||||||
|
%conver case from bin2dec
|
||||||
|
DataOrg_bin = textread("/home/thfu/work/Z-noSFQ/EZQ-Z-M-v1.0/case/TC_SingleWaveCombine_bin.txt",'%s');
|
||||||
|
DataOrg_dec = bin2dec(DataOrg_bin);
|
||||||
|
DataOrg_hex = string(dec2hex(DataOrg_dec,8));
|
||||||
|
|
||||||
|
DataRead_hex = upper(string(textread("/home/thfu/work/Z-noSFQ/EZQ-Z-M-v1.0/FIL/sim/ConfigData.dat",'%s')));
|
||||||
|
%%
|
||||||
|
%read data
|
||||||
|
clc;clear;close all
|
||||||
|
dout0 = importdata("/home/thfu/work/Z-noSFQ/EZQ-Z-M-v1.0/FIL/sim/dout0.dat")-32768;
|
||||||
|
dout1 = importdata("/home/thfu/work/Z-noSFQ/EZQ-Z-M-v1.0/FIL/sim/dout1.dat")-32768;
|
||||||
|
dout2 = importdata("/home/thfu/work/Z-noSFQ/EZQ-Z-M-v1.0/FIL/sim/dout2.dat")-32768;
|
||||||
|
dout3 = importdata("/home/thfu/work/Z-noSFQ/EZQ-Z-M-v1.0/FIL/sim/dout3.dat")-32768;
|
||||||
|
en = importdata("/home/thfu/work/Z-noSFQ/EZQ-Z-M-v1.0/FIL/sim/en.dat" ) ;
|
||||||
|
|
||||||
|
N_all = length(dout0);
|
||||||
|
cs_wave_all(1:4:4*N_all) = dout0;
|
||||||
|
cs_wave_all(2:4:4*N_all) = dout1;
|
||||||
|
cs_wave_all(3:4:4*N_all) = dout2;
|
||||||
|
cs_wave_all(4:4:4*N_all) = dout3;
|
||||||
|
|
||||||
|
start_indices = find(en(1:end-1) == 0 & en(2:end) == 1) + 1; %point from 0 to 1
|
||||||
|
end_indices = find(en(1:end-1) == 1 & en(2:end) == 0);
|
||||||
|
|
||||||
|
figure()
|
||||||
|
for i = 1:length(start_indices)
|
||||||
|
N = end_indices(i) - start_indices(i) + 1;
|
||||||
|
cs_wave{i}(1:4:4*N) = dout0(start_indices(i):end_indices(i));
|
||||||
|
cs_wave{i}(2:4:4*N) = dout1(start_indices(i):end_indices(i));
|
||||||
|
cs_wave{i}(3:4:4*N) = dout2(start_indices(i):end_indices(i));
|
||||||
|
cs_wave{i}(4:4:4*N) = dout3(start_indices(i):end_indices(i));
|
||||||
|
subplot(20,5,i);
|
||||||
|
plot(cs_wave{i});
|
||||||
|
end
|
||||||
|
|
||||||
|
% signalAnalyzer(cs_wave_all,'SampleRate',1);
|
||||||
|
%%
|
||||||
|
N = 31; % length of data
|
||||||
|
fs = 1;
|
||||||
|
fe = 0.3; % center frequency
|
||||||
|
D = 1;
|
||||||
|
nfft = 32;
|
||||||
|
[y,freq]=exzfft_ma(cs_wave_split{1},fe,fs,nfft,D);
|
||||||
|
|
||||||
|
figure(1)
|
||||||
|
plot(freq,abs(y))
|
|
@ -0,0 +1,61 @@
|
||||||
|
%in+iir_out with 8 intp
|
||||||
|
clc;clear;close all
|
||||||
|
|
||||||
|
in = importdata("/home/thfu/work/TailCorr/sim/in.dat");
|
||||||
|
diff_in = importdata("/home/thfu/work/TailCorr/sim/diff_in.dat");
|
||||||
|
wave_verdi = importdata("/home/thfu/work/TailCorr/sim/OrgOut.dat");
|
||||||
|
|
||||||
|
dout0 = importdata("/home/thfu/work/TailCorr/sim/dout0.dat");
|
||||||
|
dout1 = importdata("/home/thfu/work/TailCorr/sim/dout1.dat");
|
||||||
|
dout2 = importdata("/home/thfu/work/TailCorr/sim/dout2.dat");
|
||||||
|
dout3 = importdata("/home/thfu/work/TailCorr/sim/dout3.dat");
|
||||||
|
|
||||||
|
N = length(dout0);
|
||||||
|
cs_wave = zeros(4*N,1);
|
||||||
|
cs_wave(1:4:4*N) = dout0;
|
||||||
|
cs_wave(2:4:4*N) = dout1;
|
||||||
|
cs_wave(3:4:4*N) = dout2;
|
||||||
|
cs_wave(4:4:4*N) = dout3;
|
||||||
|
|
||||||
|
A = [0.025 0.015 0.0002 0];
|
||||||
|
tau = -[1/250 1/650 1/1600 0];
|
||||||
|
fs = 2e9;
|
||||||
|
|
||||||
|
coef_len = length(A);
|
||||||
|
for i = 1:coef_len
|
||||||
|
b(i) = exp(1e9/fs/(1-A(i))*tau(i));
|
||||||
|
a(i) = A(i)/1/(1-A(i))*exp(1e9/fs/(1-A(i))/2*tau(i));
|
||||||
|
h_ideal(:,i) = filter(a(i),[1 -b(i)],diff_in);
|
||||||
|
end
|
||||||
|
|
||||||
|
wave_float = in+ sum(h_ideal,2);
|
||||||
|
|
||||||
|
wave_float_len = length(wave_float);
|
||||||
|
wave_float_8 = interp1(1:wave_float_len,wave_float,1:1/8:(wave_float_len+1-1/8),'linear')';
|
||||||
|
|
||||||
|
[cs_wave_A,wave_float_8_A,Delay] = alignsignals(cs_wave,wave_float_8);
|
||||||
|
N = min(length(wave_float_8_A),length(cs_wave_A));
|
||||||
|
figure()
|
||||||
|
diff_plot(wave_float_8_A(90:end), cs_wave_A(162:end),'float','verdi',[0 N]);
|
||||||
|
%%
|
||||||
|
%Test of iir filter
|
||||||
|
[wave_float_A,wave_verdi_A,Delay] = alignsignals(wave_float,wave_verdi);
|
||||||
|
N = min(length(wave_float_A),length(wave_verdi_A));
|
||||||
|
figure()
|
||||||
|
diff_plot(wave_float_A, wave_verdi_A,'float','verdi',[0 N]);
|
||||||
|
%%
|
||||||
|
signalAnalyzer(wave_float,wave_verdi,'SampleRate',1);
|
||||||
|
%%
|
||||||
|
fprintf("a is %.10f\n",a)
|
||||||
|
fprintf("b is %.10f\n",b)
|
||||||
|
|
||||||
|
a_fix = round(a*2^31);
|
||||||
|
b_fix = round(b*2^31);
|
||||||
|
|
||||||
|
a_hex = dec2hex(a_fix,8);
|
||||||
|
b_hex = dec2hex(b_fix,8);
|
||||||
|
|
||||||
|
a_bin = dec2bin(a_fix,32);
|
||||||
|
b_bin = dec2bin(b_fix,32);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
function diff_plot(iir_out, Script_out,leg1,leg2,a)
|
||||||
|
|
||||||
|
N = min(length(iir_out),length(Script_out));
|
||||||
|
iir_out = iir_out(1:N);
|
||||||
|
Script_out = Script_out(1:N);
|
||||||
|
n = 0:1:N-1;
|
||||||
|
diff = iir_out-Script_out;
|
||||||
|
|
||||||
|
tiledlayout(2,1)
|
||||||
|
ax1 = nexttile;
|
||||||
|
plot(n,iir_out,n,Script_out)
|
||||||
|
xlabel('n')
|
||||||
|
legend(leg1,leg2)
|
||||||
|
xlim(a)
|
||||||
|
title('time domain')
|
||||||
|
grid on
|
||||||
|
|
||||||
|
ax2 = nexttile;
|
||||||
|
plot(n,diff)
|
||||||
|
xlabel('n')
|
||||||
|
title('diff')
|
||||||
|
grid on
|
||||||
|
hold on
|
||||||
|
xlim(a)
|
||||||
|
linkaxes([ax1,ax2],'x');
|
||||||
|
|
||||||
|
[~,R_mpos_max] = max(diff);
|
||||||
|
[~,R_mpos_min] = min(diff);
|
||||||
|
|
||||||
|
plot(n(R_mpos_max),diff(R_mpos_max),'r*')
|
||||||
|
plot(n(R_mpos_min),diff(R_mpos_min),'r*')
|
||||||
|
|
||||||
|
text(n(R_mpos_max), diff(R_mpos_max), ['(',num2str(n(R_mpos_max)),',',num2str(diff(R_mpos_max)),')'],'color','k');
|
||||||
|
text(n(R_mpos_min), diff(R_mpos_min), ['(',num2str(n(R_mpos_min)),',',num2str(diff(R_mpos_min)),')'],'color','k');
|
|
@ -0,0 +1,72 @@
|
||||||
|
%compare FIL with python script
|
||||||
|
function diff_plot_py(fs,iir_out, Script_out,title1,title2,a,amp,edge,fileID)
|
||||||
|
%输入数据长度不等时取其公共部分
|
||||||
|
N = min(length(iir_out),length(Script_out));
|
||||||
|
iir_out = iir_out(1:N);
|
||||||
|
Script_out = Script_out(1:N);
|
||||||
|
|
||||||
|
diff = (iir_out - Script_out)/amp;%求差,并归一化
|
||||||
|
|
||||||
|
n = (0:1:N-1)/fs;
|
||||||
|
%找出关心的数据点
|
||||||
|
n_edge = find(n>=edge-1e-12);%edge代表下降沿
|
||||||
|
n50 = find(n>=edge+20e-9-1e-12);%下降沿后20ns
|
||||||
|
n20_40 = find((n>=edge+20e-9-1e-12) & (n<=edge+40e-9+1e-12));%下降沿后20ns到40ns
|
||||||
|
n1000 = find(n>=edge+1000e-9-1e-12);%下降沿后1us
|
||||||
|
n1000_1100 = find((n>=edge+1000e-9-1e-12) & (n<=edge+1100e-9+1e-12));%下降沿后1us到1.1us
|
||||||
|
|
||||||
|
ne = find((abs(diff)>=1e-4) & (abs(diff)<1));%误差小于万分之一的点
|
||||||
|
ne(1) = 1;
|
||||||
|
|
||||||
|
window_length = 100e-9*fs;
|
||||||
|
diff_mean_window = movmean(diff,window_length);
|
||||||
|
diff_std_window = movstd(diff,window_length);
|
||||||
|
n_mean_window = find((abs(diff_mean_window)>=1e-4) );%100ns窗,误差均值小于万分之一点
|
||||||
|
n_std_window = find((abs(diff_std_window)>=1e-4) ); %100ns窗,误差方差小于万分之一点
|
||||||
|
n_common = max(n_mean_window(end),n_std_window(end));
|
||||||
|
%原始数据作图
|
||||||
|
tiledlayout(2,1)
|
||||||
|
ax1 = nexttile;
|
||||||
|
plot(n,iir_out,n,Script_out)
|
||||||
|
legend(title1,title2)
|
||||||
|
xlabel('t/s')
|
||||||
|
xlim(a)
|
||||||
|
grid on
|
||||||
|
hold on
|
||||||
|
|
||||||
|
%差值做图
|
||||||
|
ax2 = nexttile;
|
||||||
|
plot(n,diff)
|
||||||
|
xlabel('t/s')
|
||||||
|
title('diff')
|
||||||
|
grid on
|
||||||
|
hold on
|
||||||
|
xlim(a)
|
||||||
|
linkaxes([ax1,ax2],'x');
|
||||||
|
|
||||||
|
plot_p = @(x)[
|
||||||
|
plot(n(x),diff(x),'r*');
|
||||||
|
text(n(x), diff(x)+diff(x)*0.1, ['(',num2str(n(x)),',',num2str(diff(x)),')'],'color','k');
|
||||||
|
];
|
||||||
|
|
||||||
|
ne(1) = 1;
|
||||||
|
|
||||||
|
% [diff_max,R_mpos] = max(abs(diff));%误差最大值
|
||||||
|
% plot_p(R_mpos);
|
||||||
|
|
||||||
|
if a(2) <= 5e-6
|
||||||
|
plot_p(n_edge(1));%下降沿
|
||||||
|
% plot_p(R_mpos);
|
||||||
|
elseif a(2) == 20e-6
|
||||||
|
plot_p(n50(1)); %下降沿20ns
|
||||||
|
plot_p(n1000(1)); %下降沿1us
|
||||||
|
plot_p(ne(end)); %误差小于万分之一
|
||||||
|
fprintf(fileID,"Falling edge of 20ns~40ns mean :%.4e\t std :%.4e\t",mean(diff(n20_40)),std(diff(n20_40)));
|
||||||
|
fprintf(fileID,"Falling edge of 1us~1.1us mean :%.4e\t std :%.4e\t",mean(diff(n1000_1100)),std(diff(n1000_1100)));
|
||||||
|
% fprintf("The error after falling edge of 1us is:%.4e\t",diff(n1000(1)));
|
||||||
|
% fprintf("The time of erroe less than 1e-4 is :%.4e us\n",(n(ne(end))-n(n_edge(1))));
|
||||||
|
fprintf(fileID,"The mean and std stably less than 1e-4 is :%.4e s\n",(n(n_common)-n(n_edge(1))));
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
function [y,freq,c]=exzfft_ma(x,fe,fs,nfft,D)
|
||||||
|
|
||||||
|
nt=length(x); % ¼ÆËã¶ÁÈëÊý¾Ý³¤¶È
|
||||||
|
fi=fe-fs/D/2; % ¼ÆËãϸ»¯½ØÖ¹ÆµÂÊÏÂÏÞ
|
||||||
|
fa=fi+fs/D; % ¼ÆËãϸ»¯½ØÖ¹ÆµÂÊÉÏÏÞ
|
||||||
|
na=round(0.5 * nt/D+1); % È·¶¨µÍͨÂ˲¨Æ÷½ØÖ¹ÆµÂʶÔÓ¦µÄÆ×ÏßÌõÊý
|
||||||
|
% ÆµÒÆ
|
||||||
|
n=0: nt-1; % ÐòÁÐË÷ÒýºÅ
|
||||||
|
b=n*pi* (fi+fa)/fs; % ÉèÖõ¥Î»ÐýתÒò×Ó
|
||||||
|
y=x.*exp(-1i*b); % ½øÐÐÆµÒÆ
|
||||||
|
b= fft(y, nt); % FFT
|
||||||
|
% µÍͨÂ˲¨ºÍϲÉÑù
|
||||||
|
a(1: na) =b(1: na); % È¡ÕýƵÂʲ¿·ÖµÄµÍƵ³É·Ö
|
||||||
|
a(nt-na+2 : nt) =b(nt-na+2 : nt); % È¡¸ºÆµÂʲ¿·ÖµÄµÍƵ³É·Ö
|
||||||
|
b=ifft(a, nt); % IFFT
|
||||||
|
c=b(1 : D: nt); % ϲÉÑù
|
||||||
|
% Çóϸ»¯ÆµÆ×
|
||||||
|
y=fft(c, nfft) * 2/nfft;% ÔÙÒ»´ÎFFT
|
||||||
|
y=fftshift(y); % ÖØÐÂÅÅÁÐ
|
||||||
|
freq=fi+(0:nfft-1)*fs/D/nfft; % ƵÂÊÉèÖÃ
|
||||||
|
|
||||||
|
figure
|
||||||
|
plot(freq,20*log10(y))
|
||||||
|
grid on
|
|
@ -0,0 +1,305 @@
|
||||||
|
clc;clear;close all
|
||||||
|
|
||||||
|
% hdlsetuptoolpath('ToolName','Xilinx Vivado','ToolPath','D:\SoftWare\Xilinx\Vivado\2019.2\bin\vivado.bat');
|
||||||
|
%%配置参数
|
||||||
|
fs_L = 0.75e9; %硬件频率
|
||||||
|
fs_H = 12e9; %以高频近似理想信号
|
||||||
|
TargetFrequency = 3e9;
|
||||||
|
G = 1;
|
||||||
|
DownSample = 2;
|
||||||
|
simulink_time = 20e-6; %1.5*16e-6;1.5e-3
|
||||||
|
intp_mode = 3; %0不内插,1内插2倍,2内插4倍,3内插8倍
|
||||||
|
dac_mode_sel = 0; %选择DAC模式,0出八路,1邻近插值,2邻近插值
|
||||||
|
route_num = 5;
|
||||||
|
env_num = 7;
|
||||||
|
|
||||||
|
Ideal2Low = fs_H/(fs_L/2);
|
||||||
|
Ideal2Target = fs_H/TargetFrequency;
|
||||||
|
%% 添加路径、产生包络、配置S21参数、使用脚本计算
|
||||||
|
|
||||||
|
%%添加路径
|
||||||
|
% addpath(genpath('D:\Work\EnvData'));
|
||||||
|
% addpath(genpath('D:\Work\EnvData\data-v2'));
|
||||||
|
% addpath(genpath('D:\Work\TailCorr_20241008_NoGit'));
|
||||||
|
% addpath('D:\Work\TailCorr\script_m');
|
||||||
|
cd("D:\Work\EnvData\acz");
|
||||||
|
obj1 = py.importlib.import_module('acz');
|
||||||
|
py.importlib.reload(obj1);
|
||||||
|
cd("D:\Work\TailCorr_20241008_NoGit");
|
||||||
|
obj2 = py.importlib.import_module('wave_calculation');
|
||||||
|
py.importlib.reload(obj2);
|
||||||
|
cd("D:\Work\TailCorr");
|
||||||
|
%%产生包络
|
||||||
|
%按点数产生理想方波
|
||||||
|
% amp_rect = 1.5e4;
|
||||||
|
% %单位是ns front是到达时间,flat是持续时间,lagging是后边还有多少个0,会影响脚本的修正时间
|
||||||
|
% [front(1), flat(1), lagging(1)] = deal(50,100,7400);% 50,100,7400;100ns方波
|
||||||
|
% [front(2), flat(2), lagging(2)] = deal(50,4000,11500);% 50,4000,11500;4us方波
|
||||||
|
%
|
||||||
|
% for i = 1:2
|
||||||
|
% front_H(i) = front(i)*fs_H/1e9; flat_H(i) = flat(i)*fs_H/1e9; lagging_H(i) = lagging(i)*fs_H/1e9;
|
||||||
|
% wave_pre{i} = amp_rect*cat(2,zeros(1,front_H(i)),ones(1,flat_H(i)),zeros(1,lagging_H(i)));%脚本的单位是点数
|
||||||
|
% end
|
||||||
|
|
||||||
|
%flattop波
|
||||||
|
A = 1.5e4;
|
||||||
|
[edge(1), length_flattop(1)] = deal(2,30);%ns,在fsn_L取1时是参数里的length
|
||||||
|
[edge(2), length_flattop(2)] = deal(4,30);
|
||||||
|
[edge(3), length_flattop(3)] = deal(4,50);
|
||||||
|
[edge(4), length_flattop(4)] = deal(4,1000);
|
||||||
|
[edge(5), length_flattop(5)] = deal(100,10000);
|
||||||
|
for i = 1:5
|
||||||
|
[edge_H(i), length_H(i)] = deal(edge(i)*fs_H/1e9,length_flattop(i)*fs_H/1e9);
|
||||||
|
wave_pre{i} = flattop(A, edge_H(i), length_H(i), 1);
|
||||||
|
end
|
||||||
|
|
||||||
|
%acz波
|
||||||
|
amplitude = 1.5e4;
|
||||||
|
|
||||||
|
carrierFreq = 0.000000;
|
||||||
|
carrierPhase = 0.000000;
|
||||||
|
dragAlpha = 0.000000;
|
||||||
|
thf = 0.864;
|
||||||
|
thi = 0.05;
|
||||||
|
lam2 = -0.18;
|
||||||
|
lam3 = 0.04;
|
||||||
|
|
||||||
|
length_acz(1) = 30;
|
||||||
|
length_acz(2) = 50;
|
||||||
|
|
||||||
|
for i = 1:2
|
||||||
|
length_acz_H(i) = int32(length_acz(i)*fs_H/1e9);
|
||||||
|
wave_pre{i+5} = real(double(py.acz.aczwave(amplitude, length_acz_H(i), carrierFreq,carrierPhase, dragAlpha,thf, thi, lam2, lam3)));
|
||||||
|
end
|
||||||
|
|
||||||
|
for i = 1:7
|
||||||
|
wave_pre{i} = cat(2,wave_pre{i},zeros(1,floor(simulink_time*fs_H))); %校正前的高频信号
|
||||||
|
wave_preL{i} = wave_pre{i}(1:Ideal2Low:end); %校正前的低频信号
|
||||||
|
end
|
||||||
|
|
||||||
|
%%S21参数
|
||||||
|
amp_real{1} = [0.025 0.015 0.0002 0.2 0 0];
|
||||||
|
amp_imag{1} = [0 0 0 0 0 0];
|
||||||
|
time_real{1} = [-1/250, -1/650, -1/1600 -1/20 0 0];
|
||||||
|
time_imag{1} = [0 -1/300 -1/500 0 0 0];
|
||||||
|
|
||||||
|
amp_real{2} = [0.025 0.015 0.0002 0.2 0 0];
|
||||||
|
amp_imag{2} = [0 0 0 0 0 0];
|
||||||
|
time_real{2} = [-1/250, -1/650, -1/1600 -1/20 0 0];
|
||||||
|
time_imag{2} = [0 -1/300 -1/500 0 0 0];
|
||||||
|
|
||||||
|
amp_real{3} = [0.025 0.009 0.0002 0.2 0 0];
|
||||||
|
amp_imag{3} = [0 0.012 0 0 0 0];
|
||||||
|
time_real{3} = [-1/250, -1/650, -1/1600 -1/20 0 0];
|
||||||
|
time_imag{3} = [0 -1/300 -1/500 0 0 0];
|
||||||
|
|
||||||
|
|
||||||
|
amp_real{4}= [0.025 0.015 0.0002 0.2 0 0];
|
||||||
|
amp_imag{4}= [0 0 0 0 0 0];
|
||||||
|
time_real{4}= [-1/250, -1/2000, -1/1600 -1/20 0 0];
|
||||||
|
time_imag{4}= [0 -1/15 -1/50 0 0 0];
|
||||||
|
|
||||||
|
amp_real{5} = [0.025 0.009 0.0002 0.2 0 0];
|
||||||
|
amp_imag{5} = [0 0.012 0 0 0 0];
|
||||||
|
time_real{5} = [-1/250, -1/2000, -1/1600 -1/20 0 0];
|
||||||
|
time_imag{5} = [0 -1/15 -1/50 0 0 0];
|
||||||
|
|
||||||
|
for i = 1:5
|
||||||
|
amp_routing{i} = amp_real{1,i} + 1j*amp_imag{1,i};
|
||||||
|
time_routing{i} = time_real{1,i} + 1j*time_imag{1,i};
|
||||||
|
tau{i} = -1./time_routing{i};
|
||||||
|
end
|
||||||
|
|
||||||
|
%%python脚本校正结果
|
||||||
|
|
||||||
|
convolve_bound = int8(3);
|
||||||
|
calibration_time = int32(20e3);
|
||||||
|
cal_method = int8(1);
|
||||||
|
sampling_rateL = int64(fs_L/2);
|
||||||
|
sampling_rate = int64(fs_H);
|
||||||
|
|
||||||
|
%校正后的高频信号
|
||||||
|
for j = 1:route_num
|
||||||
|
for i = 1:env_num
|
||||||
|
wave_cal = cell(py.wave_calculation.wave_cal(wave_pre{1,i}, amp_real{1,j}, amp_imag{1,j}, time_real{1,j}, time_imag{1,j}, convolve_bound, calibration_time, cal_method, sampling_rate));
|
||||||
|
wave_revised{j,i} = double(wave_cal{1,1});
|
||||||
|
wave_calL = cell(py.wave_calculation.wave_cal(wave_preL{1,i}, amp_real{1,j}, amp_imag{1,j}, time_real{1,j}, time_imag{1,j}, convolve_bound, calibration_time, cal_method, sampling_rateL));
|
||||||
|
wave_revisedL{j,i} = double(wave_calL{1,1});
|
||||||
|
end
|
||||||
|
alpha{j} = double(wave_calL{1,2});
|
||||||
|
beta{j} = double(wave_calL{1,3});
|
||||||
|
end
|
||||||
|
% signalAnalyzer(wave_pre{1,1},'SampleRate',fs_H);
|
||||||
|
|
||||||
|
%校正后的低频信号
|
||||||
|
|
||||||
|
alpha_wideth=32;
|
||||||
|
beta_width=32;
|
||||||
|
%定点化系数
|
||||||
|
for i = 1:route_num
|
||||||
|
alphaFixRe{i} = ceil((2^(alpha_wideth-1))*real(alpha{i}));
|
||||||
|
alphaFixIm{i} = ceil((2^(alpha_wideth-1))*imag(alpha{i}));
|
||||||
|
betaFixRe{i} = ceil((2^(beta_width-1))*real(beta{i}));
|
||||||
|
betaFixIm{i} = ceil((2^(beta_width-1))*imag(beta{i}));
|
||||||
|
end
|
||||||
|
%% 仿真
|
||||||
|
for j = 1:route_num
|
||||||
|
for i = 1:env_num
|
||||||
|
options=simset('SrcWorkspace','current');
|
||||||
|
sim('z_dsp',[0,simulink_time]);
|
||||||
|
sim2m = @(x)reshape(logsout.get(x).Values.Data,[],1);
|
||||||
|
dout0{j,i} = sim2m("dout0");
|
||||||
|
dout1{j,i} = sim2m("dout1");
|
||||||
|
dout2{j,i} = sim2m("dout2");
|
||||||
|
dout3{j,i} = sim2m("dout3");
|
||||||
|
|
||||||
|
N = length(dout0{j,i});
|
||||||
|
cs_wave{j,i} = zeros(4*N,1);
|
||||||
|
|
||||||
|
cs_wave{j,i}(1:4:4*N) = dout0{j,i};
|
||||||
|
cs_wave{j,i}(2:4:4*N) = dout1{j,i};
|
||||||
|
cs_wave{j,i}(3:4:4*N) = dout2{j,i};
|
||||||
|
cs_wave{j,i}(4:4:4*N) = dout3{j,i};
|
||||||
|
|
||||||
|
HardwareMeanIntpData{j,i} = cs_wave{j,i};%硬件校正后内插
|
||||||
|
DownsamplingBy12GData{j,i} = wave_revised{j,i}(1:Ideal2Target:end);
|
||||||
|
[DownsamplingBy12GDataAlign{j,i},HardwareMeanIntpDataAlign{j,i},Delay(j,i)] = ...
|
||||||
|
alignsignals(DownsamplingBy12GData{j,i}(1:round(TargetFrequency*20e-6)),HardwareMeanIntpData{j,i}(1:round(TargetFrequency*20e-6)),"Method","xcorr");
|
||||||
|
end
|
||||||
|
end
|
||||||
|
% signalAnalyzer(DownsamplingBy12GDataAlign{1},HardwareMeanIntpDataAlign{1},'SampleRate',3e9);
|
||||||
|
%% 绘图并保存
|
||||||
|
close all;
|
||||||
|
|
||||||
|
Amp = 1.5e4;
|
||||||
|
FallingEdge = [
|
||||||
|
% 150e-9,4050e-9,...%矩形波
|
||||||
|
30e-9,30e-9,50e-9,1000e-9,10000e-9,...%flattop
|
||||||
|
30e-9,50e-9%acz
|
||||||
|
];
|
||||||
|
|
||||||
|
name = [
|
||||||
|
"第一组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后10ns",...
|
||||||
|
"第一组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后10ns",...
|
||||||
|
"第一组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后10ns",...
|
||||||
|
"第一组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后10ns",...
|
||||||
|
"第一组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后10ns",...
|
||||||
|
"第一组S21参数_acz_持续时间30ns_下降沿后10ns.fig",...
|
||||||
|
"第一组S21参数_acz_持续时间50ns_下降沿后10ns.fig";
|
||||||
|
"第二组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后10ns",...
|
||||||
|
"第二组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后10ns",...
|
||||||
|
"第二组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后10ns",...
|
||||||
|
"第二组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后10ns",...
|
||||||
|
"第二组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后10ns",...
|
||||||
|
"第二组S21参数_acz_持续时间30ns_下降沿后10ns.fig",...
|
||||||
|
"第二组S21参数_acz_持续时间50ns_下降沿后10ns.fig";
|
||||||
|
"第三组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后10ns",...
|
||||||
|
"第三组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后10ns",...
|
||||||
|
"第三组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后10ns",...
|
||||||
|
"第三组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后10ns",...
|
||||||
|
"第三组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后10ns",...
|
||||||
|
"第三组S21参数_acz_持续时间30ns_下降沿后10ns.fig",...
|
||||||
|
"第三组S21参数_acz_持续时间50ns_下降沿后10ns.fig";
|
||||||
|
"第四组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后10ns",...
|
||||||
|
"第四组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后10ns",...
|
||||||
|
"第四组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后10ns",...
|
||||||
|
"第四组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后10ns",...
|
||||||
|
"第四组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后10ns",...
|
||||||
|
"第四组S21参数_acz_持续时间30ns_下降沿后10ns.fig",...
|
||||||
|
"第四组S21参数_acz_持续时间50ns_下降沿后10ns.fig";
|
||||||
|
"第五组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后10ns",...
|
||||||
|
"第五组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后10ns",...
|
||||||
|
"第五组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后10ns",...
|
||||||
|
"第五组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后10ns",...
|
||||||
|
"第五组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后10ns",...
|
||||||
|
"第五组S21参数_acz_持续时间30ns_下降沿后10ns.fig",...
|
||||||
|
"第五组S21参数_acz_持续时间50ns_下降沿后10ns.fig";
|
||||||
|
"第一组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后1us",...
|
||||||
|
"第一组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后1us",...
|
||||||
|
"第一组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后1us",...
|
||||||
|
"第一组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后1us",...
|
||||||
|
"第一组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后1us",...
|
||||||
|
"第一组S21参数_acz_持续时间30ns_下降沿后1us.fig",...
|
||||||
|
"第一组S21参数_acz_持续时间50ns_下降沿后1us.fig";
|
||||||
|
"第二组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后1us",...
|
||||||
|
"第二组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后1us",...
|
||||||
|
"第二组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后1us",...
|
||||||
|
"第二组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后1us",...
|
||||||
|
"第二组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后1us",...
|
||||||
|
"第二组S21参数_acz_持续时间30ns_下降沿后1us.fig",...
|
||||||
|
"第二组S21参数_acz_持续时间50ns_下降沿后1us.fig";
|
||||||
|
"第三组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后1us",...
|
||||||
|
"第三组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后1us",...
|
||||||
|
"第三组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后1us",...
|
||||||
|
"第三组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后1us",...
|
||||||
|
"第三组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后1us",...
|
||||||
|
"第三组S21参数_acz_持续时间30ns_下降沿后1us.fig",...
|
||||||
|
"第三组S21参数_acz_持续时间50ns_下降沿后1us.fig";
|
||||||
|
"第四组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后1us",...
|
||||||
|
"第四组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后1us",...
|
||||||
|
"第四组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后1us",...
|
||||||
|
"第四组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后1us",...
|
||||||
|
"第四组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后1us",...
|
||||||
|
"第四组S21参数_acz_持续时间30ns_下降沿后1us.fig",...
|
||||||
|
"第四组S21参数_acz_持续时间50ns_下降沿后1us.fig";
|
||||||
|
"第五组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后1us",...
|
||||||
|
"第五组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后1us",...
|
||||||
|
"第五组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后1us",...
|
||||||
|
"第五组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后1us",...
|
||||||
|
"第五组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后1us",...
|
||||||
|
"第五组S21参数_acz_持续时间30ns_下降沿后1us.fig",...
|
||||||
|
"第五组S21参数_acz_持续时间50ns_下降沿后1us.fig";
|
||||||
|
];
|
||||||
|
|
||||||
|
Delay_mode = mode(Delay,'all');
|
||||||
|
fileID = fopen('20241223_output.txt', 'w');
|
||||||
|
if fileID == -1
|
||||||
|
disp('文件打开失败');
|
||||||
|
else
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
for j = 1:route_num
|
||||||
|
for i = 1:env_num
|
||||||
|
start_time(i) = abs(Delay_mode)/(TargetFrequency/1e9)*1e-9;%由于相位修正后会有偏移的点数,所以需要考虑上这个偏移的时间,采样率为3GHz,3个点对应1ns
|
||||||
|
edge_Align(i) = FallingEdge(i) + start_time(i);
|
||||||
|
tmp(i) = edge_Align(i) + 10e-9;
|
||||||
|
a{i} = [start_time(i)-5e-9 tmp(i)];%[1/fs_H 50e-9];[50e-9 1.5e-6],[500e-9+10e-9 tmp-20e-9]
|
||||||
|
b{i} = [tmp(i) 20e-6];
|
||||||
|
fig1 = figure('Units','normalized','Position',[0.000390625,0.517361111111111,0.49921875,0.422916666666667]);
|
||||||
|
diff_plot_py(TargetFrequency,HardwareMeanIntpDataAlign{j,i}', DownsamplingBy12GDataAlign{j,i}(1:floor(TargetFrequency*20e-6)),'HardwareRevised','ScriptRevised',a{i},Amp,edge_Align(i),fileID);
|
||||||
|
title(name(i,1),Interpreter="none");
|
||||||
|
savefig(name(j,i));
|
||||||
|
fig2 = figure('Units','normalized','Position',[0.000390625,0.034027777777778,0.49921875,0.422916666666667]);
|
||||||
|
diff_plot_py(TargetFrequency,HardwareMeanIntpDataAlign{j,i}', DownsamplingBy12GDataAlign{j,i}(1:floor(TargetFrequency*20e-6)),'HardwareRevised','ScriptRevised',b{i},Amp,edge_Align(i),fileID);
|
||||||
|
title(name(i,2),Interpreter="none");
|
||||||
|
savefig(name(j+5,i));
|
||||||
|
end
|
||||||
|
end
|
||||||
|
fclose(fileID);
|
||||||
|
%% 可视化S21参数
|
||||||
|
t = 0:1/(1e2):10000;
|
||||||
|
|
||||||
|
for i = 1:1:length(amp_routing)
|
||||||
|
S21_time(:,i) = amp_routing(i)*exp(time_routing(i)*t);
|
||||||
|
end
|
||||||
|
|
||||||
|
figure
|
||||||
|
plot(t*1e-9,real(sum(S21_time,2)));
|
||||||
|
grid on
|
||||||
|
title("s(t)");
|
||||||
|
% savefig("S21参数");
|
||||||
|
|
||||||
|
% signalAnalyzer(real(sum(S21_time,2)),'SampleRate',1e11);%时间是1ns,还得加上采样率
|
||||||
|
|
||||||
|
% rmpath(genpath('D:\Work\EnvData'));
|
||||||
|
% rmpath(genpath('D:\Work\EnvData\data-v2'));
|
||||||
|
% rmpath(genpath('D:\Work\TailCorr_20241008_NoGit'));
|
||||||
|
%% 图像可视化
|
||||||
|
cd("D:\Work\TailCorr\仿真结果\20241101_125M八倍内插至1G_第1组S21参数")
|
||||||
|
for i = 1:8
|
||||||
|
close all
|
||||||
|
open(name(i,1));
|
||||||
|
open(name(i,2));
|
||||||
|
pause()
|
||||||
|
end
|
|
@ -0,0 +1,19 @@
|
||||||
|
VCS = vcs -full64 -sverilog +lint=TFIPC-L +v2k -debug_access+all -q -timescale=1ns/1ps +nospecify -l compile.log
|
||||||
|
|
||||||
|
SIMV = ./simv -l sim.log
|
||||||
|
|
||||||
|
all:comp run
|
||||||
|
|
||||||
|
comp:
|
||||||
|
${VCS} -f files.f
|
||||||
|
|
||||||
|
run:
|
||||||
|
${SIMV}
|
||||||
|
|
||||||
|
dbg:
|
||||||
|
verdi -f files.f -top TB -nologo &
|
||||||
|
file:
|
||||||
|
find ../ -name "*.*v" > files.f
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf DVE* simv* *log ucli.key verdiLog urgReport csrc novas.* *.fsdb *.dat *.daidir *.vdb *~
|
|
@ -0,0 +1,25 @@
|
||||||
|
|
||||||
|
../rtl/nco/coef_c.v
|
||||||
|
../rtl/nco/pipe_acc_48bit.v
|
||||||
|
../rtl/nco/pipe_add_48bit.v
|
||||||
|
../rtl/nco/p_nco.v
|
||||||
|
../rtl/nco/coef_s.v
|
||||||
|
../rtl/nco/nco.v
|
||||||
|
../rtl/nco/sin_op.v
|
||||||
|
../rtl/nco/ph2amp.v
|
||||||
|
../rtl/nco/cos_op.v
|
||||||
|
|
||||||
|
../rtl/z_dsp/diff.v
|
||||||
|
../rtl/z_dsp_en_Test.v
|
||||||
|
../rtl/z_dsp/TailCorr_top.v
|
||||||
|
../rtl/z_dsp/z_dsp.v
|
||||||
|
../rtl/z_dsp/MeanIntp_8.v
|
||||||
|
../rtl/z_dsp/FixRound.v
|
||||||
|
../rtl/z_dsp/DW_iir_dc_m.v
|
||||||
|
|
||||||
|
../rtl/model/DW02_mult.v
|
||||||
|
../rtl/model/DW_iir_dc.v
|
||||||
|
../tb/clk_gen.v
|
||||||
|
../tb/DW_mult_pipe.v
|
||||||
|
../tb/tb_z_dsp.v
|
||||||
|
|
|
@ -0,0 +1,357 @@
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// This confidential and proprietary software may be used only
|
||||||
|
// as authorized by a licensing agreement from Synopsys Inc.
|
||||||
|
// In the event of publication, the following notice is applicable:
|
||||||
|
//
|
||||||
|
// (C) COPYRIGHT 2002 - 2018 SYNOPSYS INC.
|
||||||
|
// ALL RIGHTS RESERVED
|
||||||
|
//
|
||||||
|
// The entire notice above must be reproduced on all authorized
|
||||||
|
// copies.
|
||||||
|
//
|
||||||
|
// AUTHOR: Rajeev Huralikoppi Feb 15, 2002
|
||||||
|
//
|
||||||
|
// VERSION: Verilog Simulation Architecture
|
||||||
|
//
|
||||||
|
// DesignWare_version: 4e25d03d
|
||||||
|
// DesignWare_release: O-2018.06-DWBB_201806.3
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// ABSTRACT: An n stage pipelined multipler simulation model
|
||||||
|
//
|
||||||
|
// Parameters Valid Values Description
|
||||||
|
// ========== ========= ===========
|
||||||
|
// a_width >= 1 default: none
|
||||||
|
// Word length of a
|
||||||
|
//
|
||||||
|
// b_width >= 1 default: none
|
||||||
|
// Word length of b
|
||||||
|
//
|
||||||
|
// num_stages >= 2 default: 2
|
||||||
|
// Number of pipelined stages
|
||||||
|
//
|
||||||
|
// stall_mode 0 or 1 default: 1
|
||||||
|
// Stall mode
|
||||||
|
// 0 => non-stallable
|
||||||
|
// 1 => stallable
|
||||||
|
//
|
||||||
|
// rst_mode 0 to 2 default: 1
|
||||||
|
// Reset mode
|
||||||
|
// 0 => no reset
|
||||||
|
// 1 => asynchronous reset
|
||||||
|
// 2 => synchronous reset
|
||||||
|
//
|
||||||
|
// op_iso_mode 0 to 4 default: 0
|
||||||
|
// Type of operand isolation
|
||||||
|
// If 'stall_mode' is '0', this parameter is ignored and no isolation is applied
|
||||||
|
// 0 => Follow intent defined by Power Compiler user setting
|
||||||
|
// 1 => no operand isolation
|
||||||
|
// 2 => 'and' gate operand isolaton
|
||||||
|
// 3 => 'or' gate operand isolation
|
||||||
|
// 4 => preferred isolation style: 'and'
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Input Ports Size Description
|
||||||
|
// =========== ==== ============
|
||||||
|
// clk 1 Clock
|
||||||
|
// rst_n 1 Reset, active low
|
||||||
|
// en 1 Register enable, active high
|
||||||
|
// tc 1 2's complement control
|
||||||
|
// a a_width Multiplier
|
||||||
|
// b b_width Multiplicand
|
||||||
|
//
|
||||||
|
// product a_width+b_width Product (a*b)
|
||||||
|
//
|
||||||
|
// MODIFIED:
|
||||||
|
// RJK 05/14/15 Updated model to work with less propagated 'X's
|
||||||
|
// so as to be more friendly with VCS-NLP
|
||||||
|
//
|
||||||
|
// RJK 05/28/13 Updated documentation in comments to properly
|
||||||
|
// describe the "en" input (STAR 9000627580)
|
||||||
|
//
|
||||||
|
// DLL 02/01/08 Enhanced abstract and added "op_iso_mode" parameter
|
||||||
|
// and related code.
|
||||||
|
//
|
||||||
|
// DLL 11/14/05 Changed legality checking of 'num_stages'
|
||||||
|
// parameter along with its abstract "Valid Values"
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
module DW_mult_pipe (clk,rst_n,en,tc,a,b,product);
|
||||||
|
|
||||||
|
parameter integer a_width = 2;
|
||||||
|
parameter integer b_width = 2;
|
||||||
|
parameter integer num_stages = 2;
|
||||||
|
parameter integer stall_mode = 1;
|
||||||
|
parameter integer rst_mode = 1;
|
||||||
|
parameter integer op_iso_mode = 0;
|
||||||
|
|
||||||
|
|
||||||
|
input clk;
|
||||||
|
input rst_n;
|
||||||
|
input [a_width-1 : 0] a;
|
||||||
|
input [b_width-1 : 0] b;
|
||||||
|
input tc;
|
||||||
|
input en;
|
||||||
|
|
||||||
|
output [a_width+b_width-1: 0] product;
|
||||||
|
|
||||||
|
reg [a_width-1 : 0] a_reg [0 : num_stages-2];
|
||||||
|
reg [b_width-1 : 0] b_reg [0 : num_stages-2];
|
||||||
|
reg tc_reg [0 : num_stages-2];
|
||||||
|
|
||||||
|
// synopsys translate_off
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
// Behavioral model
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
generate
|
||||||
|
if (rst_mode == 0) begin : GEN_RSM_EQ_0
|
||||||
|
|
||||||
|
if (stall_mode == 0) begin : GEN_RM0_SM0
|
||||||
|
always @(posedge clk) begin: rm0_sm0_pipe_reg_PROC
|
||||||
|
integer i;
|
||||||
|
|
||||||
|
for(i= 0; i < num_stages-1; i=i+1) begin
|
||||||
|
if (i == 0) begin
|
||||||
|
a_reg[0] <= a;
|
||||||
|
b_reg[0] <= b;
|
||||||
|
tc_reg[0] <= tc;
|
||||||
|
end else begin
|
||||||
|
a_reg[i] <= a_reg[i-1];
|
||||||
|
b_reg[i] <= b_reg[i-1];
|
||||||
|
tc_reg[i] <= tc_reg[i-1];
|
||||||
|
end
|
||||||
|
end // for (i= 0; i < num_stages-1; i++)
|
||||||
|
end // block: rm0_pipe_reg_PROC
|
||||||
|
end else begin : GEN_RM0_SM1
|
||||||
|
always @(posedge clk) begin: rm0_sm1_pipe_reg_PROC
|
||||||
|
integer i;
|
||||||
|
|
||||||
|
for(i= 0; i < num_stages-1; i=i+1) begin
|
||||||
|
if (i == 0) begin
|
||||||
|
a_reg[0] <= (en == 1'b0)? a_reg[0] : ((en == 1'b1)? a : {a_width{1'bx}});
|
||||||
|
b_reg[0] <= (en == 1'b0)? b_reg[0] : ((en == 1'b1)? b : {b_width{1'bx}});
|
||||||
|
tc_reg[0] <= (en == 1'b0)? tc_reg[0]: ((en == 1'b1)? tc: 1'bx);
|
||||||
|
end else begin
|
||||||
|
a_reg[i] <= (en == 1'b0)? a_reg[i] : ((en == 1'b1)? a_reg[i-1] : {a_width{1'bx}});
|
||||||
|
b_reg[i] <= (en == 1'b0)? b_reg[i] : ((en == 1'b1)? b_reg[i-1] : {b_width{1'bx}});
|
||||||
|
tc_reg[i] <= (en == 1'b0)? tc_reg[i]: ((en == 1'b1)? tc_reg[i-1]: 1'bx);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end else if (rst_mode == 1) begin : GEN_RM_EQ_1
|
||||||
|
|
||||||
|
if (stall_mode == 0) begin : GEN_RM1_SM0
|
||||||
|
always @(posedge clk or negedge rst_n) begin: rm1_pipe_reg_PROC
|
||||||
|
integer i;
|
||||||
|
|
||||||
|
if (rst_n == 1'b0) begin
|
||||||
|
for (i= 0; i < num_stages-1; i=i+1) begin
|
||||||
|
a_reg[i] <= {a_width{1'b0}};
|
||||||
|
b_reg[i] <= {b_width{1'b0}};
|
||||||
|
tc_reg[i] <= 1'b0;
|
||||||
|
end // for (i= 0; i < num_stages-1; i++)
|
||||||
|
end else if (rst_n == 1'b1) begin
|
||||||
|
for(i= 0; i < num_stages-1; i=i+1) begin
|
||||||
|
if (i == 0) begin
|
||||||
|
a_reg[0] <= a;
|
||||||
|
b_reg[0] <= b;
|
||||||
|
tc_reg[0] <= tc;
|
||||||
|
end else begin
|
||||||
|
a_reg[i] <= a_reg[i-1];
|
||||||
|
b_reg[i] <= b_reg[i-1];
|
||||||
|
tc_reg[i] <= tc_reg[i-1];
|
||||||
|
end
|
||||||
|
end // for (i= 0; i < num_stages-1; i++)
|
||||||
|
end else begin // rst_n not 1'b0 and not 1'b1
|
||||||
|
for (i= 0; i < num_stages-1; i=i+1) begin
|
||||||
|
a_reg[i] <= {a_width{1'bx}};
|
||||||
|
b_reg[i] <= {b_width{1'bx}};
|
||||||
|
tc_reg[i] <= 1'bx;
|
||||||
|
end // for (i= 0; i < num_stages-1; i++)
|
||||||
|
end
|
||||||
|
end // block: rm1_pipe_reg_PROC
|
||||||
|
end else begin : GEN_RM1_SM1
|
||||||
|
always @(posedge clk or negedge rst_n) begin: rm1_pipe_reg_PROC
|
||||||
|
integer i;
|
||||||
|
|
||||||
|
if (rst_n == 1'b0) begin
|
||||||
|
for (i= 0; i < num_stages-1; i=i+1) begin
|
||||||
|
a_reg[i] <= {a_width{1'b0}};
|
||||||
|
b_reg[i] <= {b_width{1'b0}};
|
||||||
|
tc_reg[i] <= 1'b0;
|
||||||
|
end // for (i= 0; i < num_stages-1; i++)
|
||||||
|
end else if (rst_n == 1'b1) begin
|
||||||
|
for(i= 0; i < num_stages-1; i=i+1) begin
|
||||||
|
if (i == 0) begin
|
||||||
|
a_reg[0] <= (en == 1'b0)? a_reg[0] : ((en == 1'b1)? a : {a_width{1'bx}});
|
||||||
|
b_reg[0] <= (en == 1'b0)? b_reg[0] : ((en == 1'b1)? b : {b_width{1'bx}});
|
||||||
|
tc_reg[0] <= (en == 1'b0)? tc_reg[0]: ((en == 1'b1)? tc: 1'bx);
|
||||||
|
end else begin
|
||||||
|
a_reg[i] <= (en == 1'b0)? a_reg[i] : ((en == 1'b1)? a_reg[i-1] : {a_width{1'bx}});
|
||||||
|
b_reg[i] <= (en == 1'b0)? b_reg[i] : ((en == 1'b1)? b_reg[i-1] : {b_width{1'bx}});
|
||||||
|
tc_reg[i] <= (en == 1'b0)? tc_reg[i]: ((en == 1'b1)? tc_reg[i-1]: 1'bx);
|
||||||
|
end
|
||||||
|
end // for (i= 0; i < num_stages-1; i++)
|
||||||
|
end else begin // rst_n not 1'b0 and not 1'b1
|
||||||
|
for (i= 0; i < num_stages-1; i=i+1) begin
|
||||||
|
a_reg[i] <= {a_width{1'bx}};
|
||||||
|
b_reg[i] <= {b_width{1'bx}};
|
||||||
|
tc_reg[i] <= 1'bx;
|
||||||
|
end // for (i= 0; i < num_stages-1; i++)
|
||||||
|
end
|
||||||
|
end // block: rm1_pipe_reg_PROC
|
||||||
|
end
|
||||||
|
|
||||||
|
end else begin : GEN_RM_GT_1
|
||||||
|
|
||||||
|
if (stall_mode == 0) begin : GEN_RM2_SM0
|
||||||
|
always @(posedge clk) begin: rm2_pipe_reg_PROC
|
||||||
|
integer i;
|
||||||
|
|
||||||
|
if (rst_n == 1'b0) begin
|
||||||
|
for (i= 0; i < num_stages-1; i=i+1) begin
|
||||||
|
a_reg[i] <= {a_width{1'b0}};
|
||||||
|
b_reg[i] <= {b_width{1'b0}};
|
||||||
|
tc_reg[i] <= 1'b0;
|
||||||
|
end // for (i= 0; i < num_stages-1; i++)
|
||||||
|
end else if (rst_n == 1'b1) begin
|
||||||
|
for(i= 0; i < num_stages-1; i=i+1) begin
|
||||||
|
if (i == 0) begin
|
||||||
|
a_reg[0] <= a;
|
||||||
|
b_reg[0] <= b;
|
||||||
|
tc_reg[0] <= tc;
|
||||||
|
end else begin
|
||||||
|
a_reg[i] <= a_reg[i-1];
|
||||||
|
b_reg[i] <= b_reg[i-1];
|
||||||
|
tc_reg[i] <= tc_reg[i-1];
|
||||||
|
end
|
||||||
|
end // for (i= 0; i < num_stages-1; i++)
|
||||||
|
end else begin // rst_n not 1'b0 and not 1'b1
|
||||||
|
for (i= 0; i < num_stages-1; i=i+1) begin
|
||||||
|
a_reg[i] <= {a_width{1'bx}};
|
||||||
|
b_reg[i] <= {b_width{1'bx}};
|
||||||
|
tc_reg[i] <= 1'bx;
|
||||||
|
end // for (i= 0; i < num_stages-1; i++)
|
||||||
|
end
|
||||||
|
end // block: rm2_pipe_reg_PROC
|
||||||
|
end else begin : GEN_RM2_SM1
|
||||||
|
always @(posedge clk) begin: rm2_pipe_reg_PROC
|
||||||
|
integer i;
|
||||||
|
|
||||||
|
if (rst_n == 1'b0) begin
|
||||||
|
for (i= 0; i < num_stages-1; i=i+1) begin
|
||||||
|
a_reg[i] <= {a_width{1'b0}};
|
||||||
|
b_reg[i] <= {b_width{1'b0}};
|
||||||
|
tc_reg[i] <= 1'b0;
|
||||||
|
end // for (i= 0; i < num_stages-1; i++)
|
||||||
|
end else if (rst_n == 1'b1) begin
|
||||||
|
for(i= 0; i < num_stages-1; i=i+1) begin
|
||||||
|
if (i == 0) begin
|
||||||
|
a_reg[0] <= (en == 1'b0)? a_reg[0] : ((en == 1'b1)? a : {a_width{1'bx}});
|
||||||
|
b_reg[0] <= (en == 1'b0)? b_reg[0] : ((en == 1'b1)? b : {b_width{1'bx}});
|
||||||
|
tc_reg[0] <= (en == 1'b0)? tc_reg[0]: ((en == 1'b1)? tc: 1'bx);
|
||||||
|
end else begin
|
||||||
|
a_reg[i] <= (en == 1'b0)? a_reg[i] : ((en == 1'b1)? a_reg[i-1] : {a_width{1'bx}});
|
||||||
|
b_reg[i] <= (en == 1'b0)? b_reg[i] : ((en == 1'b1)? b_reg[i-1] : {b_width{1'bx}});
|
||||||
|
tc_reg[i] <= (en == 1'b0)? tc_reg[i]: ((en == 1'b1)? tc_reg[i-1]: 1'bx);
|
||||||
|
end
|
||||||
|
end // for (i= 0; i < num_stages-1; i++)
|
||||||
|
end else begin // rst_n not 1'b0 and not 1'b1
|
||||||
|
for (i= 0; i < num_stages-1; i=i+1) begin
|
||||||
|
a_reg[i] <= {a_width{1'bx}};
|
||||||
|
b_reg[i] <= {b_width{1'bx}};
|
||||||
|
tc_reg[i] <= 1'bx;
|
||||||
|
end // for (i= 0; i < num_stages-1; i++)
|
||||||
|
end
|
||||||
|
end // block: rm2_pipe_reg_PROC
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
endgenerate
|
||||||
|
|
||||||
|
DW02_mult #(a_width, b_width)
|
||||||
|
U1 (.A(a_reg[num_stages-2]),
|
||||||
|
.B(b_reg[num_stages-2]),
|
||||||
|
.TC(tc_reg[num_stages-2]),
|
||||||
|
.PRODUCT(product));
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
// Parameter legality check and initializations
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
initial begin : parameter_check
|
||||||
|
integer param_err_flg;
|
||||||
|
|
||||||
|
param_err_flg = 0;
|
||||||
|
|
||||||
|
|
||||||
|
if (a_width < 1) begin
|
||||||
|
param_err_flg = 1;
|
||||||
|
$display(
|
||||||
|
"ERROR: %m :\n Invalid value (%d) for parameter a_width (lower bound: 1)",
|
||||||
|
a_width );
|
||||||
|
end
|
||||||
|
|
||||||
|
if (b_width < 1) begin
|
||||||
|
param_err_flg = 1;
|
||||||
|
$display(
|
||||||
|
"ERROR: %m :\n Invalid value (%d) for parameter b_width (lower bound: 1)",
|
||||||
|
b_width );
|
||||||
|
end
|
||||||
|
|
||||||
|
if (num_stages < 2) begin
|
||||||
|
param_err_flg = 1;
|
||||||
|
$display(
|
||||||
|
"ERROR: %m :\n Invalid value (%d) for parameter num_stages (lower bound: 2)",
|
||||||
|
num_stages );
|
||||||
|
end
|
||||||
|
|
||||||
|
if ( (stall_mode < 0) || (stall_mode > 1) ) begin
|
||||||
|
param_err_flg = 1;
|
||||||
|
$display(
|
||||||
|
"ERROR: %m :\n Invalid value (%d) for parameter stall_mode (legal range: 0 to 1)",
|
||||||
|
stall_mode );
|
||||||
|
end
|
||||||
|
|
||||||
|
if ( (rst_mode < 0) || (rst_mode > 2) ) begin
|
||||||
|
param_err_flg = 1;
|
||||||
|
$display(
|
||||||
|
"ERROR: %m :\n Invalid value (%d) for parameter rst_mode (legal range: 0 to 2)",
|
||||||
|
rst_mode );
|
||||||
|
end
|
||||||
|
|
||||||
|
if ( (op_iso_mode < 0) || (op_iso_mode > 4) ) begin
|
||||||
|
param_err_flg = 1;
|
||||||
|
$display(
|
||||||
|
"ERROR: %m :\n Invalid value (%d) for parameter op_iso_mode (legal range: 0 to 4)",
|
||||||
|
op_iso_mode );
|
||||||
|
end
|
||||||
|
|
||||||
|
if ( param_err_flg == 1) begin
|
||||||
|
$display(
|
||||||
|
"%m :\n Simulation aborted due to invalid parameter value(s)");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
|
||||||
|
end // parameter_check
|
||||||
|
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
// Report unknown clock inputs
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
always @ (clk) begin : clk_monitor
|
||||||
|
if ( (clk !== 1'b0) && (clk !== 1'b1) && ($time > 0) )
|
||||||
|
$display( "WARNING: %m :\n at time = %t, detected unknown value, %b, on clk input.",
|
||||||
|
$time, clk );
|
||||||
|
end // clk_monitor
|
||||||
|
|
||||||
|
// synopsys translate_on
|
||||||
|
endmodule //
|
|
@ -0,0 +1,141 @@
|
||||||
|
module clk_gen(
|
||||||
|
input rstn,
|
||||||
|
input clk,
|
||||||
|
output clk_div16_0,
|
||||||
|
output clk_div16_1,
|
||||||
|
output clk_div16_2,
|
||||||
|
output clk_div16_3,
|
||||||
|
output clk_div16_4,
|
||||||
|
output clk_div16_5,
|
||||||
|
output clk_div16_6,
|
||||||
|
output clk_div16_7,
|
||||||
|
output clk_div16_8,
|
||||||
|
output clk_div16_9,
|
||||||
|
output clk_div16_a,
|
||||||
|
output clk_div16_b,
|
||||||
|
output clk_div16_c,
|
||||||
|
output clk_div16_d,
|
||||||
|
output clk_div16_e,
|
||||||
|
output clk_div16_f,
|
||||||
|
|
||||||
|
output clk_h,
|
||||||
|
output clk_l
|
||||||
|
);
|
||||||
|
|
||||||
|
reg [3:0] cnt_ini;
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
cnt_ini <= 4'd0;
|
||||||
|
else if(cnt_ini <= 4'd7)
|
||||||
|
cnt_ini <= cnt_ini + 4'd1;
|
||||||
|
else
|
||||||
|
cnt_ini <= cnt_ini;
|
||||||
|
wire div_en;
|
||||||
|
assign div_en = (cnt_ini ==4'd8)? 1'b1:1'b0;
|
||||||
|
|
||||||
|
reg [3:0] cnt_0;
|
||||||
|
reg [3:0] cnt_1;
|
||||||
|
reg [3:0] cnt_2;
|
||||||
|
reg [3:0] cnt_3;
|
||||||
|
reg [3:0] cnt_4;
|
||||||
|
reg [3:0] cnt_5;
|
||||||
|
reg [3:0] cnt_6;
|
||||||
|
reg [3:0] cnt_7;
|
||||||
|
reg [3:0] cnt_8;
|
||||||
|
reg [3:0] cnt_9;
|
||||||
|
reg [3:0] cnt_a;
|
||||||
|
reg [3:0] cnt_b;
|
||||||
|
reg [3:0] cnt_c;
|
||||||
|
reg [3:0] cnt_d;
|
||||||
|
reg [3:0] cnt_e;
|
||||||
|
reg [3:0] cnt_f;
|
||||||
|
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if(!rstn) begin
|
||||||
|
cnt_0 <= 4'h0;
|
||||||
|
cnt_1 <= 4'h1;
|
||||||
|
cnt_2 <= 4'h2;
|
||||||
|
cnt_3 <= 4'h3;
|
||||||
|
cnt_4 <= 4'h4;
|
||||||
|
cnt_5 <= 4'h5;
|
||||||
|
cnt_6 <= 4'h6;
|
||||||
|
cnt_7 <= 4'h7;
|
||||||
|
cnt_8 <= 4'h8;
|
||||||
|
cnt_9 <= 4'h9;
|
||||||
|
cnt_a <= 4'ha;
|
||||||
|
cnt_b <= 4'hb;
|
||||||
|
cnt_c <= 4'hc;
|
||||||
|
cnt_d <= 4'hd;
|
||||||
|
cnt_e <= 4'he;
|
||||||
|
cnt_f <= 4'hf;
|
||||||
|
end
|
||||||
|
else if(div_en) begin
|
||||||
|
cnt_0 <= cnt_0 + 4'd1;
|
||||||
|
cnt_1 <= cnt_1 + 4'd1;
|
||||||
|
cnt_2 <= cnt_2 + 4'd1;
|
||||||
|
cnt_3 <= cnt_3 + 4'd1;
|
||||||
|
cnt_4 <= cnt_4 + 4'd1;
|
||||||
|
cnt_5 <= cnt_5 + 4'd1;
|
||||||
|
cnt_6 <= cnt_6 + 4'd1;
|
||||||
|
cnt_7 <= cnt_7 + 4'd1;
|
||||||
|
cnt_8 <= cnt_8 + 4'd1;
|
||||||
|
cnt_9 <= cnt_9 + 4'd1;
|
||||||
|
cnt_a <= cnt_a + 4'd1;
|
||||||
|
cnt_b <= cnt_b + 4'd1;
|
||||||
|
cnt_c <= cnt_c + 4'd1;
|
||||||
|
cnt_d <= cnt_d + 4'd1;
|
||||||
|
cnt_e <= cnt_e + 4'd1;
|
||||||
|
cnt_f <= cnt_f + 4'd1;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
cnt_0 <= cnt_0;
|
||||||
|
cnt_1 <= cnt_1;
|
||||||
|
cnt_2 <= cnt_2;
|
||||||
|
cnt_3 <= cnt_3;
|
||||||
|
cnt_4 <= cnt_4;
|
||||||
|
cnt_5 <= cnt_5;
|
||||||
|
cnt_6 <= cnt_6;
|
||||||
|
cnt_7 <= cnt_7;
|
||||||
|
cnt_8 <= cnt_8;
|
||||||
|
cnt_9 <= cnt_9;
|
||||||
|
cnt_a <= cnt_a;
|
||||||
|
cnt_b <= cnt_b;
|
||||||
|
cnt_c <= cnt_c;
|
||||||
|
cnt_d <= cnt_d;
|
||||||
|
cnt_e <= cnt_e;
|
||||||
|
cnt_f <= cnt_f;
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
assign clk_div16_0 = cnt_0[3];
|
||||||
|
assign clk_div16_1 = cnt_1[3];
|
||||||
|
assign clk_div16_2 = cnt_2[3];
|
||||||
|
assign clk_div16_3 = cnt_3[3];
|
||||||
|
assign clk_div16_4 = cnt_4[3];
|
||||||
|
assign clk_div16_5 = cnt_5[3];
|
||||||
|
assign clk_div16_6 = cnt_6[3];
|
||||||
|
assign clk_div16_7 = cnt_7[3];
|
||||||
|
assign clk_div16_8 = cnt_8[3];
|
||||||
|
assign clk_div16_9 = cnt_9[3];
|
||||||
|
assign clk_div16_a = cnt_a[3];
|
||||||
|
assign clk_div16_b = cnt_b[3];
|
||||||
|
assign clk_div16_c = cnt_c[3];
|
||||||
|
assign clk_div16_d = cnt_d[3];
|
||||||
|
assign clk_div16_e = cnt_e[3];
|
||||||
|
assign clk_div16_f = cnt_f[3];
|
||||||
|
|
||||||
|
|
||||||
|
reg [3:0] cnt_div16;
|
||||||
|
always@(posedge clk_div16_0 or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
cnt_div16 <= 4'd0;
|
||||||
|
else if(div_en)
|
||||||
|
cnt_div16 <= cnt_div16 + 4'd1;
|
||||||
|
else
|
||||||
|
cnt_div16 <= cnt_div16;
|
||||||
|
|
||||||
|
|
||||||
|
assign clk_h = clk_div16_0;
|
||||||
|
assign clk_l = cnt_div16[0];
|
||||||
|
|
||||||
|
endmodule
|
|
@ -0,0 +1,168 @@
|
||||||
|
module TB();
|
||||||
|
|
||||||
|
parameter data_in_width = 16;
|
||||||
|
parameter max_coef_width = 32;
|
||||||
|
parameter frac_data_out_width = 20;//X for in,5
|
||||||
|
parameter frac_coef_width = 31;//division
|
||||||
|
parameter feedback_width = 36;
|
||||||
|
parameter data_out_width = 36;
|
||||||
|
parameter saturation_mode = 0;
|
||||||
|
parameter out_reg = 1;
|
||||||
|
|
||||||
|
initial
|
||||||
|
begin
|
||||||
|
$fsdbDumpfile("TB.fsdb");
|
||||||
|
$fsdbDumpvars(0, TB);
|
||||||
|
end
|
||||||
|
|
||||||
|
reg clk;
|
||||||
|
reg rstn;
|
||||||
|
reg [15:0] din_im;
|
||||||
|
|
||||||
|
reg [36:0] a;
|
||||||
|
reg [36:0] b;
|
||||||
|
reg [20:0] c;
|
||||||
|
reg [20:0] d;
|
||||||
|
|
||||||
|
reg [47:0] fcw;
|
||||||
|
|
||||||
|
reg [21:0] cnt;
|
||||||
|
reg [15:0] din_imp;
|
||||||
|
reg [15:0] din_rect;
|
||||||
|
reg [15:0] din_cos;
|
||||||
|
reg [15:0] diff_in;
|
||||||
|
reg en;
|
||||||
|
|
||||||
|
wire [1 :0] source_mode;
|
||||||
|
wire [15 :0] iir_in;
|
||||||
|
wire [15:0] cos;
|
||||||
|
wire [15:0] sin;
|
||||||
|
wire [35:0] dout_p0;
|
||||||
|
|
||||||
|
initial
|
||||||
|
begin
|
||||||
|
#0;
|
||||||
|
rstn = 1'b0;
|
||||||
|
clk = 1'b0;
|
||||||
|
|
||||||
|
din_im = 16'd0;
|
||||||
|
|
||||||
|
a = 37'd1757225200;
|
||||||
|
b = 37'd0;
|
||||||
|
c = -21'd1042856;
|
||||||
|
d = 21'd0;
|
||||||
|
|
||||||
|
fcw = 48'h0840_0000_0000;
|
||||||
|
|
||||||
|
din_imp = 16'd0;
|
||||||
|
din_rect = 16'd0;
|
||||||
|
din_cos = 16'd0;
|
||||||
|
|
||||||
|
#3600;
|
||||||
|
en = 1'b1;
|
||||||
|
#3800;
|
||||||
|
rstn = 1'b1;
|
||||||
|
din_imp = 16'd32767;
|
||||||
|
din_rect = 8'd1;
|
||||||
|
#400;
|
||||||
|
din_imp = 16'd0;
|
||||||
|
#12000;
|
||||||
|
din_rect = 16'd0;
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
always #200 clk = ~clk;
|
||||||
|
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
cnt <= 22'd0;
|
||||||
|
else
|
||||||
|
cnt <= cnt + 22'd1;
|
||||||
|
|
||||||
|
initial
|
||||||
|
begin
|
||||||
|
wait(cnt[16]==1'b1)
|
||||||
|
$finish(0);
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
begin
|
||||||
|
din_cos <= 16'd0;
|
||||||
|
diff_in <= 16'd0;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
din_cos <= cos;
|
||||||
|
|
||||||
|
assign source_mode = 2'b00;
|
||||||
|
|
||||||
|
always @(*)
|
||||||
|
|
||||||
|
case(source_mode)
|
||||||
|
2'b00 : diff_in = din_imp;
|
||||||
|
2'b01 : diff_in = din_rect;
|
||||||
|
2'b10 : diff_in = din_cos;
|
||||||
|
endcase
|
||||||
|
|
||||||
|
|
||||||
|
NCO inst_nco_0(
|
||||||
|
.clk (clk ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.phase_manual_clr (1'b0 ),
|
||||||
|
.phase_auto_clr (1'b0 ),
|
||||||
|
.fcw (fcw ),
|
||||||
|
.pha (16'd0 ),
|
||||||
|
.cos (cos ),
|
||||||
|
.sin (sin )
|
||||||
|
);
|
||||||
|
|
||||||
|
DW_iir_dc
|
||||||
|
#(
|
||||||
|
.data_in_width (data_in_width ),
|
||||||
|
.data_out_width (data_out_width ),
|
||||||
|
.frac_data_out_width (frac_data_out_width),
|
||||||
|
.feedback_width (feedback_width ),
|
||||||
|
.max_coef_width (max_coef_width ),
|
||||||
|
.frac_coef_width (frac_coef_width ),
|
||||||
|
.saturation_mode (saturation_mode ),
|
||||||
|
.out_reg (out_reg )
|
||||||
|
)
|
||||||
|
inst_iir_0
|
||||||
|
(
|
||||||
|
.clk (clk ),
|
||||||
|
.rst_n (rstn ),
|
||||||
|
.init_n (rstn ),
|
||||||
|
.enable (en ),
|
||||||
|
.A1_coef (32'd2143083069 ),//Den
|
||||||
|
.A2_coef ('h0 ),
|
||||||
|
.B0_coef (32'd55007236 ),//Num
|
||||||
|
.B1_coef ('h0 ),
|
||||||
|
.B2_coef ('h0 ),
|
||||||
|
.data_in (diff_in ),
|
||||||
|
.data_out (dout_p0 ),
|
||||||
|
.saturation ( )
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
integer signed In_fid;
|
||||||
|
integer signed Out_fid;
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
#0;
|
||||||
|
In_fid = $fopen("./in");
|
||||||
|
Out_fid = $fopen("./out");
|
||||||
|
end
|
||||||
|
|
||||||
|
always@(posedge clk)
|
||||||
|
|
||||||
|
$fwrite(In_fid,"%d\n",{{~{diff_in[15]}},diff_in[14:0]});
|
||||||
|
|
||||||
|
always@(posedge clk)
|
||||||
|
|
||||||
|
$fwrite(Out_fid,"%d\n",{{~{dout_p0[35]}},dout_p0[34:0]});
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
module TB();
|
||||||
|
|
||||||
|
initial
|
||||||
|
begin
|
||||||
|
$fsdbDumpfile("TB.fsdb");
|
||||||
|
$fsdbDumpvars(0, TB);
|
||||||
|
end
|
||||||
|
|
||||||
|
reg clk;
|
||||||
|
reg rstn;
|
||||||
|
reg [15:0] din_in;
|
||||||
|
reg [21:0] cnt;
|
||||||
|
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
|
||||||
|
#0;
|
||||||
|
rstn = 1'b0;
|
||||||
|
clk = 1'b0;
|
||||||
|
din_in = 1'b0;
|
||||||
|
|
||||||
|
#3400;
|
||||||
|
rstn = 1'b1;
|
||||||
|
din_in = 1'b1;
|
||||||
|
|
||||||
|
#6400;
|
||||||
|
rstn = 1'b1;
|
||||||
|
din_in = 1'b0;
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
always #200 clk = ~clk;
|
||||||
|
|
||||||
|
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
cnt <= 22'd0;
|
||||||
|
else
|
||||||
|
cnt <= cnt + 22'd1;
|
||||||
|
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
wait(cnt[16]==1'b1)
|
||||||
|
$finish(0);
|
||||||
|
end
|
||||||
|
|
||||||
|
reg [47:0] fcw;
|
||||||
|
|
||||||
|
|
||||||
|
diff inst_diff
|
||||||
|
(
|
||||||
|
.clk (clk ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.din (din_in ),
|
||||||
|
.dout (dout_p0 )
|
||||||
|
);
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,154 @@
|
||||||
|
module TB();
|
||||||
|
|
||||||
|
initial
|
||||||
|
begin
|
||||||
|
$fsdbDumpfile("TB.fsdb");
|
||||||
|
$fsdbDumpvars(0, TB);
|
||||||
|
end
|
||||||
|
|
||||||
|
reg clk;
|
||||||
|
reg rstn;
|
||||||
|
reg [15:0] din_im;
|
||||||
|
|
||||||
|
reg [36:0] a;
|
||||||
|
reg [36:0] b;
|
||||||
|
reg [20:0] c;
|
||||||
|
reg [20:0] d;
|
||||||
|
|
||||||
|
reg [47:0] fcw;
|
||||||
|
|
||||||
|
reg [21:0] cnt;
|
||||||
|
reg [15:0] din_imp;
|
||||||
|
reg [15:0] din_rect;
|
||||||
|
reg [15:0] din_cos;
|
||||||
|
reg [15:0] diff_in;
|
||||||
|
reg en;
|
||||||
|
|
||||||
|
wire [1 :0] source_mode;
|
||||||
|
wire [15 :0] iir_in;
|
||||||
|
wire [15:0] cos;
|
||||||
|
wire [15:0] sin;
|
||||||
|
wire [15:0] dout_p0;
|
||||||
|
|
||||||
|
initial
|
||||||
|
begin
|
||||||
|
#0;
|
||||||
|
rstn = 1'b0;
|
||||||
|
clk = 1'b0;
|
||||||
|
|
||||||
|
din_im = 16'd0;
|
||||||
|
|
||||||
|
a = 37'd1757225200;
|
||||||
|
b = 37'd0;
|
||||||
|
c = -21'd1042856;
|
||||||
|
d = 21'd0;
|
||||||
|
|
||||||
|
fcw = 48'h0840_0000_0000;
|
||||||
|
|
||||||
|
din_imp = 16'd0;
|
||||||
|
din_rect = 16'd0;
|
||||||
|
din_cos = 16'd0;
|
||||||
|
|
||||||
|
#3600;
|
||||||
|
en = 1'b1;
|
||||||
|
#3800;
|
||||||
|
rstn = 1'b1;
|
||||||
|
din_imp = 16'd32767;
|
||||||
|
din_rect = 16'd30000;
|
||||||
|
#400;
|
||||||
|
din_imp = 16'd0;
|
||||||
|
#12000;
|
||||||
|
din_rect = 16'd0;
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
always #200 clk = ~clk;
|
||||||
|
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
cnt <= 22'd0;
|
||||||
|
else
|
||||||
|
cnt <= cnt + 22'd1;
|
||||||
|
|
||||||
|
initial
|
||||||
|
begin
|
||||||
|
wait(cnt[16]==1'b1)
|
||||||
|
$finish(0);
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
begin
|
||||||
|
din_cos <= 16'd0;
|
||||||
|
diff_in <= 16'd0;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
din_cos <= cos;
|
||||||
|
|
||||||
|
assign source_mode = 2'b01;
|
||||||
|
|
||||||
|
always @(*)
|
||||||
|
|
||||||
|
case(source_mode)
|
||||||
|
2'b00 : diff_in = din_imp;
|
||||||
|
2'b01 : diff_in = din_rect;
|
||||||
|
2'b10 : diff_in = din_cos;
|
||||||
|
endcase
|
||||||
|
|
||||||
|
|
||||||
|
NCO inst_nco_0(
|
||||||
|
.clk (clk ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.phase_manual_clr (1'b0 ),
|
||||||
|
.phase_auto_clr (1'b0 ),
|
||||||
|
.fcw (fcw ),
|
||||||
|
.pha (16'd0 ),
|
||||||
|
.cos (cos ),
|
||||||
|
.sin (sin )
|
||||||
|
);
|
||||||
|
|
||||||
|
diff inst_diff
|
||||||
|
(
|
||||||
|
.clk (clk ),
|
||||||
|
.en (en ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.din (diff_in ),
|
||||||
|
.dout (iir_in )
|
||||||
|
);
|
||||||
|
|
||||||
|
IIR_Filter inst1_IIR_Filter
|
||||||
|
(
|
||||||
|
.clk (clk ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.en (en ),
|
||||||
|
.din_re (iir_in ),
|
||||||
|
.din_im (din_im ),
|
||||||
|
.a_re (a ),
|
||||||
|
.a_im (b ),
|
||||||
|
.b_re (c ),
|
||||||
|
.b_im (d ),
|
||||||
|
.dout (dout_p0 )
|
||||||
|
);
|
||||||
|
|
||||||
|
integer signed In_fid;
|
||||||
|
integer signed Out_fid;
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
#0;
|
||||||
|
In_fid = $fopen("./in");
|
||||||
|
Out_fid = $fopen("./out");
|
||||||
|
end
|
||||||
|
|
||||||
|
always@(posedge clk)
|
||||||
|
|
||||||
|
$fwrite(In_fid,"%d\n",{{~{iir_in[15]}},iir_in[14:0]});
|
||||||
|
|
||||||
|
always@(posedge clk)
|
||||||
|
|
||||||
|
$fwrite(Out_fid,"%d\n",{{~{dout_p0[15]}},dout_p0[14:0]});
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,98 @@
|
||||||
|
module TB();
|
||||||
|
|
||||||
|
initial
|
||||||
|
begin
|
||||||
|
$fsdbDumpfile("TB.fsdb");
|
||||||
|
$fsdbDumpvars(0, TB);
|
||||||
|
end
|
||||||
|
|
||||||
|
reg clk;
|
||||||
|
reg rstn;
|
||||||
|
reg en;
|
||||||
|
reg [15:0] din_in;
|
||||||
|
reg [21:0] cnt;
|
||||||
|
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
|
||||||
|
#0;
|
||||||
|
rstn = 1'b0;
|
||||||
|
clk = 1'b0;
|
||||||
|
din_in = 1'b0;
|
||||||
|
en = 1'b0;
|
||||||
|
#300;
|
||||||
|
rstn = 1'b1;
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
always #200 clk = ~clk;
|
||||||
|
|
||||||
|
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
cnt <= 22'd0;
|
||||||
|
else
|
||||||
|
cnt <= cnt + 22'd1;
|
||||||
|
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
wait(cnt[17]==1'b1)
|
||||||
|
$finish(0);
|
||||||
|
end
|
||||||
|
always@(posedge clk or negedge rstn)
|
||||||
|
begin
|
||||||
|
if(cnt >= 2047 )
|
||||||
|
begin
|
||||||
|
en <= 1'b1;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
en <= 1'b0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
reg [47:0] fcw;
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
fcw = 48'h0840_0000_0000;
|
||||||
|
end
|
||||||
|
|
||||||
|
wire [15:0] cos;
|
||||||
|
wire [15:0] sin;
|
||||||
|
|
||||||
|
|
||||||
|
NCO inst_nco_0(
|
||||||
|
.clk (clk ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.phase_manual_clr (1'b0 ),
|
||||||
|
.phase_auto_clr (1'b0 ),
|
||||||
|
.fcw (fcw ),
|
||||||
|
.pha (16'd0 ),
|
||||||
|
.cos (cos ),
|
||||||
|
.sin (sin )
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
wire [15:0] dout_p0;
|
||||||
|
wire [15:0] dout_p1;
|
||||||
|
|
||||||
|
MeanIntp2 inst_MeanIntp2
|
||||||
|
(
|
||||||
|
.clk (clk ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.en (en ),
|
||||||
|
.din (cos & {16{en}} ),
|
||||||
|
.dout_m (dout_p0 ),
|
||||||
|
.dout_o (dout_p1 )
|
||||||
|
);
|
||||||
|
|
||||||
|
reg [15:0] cs_wave;
|
||||||
|
|
||||||
|
always@(posedge clk) cs_wave = dout_p1;
|
||||||
|
always@(negedge clk) cs_wave = dout_p0;
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,142 @@
|
||||||
|
module TB();
|
||||||
|
|
||||||
|
initial
|
||||||
|
begin
|
||||||
|
$fsdbDumpfile("TB.fsdb");
|
||||||
|
$fsdbDumpvars(0, TB);
|
||||||
|
end
|
||||||
|
|
||||||
|
reg clk;
|
||||||
|
reg rstn;
|
||||||
|
reg en;
|
||||||
|
reg [21:0] cnt;
|
||||||
|
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
|
||||||
|
#0;
|
||||||
|
rstn = 1'b0;
|
||||||
|
clk = 1'b0;
|
||||||
|
en = 1'b0;
|
||||||
|
#300;
|
||||||
|
rstn = 1'b1;
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
always #200 clk = ~clk;
|
||||||
|
|
||||||
|
wire clk_div16_0;
|
||||||
|
wire clk_div16_1;
|
||||||
|
wire clk_div16_2;
|
||||||
|
wire clk_div16_3;
|
||||||
|
wire clk_div16_4;
|
||||||
|
wire clk_div16_5;
|
||||||
|
wire clk_div16_6;
|
||||||
|
wire clk_div16_7;
|
||||||
|
wire clk_div16_8;
|
||||||
|
wire clk_div16_9;
|
||||||
|
wire clk_div16_a;
|
||||||
|
wire clk_div16_b;
|
||||||
|
wire clk_div16_c;
|
||||||
|
wire clk_div16_d;
|
||||||
|
wire clk_div16_e;
|
||||||
|
wire clk_div16_f;
|
||||||
|
|
||||||
|
|
||||||
|
clk_gen inst_clk_gen(
|
||||||
|
.rstn (rstn ),
|
||||||
|
.clk (clk ),
|
||||||
|
.clk_div16_0 (clk_div16_0 ),
|
||||||
|
.clk_div16_1 (clk_div16_1 ),
|
||||||
|
.clk_div16_2 (clk_div16_2 ),
|
||||||
|
.clk_div16_3 (clk_div16_3 ),
|
||||||
|
.clk_div16_4 (clk_div16_4 ),
|
||||||
|
.clk_div16_5 (clk_div16_5 ),
|
||||||
|
.clk_div16_6 (clk_div16_6 ),
|
||||||
|
.clk_div16_7 (clk_div16_7 ),
|
||||||
|
.clk_div16_8 (clk_div16_8 ),
|
||||||
|
.clk_div16_9 (clk_div16_9 ),
|
||||||
|
.clk_div16_a (clk_div16_a ),
|
||||||
|
.clk_div16_b (clk_div16_b ),
|
||||||
|
.clk_div16_c (clk_div16_c ),
|
||||||
|
.clk_div16_d (clk_div16_d ),
|
||||||
|
.clk_div16_e (clk_div16_e ),
|
||||||
|
.clk_div16_f (clk_div16_f ),
|
||||||
|
.clk_h (clk_h ),
|
||||||
|
.clk_l (clk_l )
|
||||||
|
);
|
||||||
|
|
||||||
|
always@(posedge clk_div16_f or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
cnt <= 22'd0;
|
||||||
|
else
|
||||||
|
cnt <= cnt + 22'd1;
|
||||||
|
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
wait(cnt[17]==1'b1)
|
||||||
|
$finish(0);
|
||||||
|
end
|
||||||
|
always@(posedge clk_div16_f or negedge rstn)
|
||||||
|
begin
|
||||||
|
if(cnt >= 2047 )
|
||||||
|
begin
|
||||||
|
en <= 1'b1;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
en <= 1'b0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
reg [47:0] fcw;
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
fcw = 48'h0840_0000_0000;
|
||||||
|
end
|
||||||
|
|
||||||
|
wire [15:0] cos;
|
||||||
|
wire [15:0] sin;
|
||||||
|
|
||||||
|
|
||||||
|
NCO inst_nco_0(
|
||||||
|
.clk (clk_div16_f ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.phase_manual_clr (1'b0 ),
|
||||||
|
.phase_auto_clr (1'b0 ),
|
||||||
|
.fcw (fcw ),
|
||||||
|
.pha (16'd0 ),
|
||||||
|
.cos (cos ),
|
||||||
|
.sin (sin )
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
wire [15:0] dout_p0;
|
||||||
|
wire [15:0] dout_p1;
|
||||||
|
wire [15:0] dout_p2;
|
||||||
|
wire [15:0] dout_p3;
|
||||||
|
|
||||||
|
MeanIntp4 inst_MeanIntp4
|
||||||
|
(
|
||||||
|
.clk (clk_div16_f ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.en (en ),
|
||||||
|
.din (cos & {16{en}} ),
|
||||||
|
.dout4_0 (dout_p0 ),
|
||||||
|
.dout4_1 (dout_p1 ),
|
||||||
|
.dout4_2 (dout_p2 ),
|
||||||
|
.dout4_3 (dout_p3 )
|
||||||
|
);
|
||||||
|
|
||||||
|
reg [15:0] cs_wave;
|
||||||
|
|
||||||
|
always@(posedge clk_div16_e) cs_wave = dout_p0;
|
||||||
|
always@(posedge clk_div16_a) cs_wave = dout_p1;
|
||||||
|
always@(posedge clk_div16_6) cs_wave = dout_p2;
|
||||||
|
always@(posedge clk_div16_2) cs_wave = dout_p3;
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,164 @@
|
||||||
|
module TB();
|
||||||
|
|
||||||
|
initial
|
||||||
|
begin
|
||||||
|
$fsdbDumpfile("TB.fsdb");
|
||||||
|
$fsdbDumpvars(0, TB);
|
||||||
|
end
|
||||||
|
|
||||||
|
reg clk;
|
||||||
|
reg rstn;
|
||||||
|
reg en;
|
||||||
|
reg [21:0] cnt;
|
||||||
|
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
|
||||||
|
#0;
|
||||||
|
rstn = 1'b0;
|
||||||
|
clk = 1'b0;
|
||||||
|
en = 1'b0;
|
||||||
|
#300;
|
||||||
|
rstn = 1'b1;
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
always #200 clk = ~clk;
|
||||||
|
|
||||||
|
wire clk_div16_0;
|
||||||
|
wire clk_div16_1;
|
||||||
|
wire clk_div16_2;
|
||||||
|
wire clk_div16_3;
|
||||||
|
wire clk_div16_4;
|
||||||
|
wire clk_div16_5;
|
||||||
|
wire clk_div16_6;
|
||||||
|
wire clk_div16_7;
|
||||||
|
wire clk_div16_8;
|
||||||
|
wire clk_div16_9;
|
||||||
|
wire clk_div16_a;
|
||||||
|
wire clk_div16_b;
|
||||||
|
wire clk_div16_c;
|
||||||
|
wire clk_div16_d;
|
||||||
|
wire clk_div16_e;
|
||||||
|
wire clk_div16_f;
|
||||||
|
|
||||||
|
|
||||||
|
clk_gen inst_clk_gen(
|
||||||
|
.rstn (rstn ),
|
||||||
|
.clk (clk ),
|
||||||
|
.clk_div16_0 (clk_div16_0 ),
|
||||||
|
.clk_div16_1 (clk_div16_1 ),
|
||||||
|
.clk_div16_2 (clk_div16_2 ),
|
||||||
|
.clk_div16_3 (clk_div16_3 ),
|
||||||
|
.clk_div16_4 (clk_div16_4 ),
|
||||||
|
.clk_div16_5 (clk_div16_5 ),
|
||||||
|
.clk_div16_6 (clk_div16_6 ),
|
||||||
|
.clk_div16_7 (clk_div16_7 ),
|
||||||
|
.clk_div16_8 (clk_div16_8 ),
|
||||||
|
.clk_div16_9 (clk_div16_9 ),
|
||||||
|
.clk_div16_a (clk_div16_a ),
|
||||||
|
.clk_div16_b (clk_div16_b ),
|
||||||
|
.clk_div16_c (clk_div16_c ),
|
||||||
|
.clk_div16_d (clk_div16_d ),
|
||||||
|
.clk_div16_e (clk_div16_e ),
|
||||||
|
.clk_div16_f (clk_div16_f ),
|
||||||
|
.clk_h (clk_h ),
|
||||||
|
.clk_l (clk_l )
|
||||||
|
);
|
||||||
|
|
||||||
|
always@(posedge clk_div16_f or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
cnt <= 22'd0;
|
||||||
|
else
|
||||||
|
cnt <= cnt + 22'd1;
|
||||||
|
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
wait(cnt[17]==1'b1)
|
||||||
|
$finish(0);
|
||||||
|
end
|
||||||
|
always@(posedge clk_div16_f or negedge rstn)
|
||||||
|
begin
|
||||||
|
if(cnt >= 2047 )
|
||||||
|
begin
|
||||||
|
en <= 1'b1;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
en <= 1'b0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
reg [47:0] fcw;
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
fcw = 48'h0840_0000_0000;
|
||||||
|
end
|
||||||
|
|
||||||
|
wire [15:0] cos;
|
||||||
|
wire [15:0] sin;
|
||||||
|
|
||||||
|
|
||||||
|
NCO inst_nco_0(
|
||||||
|
.clk (clk_div16_f ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.phase_manual_clr (1'b0 ),
|
||||||
|
.phase_auto_clr (1'b0 ),
|
||||||
|
.fcw (fcw ),
|
||||||
|
.pha (16'd0 ),
|
||||||
|
.cos (cos ),
|
||||||
|
.sin (sin )
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
wire [15:0] dout_p0;
|
||||||
|
wire [15:0] dout_p1;
|
||||||
|
wire [15:0] dout_p2;
|
||||||
|
wire [15:0] dout_p3;
|
||||||
|
|
||||||
|
wire [1:0] intp_mode;
|
||||||
|
|
||||||
|
assign intp_mode = 2'b10;
|
||||||
|
|
||||||
|
MeanIntp4_top inst_MeanIntp4
|
||||||
|
(
|
||||||
|
.clk (clk_div16_f ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.en (en ),
|
||||||
|
.intp_mode (intp_mode ),
|
||||||
|
.din (cos & {16{en}} ),
|
||||||
|
.dout_0 (dout_p0 ),
|
||||||
|
.dout_1 (dout_p1 ),
|
||||||
|
.dout_2 (dout_p2 ),
|
||||||
|
.dout_3 (dout_p3 )
|
||||||
|
);
|
||||||
|
|
||||||
|
reg [15:0] cs_wave;
|
||||||
|
|
||||||
|
always@(*)
|
||||||
|
fork
|
||||||
|
case (intp_mode)
|
||||||
|
2'b00 :
|
||||||
|
begin
|
||||||
|
@(posedge clk_div16_e) cs_wave = dout_p0;
|
||||||
|
end
|
||||||
|
2'b01 :
|
||||||
|
begin
|
||||||
|
@(posedge clk_div16_e) cs_wave = dout_p0;
|
||||||
|
@(posedge clk_div16_6) cs_wave = dout_p1;
|
||||||
|
end
|
||||||
|
2'b10 :
|
||||||
|
begin
|
||||||
|
@(posedge clk_div16_e) cs_wave = dout_p0;
|
||||||
|
@(posedge clk_div16_a) cs_wave = dout_p1;
|
||||||
|
@(posedge clk_div16_6) cs_wave = dout_p2;
|
||||||
|
@(posedge clk_div16_2) cs_wave = dout_p3;
|
||||||
|
end
|
||||||
|
endcase
|
||||||
|
join
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,209 @@
|
||||||
|
module TB();
|
||||||
|
|
||||||
|
initial
|
||||||
|
begin
|
||||||
|
$fsdbDumpfile("TB.fsdb");
|
||||||
|
$fsdbDumpvars(0, TB);
|
||||||
|
end
|
||||||
|
|
||||||
|
reg clk;
|
||||||
|
reg rstn;
|
||||||
|
reg en;
|
||||||
|
reg [21:0] cnt;
|
||||||
|
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
|
||||||
|
#0;
|
||||||
|
rstn = 1'b0;
|
||||||
|
clk = 1'b0;
|
||||||
|
en = 1'b0;
|
||||||
|
#300;
|
||||||
|
rstn = 1'b1;
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
always #200 clk = ~clk;
|
||||||
|
|
||||||
|
wire clk_div16_0;
|
||||||
|
wire clk_div16_1;
|
||||||
|
wire clk_div16_2;
|
||||||
|
wire clk_div16_3;
|
||||||
|
wire clk_div16_4;
|
||||||
|
wire clk_div16_5;
|
||||||
|
wire clk_div16_6;
|
||||||
|
wire clk_div16_7;
|
||||||
|
wire clk_div16_8;
|
||||||
|
wire clk_div16_9;
|
||||||
|
wire clk_div16_a;
|
||||||
|
wire clk_div16_b;
|
||||||
|
wire clk_div16_c;
|
||||||
|
wire clk_div16_d;
|
||||||
|
wire clk_div16_e;
|
||||||
|
wire clk_div16_f;
|
||||||
|
|
||||||
|
|
||||||
|
clk_gen inst_clk_gen(
|
||||||
|
.rstn (rstn ),
|
||||||
|
.clk (clk ),
|
||||||
|
.clk_div16_0 (clk_div16_0 ),
|
||||||
|
.clk_div16_1 (clk_div16_1 ),
|
||||||
|
.clk_div16_2 (clk_div16_2 ),
|
||||||
|
.clk_div16_3 (clk_div16_3 ),
|
||||||
|
.clk_div16_4 (clk_div16_4 ),
|
||||||
|
.clk_div16_5 (clk_div16_5 ),
|
||||||
|
.clk_div16_6 (clk_div16_6 ),
|
||||||
|
.clk_div16_7 (clk_div16_7 ),
|
||||||
|
.clk_div16_8 (clk_div16_8 ),
|
||||||
|
.clk_div16_9 (clk_div16_9 ),
|
||||||
|
.clk_div16_a (clk_div16_a ),
|
||||||
|
.clk_div16_b (clk_div16_b ),
|
||||||
|
.clk_div16_c (clk_div16_c ),
|
||||||
|
.clk_div16_d (clk_div16_d ),
|
||||||
|
.clk_div16_e (clk_div16_e ),
|
||||||
|
.clk_div16_f (clk_div16_f ),
|
||||||
|
.clk_h (clk_h ),
|
||||||
|
.clk_l (clk_l )
|
||||||
|
);
|
||||||
|
|
||||||
|
always@(posedge clk_div16_f or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
cnt <= 22'd0;
|
||||||
|
else
|
||||||
|
cnt <= cnt + 22'd1;
|
||||||
|
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
wait(cnt[17]==1'b1)
|
||||||
|
$finish(0);
|
||||||
|
end
|
||||||
|
always@(posedge clk_div16_f or negedge rstn)
|
||||||
|
begin
|
||||||
|
if(cnt >= 2047 )
|
||||||
|
begin
|
||||||
|
en <= 1'b1;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
en <= 1'b0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
reg [47:0] fcw;
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
fcw = 48'h0840_0000_0000;
|
||||||
|
end
|
||||||
|
|
||||||
|
wire [15:0] cos;
|
||||||
|
wire [15:0] sin;
|
||||||
|
|
||||||
|
|
||||||
|
NCO inst_nco_0(
|
||||||
|
.clk (clk_div16_f ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.phase_manual_clr (1'b0 ),
|
||||||
|
.phase_auto_clr (1'b0 ),
|
||||||
|
.fcw (fcw ),
|
||||||
|
.pha (16'd0 ),
|
||||||
|
.cos (cos ),
|
||||||
|
.sin (sin )
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
wire [15:0] dout_p0;
|
||||||
|
wire [15:0] dout_p1;
|
||||||
|
wire [15:0] dout_p2;
|
||||||
|
wire [15:0] dout_p3;
|
||||||
|
wire [15:0] dout_p4;
|
||||||
|
wire [15:0] dout_p5;
|
||||||
|
wire [15:0] dout_p6;
|
||||||
|
wire [15:0] dout_p7;
|
||||||
|
|
||||||
|
|
||||||
|
wire [1:0] intp_mode;
|
||||||
|
assign intp_mode = 2'b11;
|
||||||
|
|
||||||
|
MeanIntp_8 inst_MeanIntp8
|
||||||
|
(
|
||||||
|
.clk (clk_div16_f ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.en (en ),
|
||||||
|
.intp_mode (intp_mode ),
|
||||||
|
.din (cos & {16{en}} ),
|
||||||
|
.dout_0 (dout_p0 ),
|
||||||
|
.dout_1 (dout_p1 ),
|
||||||
|
.dout_2 (dout_p2 ),
|
||||||
|
.dout_3 (dout_p3 ),
|
||||||
|
.dout_4 (dout_p4 ),
|
||||||
|
.dout_5 (dout_p5 ),
|
||||||
|
.dout_6 (dout_p6 ),
|
||||||
|
.dout_7 (dout_p7 )
|
||||||
|
|
||||||
|
);
|
||||||
|
integer signed In_fid;
|
||||||
|
integer X8_fid;
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
#0
|
||||||
|
|
||||||
|
In_fid = $fopen("./in_intp8.dat");
|
||||||
|
X8_fid = $fopen("./out_intp8.dat");
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
always@(posedge clk_div16_f)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(In_fid,"%d\n",{{{~cos[15]}},cos[14:0]});
|
||||||
|
|
||||||
|
reg [15:0] cs_wave;
|
||||||
|
|
||||||
|
always@(*)
|
||||||
|
fork
|
||||||
|
// begin
|
||||||
|
@(posedge clk_div16_e) cs_wave = dout_p0;
|
||||||
|
@(posedge clk_div16_c) cs_wave = dout_p1;
|
||||||
|
@(posedge clk_div16_a) cs_wave = dout_p2;
|
||||||
|
@(posedge clk_div16_8) cs_wave = dout_p3;
|
||||||
|
@(posedge clk_div16_6) cs_wave = dout_p4;
|
||||||
|
@(posedge clk_div16_4) cs_wave = dout_p5;
|
||||||
|
@(posedge clk_div16_2) cs_wave = dout_p6;
|
||||||
|
@(posedge clk_div16_0) cs_wave = dout_p7;
|
||||||
|
|
||||||
|
// end
|
||||||
|
join
|
||||||
|
|
||||||
|
always@(*)
|
||||||
|
fork
|
||||||
|
|
||||||
|
@(posedge clk_div16_e)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X8_fid,"%d\n",{{{~dout_p0[15]}},dout_p0[14:0]});
|
||||||
|
@(posedge clk_div16_c)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X8_fid,"%d\n",{{{~dout_p1[15]}},dout_p1[14:0]});
|
||||||
|
@(posedge clk_div16_a)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X8_fid,"%d\n",{{{~dout_p2[15]}},dout_p2[14:0]});
|
||||||
|
@(posedge clk_div16_8)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X8_fid,"%d\n",{{{~dout_p3[15]}},dout_p3[14:0]});
|
||||||
|
@(posedge clk_div16_6)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X8_fid,"%d\n",{{{~dout_p4[15]}},dout_p4[14:0]});
|
||||||
|
@(posedge clk_div16_4)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X8_fid,"%d\n",{{{~dout_p5[15]}},dout_p5[14:0]});
|
||||||
|
@(posedge clk_div16_2)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X8_fid,"%d\n",{{{~dout_p6[15]}},dout_p6[14:0]});
|
||||||
|
@(posedge clk_div16_0)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X8_fid,"%d\n",{{{~dout_p7[15]}},dout_p7[14:0]});
|
||||||
|
join
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,759 @@
|
||||||
|
module TB();
|
||||||
|
|
||||||
|
initial
|
||||||
|
begin
|
||||||
|
$fsdbDumpfile("TB.fsdb");
|
||||||
|
$fsdbDumpvars(0, TB);
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
reg rstn;
|
||||||
|
reg [15:0] din_im;
|
||||||
|
|
||||||
|
reg [31:0] a0_re;
|
||||||
|
reg [31:0] a0_im;
|
||||||
|
reg [31:0] b0_re;
|
||||||
|
reg [31:0] b0_im;
|
||||||
|
reg [31:0] a1_re;
|
||||||
|
reg [31:0] a1_im;
|
||||||
|
reg [31:0] b1_re;
|
||||||
|
reg [31:0] b1_im;
|
||||||
|
reg [31:0] a2_re;
|
||||||
|
reg [31:0] a2_im;
|
||||||
|
reg [31:0] b2_re;
|
||||||
|
reg [31:0] b2_im;
|
||||||
|
reg [31:0] a3_re;
|
||||||
|
reg [31:0] a3_im;
|
||||||
|
reg [31:0] b3_re;
|
||||||
|
reg [31:0] b3_im;
|
||||||
|
reg [31:0] a4_re;
|
||||||
|
reg [31:0] a4_im;
|
||||||
|
reg [31:0] b4_re;
|
||||||
|
reg [31:0] b4_im;
|
||||||
|
reg [31:0] a5_re;
|
||||||
|
reg [31:0] a5_im;
|
||||||
|
reg [31:0] b5_re;
|
||||||
|
reg [31:0] b5_im;
|
||||||
|
|
||||||
|
reg [47:0] fcw;
|
||||||
|
|
||||||
|
reg [21:0] cnt;
|
||||||
|
reg [15:0] din_imp;
|
||||||
|
reg [15:0] din_rect;
|
||||||
|
reg [15:0] din_cos;
|
||||||
|
reg [15:0] iir_in;
|
||||||
|
|
||||||
|
wire [1 :0] source_mode;
|
||||||
|
wire [15:0] cos;
|
||||||
|
wire [15:0] sin;
|
||||||
|
|
||||||
|
reg en;
|
||||||
|
|
||||||
|
reg clk;
|
||||||
|
reg clk_div2;
|
||||||
|
reg clk_div4;
|
||||||
|
|
||||||
|
initial
|
||||||
|
begin
|
||||||
|
#0;
|
||||||
|
rstn = 1'b0;
|
||||||
|
clk = 1'b0;
|
||||||
|
clk_div2 = 1'b0;
|
||||||
|
clk_div4 = 1'b0;
|
||||||
|
en = 1'b0;
|
||||||
|
|
||||||
|
din_im = 16'd0;
|
||||||
|
|
||||||
|
a0_re = 32'd55007237;
|
||||||
|
a0_im = 32'd0;
|
||||||
|
b0_re = 32'd2143083068;
|
||||||
|
b0_im = 32'd0;
|
||||||
|
a1_re = 32'd32690030;
|
||||||
|
a1_im = 32'd0;
|
||||||
|
b1_re = 32'd2145807236;
|
||||||
|
b1_im = 32'd0;
|
||||||
|
a2_re = 32'd429516;
|
||||||
|
a2_im = 32'd0;
|
||||||
|
b2_re = 32'd2146812530;
|
||||||
|
b2_im = 32'd0;
|
||||||
|
a3_re = 32'd0;
|
||||||
|
a3_im = 32'd0;
|
||||||
|
b3_re = 32'd0;
|
||||||
|
b3_im = 32'd0;
|
||||||
|
a4_re = 32'd0;
|
||||||
|
a4_im = 32'd0;
|
||||||
|
b4_re = 32'd0;
|
||||||
|
b4_im = 32'd0;
|
||||||
|
a5_re = 32'd0;
|
||||||
|
a5_im = 32'd0;
|
||||||
|
b5_re = -32'd0;
|
||||||
|
b5_im = 32'd0;
|
||||||
|
|
||||||
|
fcw = 48'h0840_0000_0000;
|
||||||
|
|
||||||
|
din_imp = 16'd0;
|
||||||
|
din_rect = 16'd0;
|
||||||
|
din_cos = 16'd0;
|
||||||
|
|
||||||
|
#300;
|
||||||
|
rstn = 1'b1;
|
||||||
|
#16600300;
|
||||||
|
// din_imp = 16'd30000;
|
||||||
|
// din_rect = 16'd30000;
|
||||||
|
// en = 1'b1;
|
||||||
|
#6400;
|
||||||
|
// din_imp = 16'd0;
|
||||||
|
#64000;
|
||||||
|
// din_rect = 16'd0;
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
always #200 clk = ~clk;
|
||||||
|
always #400 clk_div2 = ~clk_div2;
|
||||||
|
always #800 clk_div4 = ~clk_div4;
|
||||||
|
|
||||||
|
wire clk_div16_0;
|
||||||
|
wire clk_div16_1;
|
||||||
|
wire clk_div16_2;
|
||||||
|
wire clk_div16_3;
|
||||||
|
wire clk_div16_4;
|
||||||
|
wire clk_div16_5;
|
||||||
|
wire clk_div16_6;
|
||||||
|
wire clk_div16_7;
|
||||||
|
wire clk_div16_8;
|
||||||
|
wire clk_div16_9;
|
||||||
|
wire clk_div16_a;
|
||||||
|
wire clk_div16_b;
|
||||||
|
wire clk_div16_c;
|
||||||
|
wire clk_div16_d;
|
||||||
|
wire clk_div16_e;
|
||||||
|
wire clk_div16_f;
|
||||||
|
wire clk_l;
|
||||||
|
wire clk_h;
|
||||||
|
|
||||||
|
clk_gen inst_clk_gen(
|
||||||
|
.rstn (rstn ),
|
||||||
|
.clk (clk ),
|
||||||
|
.clk_div16_0 (clk_div16_0 ),
|
||||||
|
.clk_div16_1 (clk_div16_1 ),
|
||||||
|
.clk_div16_2 (clk_div16_2 ),
|
||||||
|
.clk_div16_3 (clk_div16_3 ),
|
||||||
|
.clk_div16_4 (clk_div16_4 ),
|
||||||
|
.clk_div16_5 (clk_div16_5 ),
|
||||||
|
.clk_div16_6 (clk_div16_6 ),
|
||||||
|
.clk_div16_7 (clk_div16_7 ),
|
||||||
|
.clk_div16_8 (clk_div16_8 ),
|
||||||
|
.clk_div16_9 (clk_div16_9 ),
|
||||||
|
.clk_div16_a (clk_div16_a ),
|
||||||
|
.clk_div16_b (clk_div16_b ),
|
||||||
|
.clk_div16_c (clk_div16_c ),
|
||||||
|
.clk_div16_d (clk_div16_d ),
|
||||||
|
.clk_div16_e (clk_div16_e ),
|
||||||
|
.clk_div16_f (clk_div16_f ),
|
||||||
|
.clk_h (clk_h ),
|
||||||
|
.clk_l (clk_l )
|
||||||
|
);
|
||||||
|
|
||||||
|
wire clk_div32_0;
|
||||||
|
wire clk_div32_1;
|
||||||
|
wire clk_div32_2;
|
||||||
|
wire clk_div32_3;
|
||||||
|
wire clk_div32_4;
|
||||||
|
wire clk_div32_5;
|
||||||
|
wire clk_div32_6;
|
||||||
|
wire clk_div32_7;
|
||||||
|
wire clk_div32_8;
|
||||||
|
wire clk_div32_9;
|
||||||
|
wire clk_div32_a;
|
||||||
|
wire clk_div32_b;
|
||||||
|
wire clk_div32_c;
|
||||||
|
wire clk_div32_d;
|
||||||
|
wire clk_div32_e;
|
||||||
|
wire clk_div32_f;
|
||||||
|
wire clk_l1;
|
||||||
|
wire clk_h1;
|
||||||
|
|
||||||
|
clk_gen inst1_clk_gen(
|
||||||
|
.rstn (rstn ),
|
||||||
|
.clk (clk_div2 ),
|
||||||
|
.clk_div16_0 (clk_div32_0 ),
|
||||||
|
.clk_div16_1 (clk_div32_1 ),
|
||||||
|
.clk_div16_2 (clk_div32_2 ),
|
||||||
|
.clk_div16_3 (clk_div32_3 ),
|
||||||
|
.clk_div16_4 (clk_div32_4 ),
|
||||||
|
.clk_div16_5 (clk_div32_5 ),
|
||||||
|
.clk_div16_6 (clk_div32_6 ),
|
||||||
|
.clk_div16_7 (clk_div32_7 ),
|
||||||
|
.clk_div16_8 (clk_div32_8 ),
|
||||||
|
.clk_div16_9 (clk_div32_9 ),
|
||||||
|
.clk_div16_a (clk_div32_a ),
|
||||||
|
.clk_div16_b (clk_div32_b ),
|
||||||
|
.clk_div16_c (clk_div32_c ),
|
||||||
|
.clk_div16_d (clk_div32_d ),
|
||||||
|
.clk_div16_e (clk_div32_e ),
|
||||||
|
.clk_div16_f (clk_div32_f ),
|
||||||
|
.clk_h (clk_h1 ),
|
||||||
|
.clk_l (clk_l1 )
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
always@(posedge clk_l or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
cnt <= 22'd0;
|
||||||
|
else
|
||||||
|
cnt <= cnt + 22'd1;
|
||||||
|
|
||||||
|
initial
|
||||||
|
begin
|
||||||
|
wait(cnt[16]==1'b1)
|
||||||
|
$finish(0);
|
||||||
|
end
|
||||||
|
|
||||||
|
always@(posedge clk_l or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
din_imp <= 22'd0;
|
||||||
|
else if(cnt == 100)
|
||||||
|
begin
|
||||||
|
din_imp <= 16'd32767;
|
||||||
|
//en <= 1'b1;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
din_imp <= 'h0;
|
||||||
|
|
||||||
|
always@(posedge clk_l or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
din_rect <= 22'd0;
|
||||||
|
else if(cnt >= 100 && cnt <=10100)
|
||||||
|
begin
|
||||||
|
din_rect <= 16'd30000;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
din_rect <= 16'd0;
|
||||||
|
end
|
||||||
|
|
||||||
|
always@(posedge clk_l or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
en <= 22'd0;
|
||||||
|
else if(cnt >= 90 )
|
||||||
|
begin
|
||||||
|
en <= 1'b1;
|
||||||
|
end
|
||||||
|
|
||||||
|
always@(posedge clk_l or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
begin
|
||||||
|
din_cos <= 16'd0;
|
||||||
|
iir_in <= 16'd0;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
din_cos <= {cos[15],cos[15:1]};
|
||||||
|
|
||||||
|
assign source_mode = 2'b01;
|
||||||
|
|
||||||
|
always @(*)
|
||||||
|
|
||||||
|
case(source_mode)
|
||||||
|
2'b00 : iir_in = din_imp;
|
||||||
|
2'b01 : iir_in = din_rect;
|
||||||
|
2'b10 : iir_in = din_cos;
|
||||||
|
endcase
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
NCO inst_nco_0(
|
||||||
|
.clk (clk_l ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.phase_manual_clr (1'b0 ),
|
||||||
|
.phase_auto_clr (1'b0 ),
|
||||||
|
.fcw (fcw ),
|
||||||
|
.pha (16'd0 ),
|
||||||
|
.cos (cos ),
|
||||||
|
.sin (sin )
|
||||||
|
);
|
||||||
|
|
||||||
|
wire [1:0] intp_mode;
|
||||||
|
assign intp_mode = 2'b11;
|
||||||
|
|
||||||
|
wire [1:0] dac_mode_sel;
|
||||||
|
assign dac_mode_sel = 2'b00;
|
||||||
|
|
||||||
|
wire tc_bypass;
|
||||||
|
assign tc_bypass = 1'b0;
|
||||||
|
/*
|
||||||
|
wire [15:0] dout_clkl_p0;
|
||||||
|
wire [15:0] dout_clkl_p1;
|
||||||
|
wire [15:0] dout_clkl_p2;
|
||||||
|
wire [15:0] dout_clkl_p3;
|
||||||
|
wire [15:0] dout_clkl_p4;
|
||||||
|
wire [15:0] dout_clkl_p5;
|
||||||
|
wire [15:0] dout_clkl_p6;
|
||||||
|
wire [15:0] dout_clkl_p7;
|
||||||
|
|
||||||
|
z_dsp inst_Z_dsp
|
||||||
|
(
|
||||||
|
.clk (clk_l ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.vldi (iir_in[14] ),
|
||||||
|
.en (en ),
|
||||||
|
.tc_bypass (tc_bypass ),
|
||||||
|
.dac_mode_sel (dac_mode_sel ),
|
||||||
|
.intp_mode (intp_mode ),
|
||||||
|
.din_re (iir_in ),
|
||||||
|
.din_im (din_im ),
|
||||||
|
.a0_re (a0_re ),
|
||||||
|
.a0_im (a0_im ),
|
||||||
|
.b0_re (b0_re ),
|
||||||
|
.b0_im (b0_im ),
|
||||||
|
.a1_re (a1_re ),
|
||||||
|
.a1_im (a1_im ),
|
||||||
|
.b1_re (b1_re ),
|
||||||
|
.b1_im (b1_im ),
|
||||||
|
.a2_re (a2_re ),
|
||||||
|
.a2_im (a2_im ),
|
||||||
|
.b2_re (b2_re ),
|
||||||
|
.b2_im (b2_im ),
|
||||||
|
.a3_re (a3_re ),
|
||||||
|
.a3_im (a3_im ),
|
||||||
|
.b3_re (b3_re ),
|
||||||
|
.b3_im (b3_im ),
|
||||||
|
.a4_re (a4_re ),
|
||||||
|
.a4_im (a4_im ),
|
||||||
|
.b4_re (b4_re ),
|
||||||
|
.b4_im (b4_im ),
|
||||||
|
.a5_re (a5_re ),
|
||||||
|
.a5_im (a5_im ),
|
||||||
|
.b5_re (b5_re ),
|
||||||
|
.b5_im (b5_im ),
|
||||||
|
.dout0 (dout_clkl_p0 ),
|
||||||
|
.dout1 (dout_clkl_p1 ),
|
||||||
|
.dout2 (dout_clkl_p2 ),
|
||||||
|
.dout3 (dout_clkl_p3 ),
|
||||||
|
.vldo ( ),
|
||||||
|
.saturation_0 ( ),
|
||||||
|
.saturation_1 ( ),
|
||||||
|
.saturation_2 ( ),
|
||||||
|
.saturation_3 ( ),
|
||||||
|
.saturation_4 ( ),
|
||||||
|
.saturation_5 ( )
|
||||||
|
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
wire [15:0] dout_p0;
|
||||||
|
wire [15:0] dout_p1;
|
||||||
|
wire [15:0] dout_p2;
|
||||||
|
wire [15:0] dout_p3;
|
||||||
|
|
||||||
|
z_dsp_en_Test inst_z_dsp_en_Test
|
||||||
|
(
|
||||||
|
.clk (clk_h ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.tc_bypass (tc_bypass ),
|
||||||
|
.dac_mode_sel (dac_mode_sel ),
|
||||||
|
.intp_mode (intp_mode ),
|
||||||
|
.vldi (iir_in[14] ),
|
||||||
|
.din_re (iir_in ),
|
||||||
|
.din_im (din_im ),
|
||||||
|
.a0_re (a0_re ),
|
||||||
|
.a0_im (a0_im ),
|
||||||
|
.b0_re (b0_re ),
|
||||||
|
.b0_im (b0_im ),
|
||||||
|
.a1_re (a1_re ),
|
||||||
|
.a1_im (a1_im ),
|
||||||
|
.b1_re (b1_re ),
|
||||||
|
.b1_im (b1_im ),
|
||||||
|
.a2_re (a2_re ),
|
||||||
|
.a2_im (a2_im ),
|
||||||
|
.b2_re (b2_re ),
|
||||||
|
.b2_im (b2_im ),
|
||||||
|
.a3_re (a3_re ),
|
||||||
|
.a3_im (a3_im ),
|
||||||
|
.b3_re (b3_re ),
|
||||||
|
.b3_im (b3_im ),
|
||||||
|
.a4_re (a4_re ),
|
||||||
|
.a4_im (a4_im ),
|
||||||
|
.b4_re (b4_re ),
|
||||||
|
.b4_im (b4_im ),
|
||||||
|
.a5_re (a5_re ),
|
||||||
|
.a5_im (a5_im ),
|
||||||
|
.b5_re (b5_re ),
|
||||||
|
.b5_im (b5_im ),
|
||||||
|
.dout0 (dout_p0 ),
|
||||||
|
.dout1 (dout_p1 ),
|
||||||
|
.dout2 (dout_p2 ),
|
||||||
|
.dout3 (dout_p3 ),
|
||||||
|
.vldo ( ),
|
||||||
|
.saturation_0 ( ),
|
||||||
|
.saturation_1 ( ),
|
||||||
|
.saturation_2 ( ),
|
||||||
|
.saturation_3 ( ),
|
||||||
|
.saturation_4 ( ),
|
||||||
|
.saturation_5 ( )
|
||||||
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
reg [15:0] dout_p0_r1 = 0;
|
||||||
|
reg [15:0] dout_p1_r1 = 0;
|
||||||
|
reg [15:0] dout_p2_r1 = 0;
|
||||||
|
reg [15:0] dout_p3_r1 = 0;
|
||||||
|
reg [15:0] dout_p4_r1 = 0;
|
||||||
|
reg [15:0] dout_p5_r1 = 0;
|
||||||
|
reg [15:0] dout_p6_r1 = 0;
|
||||||
|
reg [15:0] dout_p7_r1 = 0;
|
||||||
|
|
||||||
|
reg [15:0] dout_p0_r2 = 0;
|
||||||
|
reg [15:0] dout_p1_r2 = 0;
|
||||||
|
reg [15:0] dout_p2_r2 = 0;
|
||||||
|
reg [15:0] dout_p3_r2 = 0;
|
||||||
|
reg [15:0] dout_p4_r2 = 0;
|
||||||
|
reg [15:0] dout_p5_r2 = 0;
|
||||||
|
reg [15:0] dout_p6_r2 = 0;
|
||||||
|
reg [15:0] dout_p7_r2 = 0;
|
||||||
|
|
||||||
|
reg [15:0] dout_p0_r3 = 0;
|
||||||
|
reg [15:0] dout_p1_r3 = 0;
|
||||||
|
reg [15:0] dout_p2_r3 = 0;
|
||||||
|
reg [15:0] dout_p3_r3 = 0;
|
||||||
|
reg [15:0] dout_p4_r3 = 0;
|
||||||
|
reg [15:0] dout_p5_r3 = 0;
|
||||||
|
reg [15:0] dout_p6_r3 = 0;
|
||||||
|
reg [15:0] dout_p7_r3 = 0;
|
||||||
|
|
||||||
|
reg [15:0] dout_p0_r4 = 0;
|
||||||
|
reg [15:0] dout_p1_r4 = 0;
|
||||||
|
reg [15:0] dout_p2_r4 = 0;
|
||||||
|
reg [15:0] dout_p3_r4 = 0;
|
||||||
|
reg [15:0] dout_p4_r4 = 0;
|
||||||
|
reg [15:0] dout_p5_r4 = 0;
|
||||||
|
reg [15:0] dout_p6_r4 = 0;
|
||||||
|
reg [15:0] dout_p7_r4 = 0;
|
||||||
|
|
||||||
|
reg [15:0] dout_p0_r5 = 0;
|
||||||
|
reg [15:0] dout_p1_r5 = 0;
|
||||||
|
reg [15:0] dout_p2_r5 = 0;
|
||||||
|
reg [15:0] dout_p3_r5 = 0;
|
||||||
|
reg [15:0] dout_p4_r5 = 0;
|
||||||
|
reg [15:0] dout_p5_r5 = 0;
|
||||||
|
reg [15:0] dout_p6_r5 = 0;
|
||||||
|
reg [15:0] dout_p7_r5 = 0;
|
||||||
|
|
||||||
|
|
||||||
|
always @(posedge clk_h or negedge rstn ) begin
|
||||||
|
if(!rstn) begin
|
||||||
|
dout_p0_r1 <= 0;
|
||||||
|
dout_p1_r1 <= 0;
|
||||||
|
dout_p2_r1 <= 0;
|
||||||
|
dout_p3_r1 <= 0;
|
||||||
|
dout_p4_r1 <= 0;
|
||||||
|
dout_p5_r1 <= 0;
|
||||||
|
dout_p6_r1 <= 0;
|
||||||
|
dout_p7_r1 <= 0;
|
||||||
|
dout_p0_r2 <= 0;
|
||||||
|
dout_p1_r2 <= 0;
|
||||||
|
dout_p2_r2 <= 0;
|
||||||
|
dout_p3_r2 <= 0;
|
||||||
|
dout_p4_r2 <= 0;
|
||||||
|
dout_p5_r2 <= 0;
|
||||||
|
dout_p6_r2 <= 0;
|
||||||
|
dout_p7_r2 <= 0;
|
||||||
|
dout_p0_r3 <= 0;
|
||||||
|
dout_p1_r3 <= 0;
|
||||||
|
dout_p2_r3 <= 0;
|
||||||
|
dout_p3_r3 <= 0;
|
||||||
|
dout_p4_r3 <= 0;
|
||||||
|
dout_p5_r3 <= 0;
|
||||||
|
dout_p6_r3 <= 0;
|
||||||
|
dout_p7_r3 <= 0;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
dout_p0_r1 <= dout_p0;
|
||||||
|
dout_p1_r1 <= dout_p1;
|
||||||
|
dout_p2_r1 <= dout_p2;
|
||||||
|
dout_p3_r1 <= dout_p3;
|
||||||
|
dout_p4_r1 <= dout_p4;
|
||||||
|
dout_p5_r1 <= dout_p5;
|
||||||
|
dout_p6_r1 <= dout_p6;
|
||||||
|
dout_p7_r1 <= dout_p7;
|
||||||
|
|
||||||
|
dout_p0_r2 <= dout_p0_r1;
|
||||||
|
dout_p1_r2 <= dout_p1_r1;
|
||||||
|
dout_p2_r2 <= dout_p2_r1;
|
||||||
|
dout_p3_r2 <= dout_p3_r1;
|
||||||
|
dout_p4_r2 <= dout_p4_r1;
|
||||||
|
dout_p5_r2 <= dout_p5_r1;
|
||||||
|
dout_p6_r2 <= dout_p6_r1;
|
||||||
|
dout_p7_r2 <= dout_p7_r1;
|
||||||
|
|
||||||
|
dout_p0_r3 <= dout_p0_r2;
|
||||||
|
dout_p1_r3 <= dout_p1_r2;
|
||||||
|
dout_p2_r3 <= dout_p2_r2;
|
||||||
|
dout_p3_r3 <= dout_p3_r2;
|
||||||
|
dout_p4_r3 <= dout_p4_r2;
|
||||||
|
dout_p5_r3 <= dout_p5_r2;
|
||||||
|
dout_p6_r3 <= dout_p6_r2;
|
||||||
|
dout_p7_r3 <= dout_p7_r2;
|
||||||
|
|
||||||
|
dout_p0_r4 <= dout_p0_r3;
|
||||||
|
dout_p1_r4 <= dout_p1_r3;
|
||||||
|
dout_p2_r4 <= dout_p2_r3;
|
||||||
|
dout_p3_r4 <= dout_p3_r3;
|
||||||
|
dout_p4_r4 <= dout_p4_r3;
|
||||||
|
dout_p5_r4 <= dout_p5_r3;
|
||||||
|
dout_p6_r4 <= dout_p6_r3;
|
||||||
|
dout_p7_r4 <= dout_p7_r3;
|
||||||
|
|
||||||
|
dout_p0_r5 <= dout_p0_r4;
|
||||||
|
dout_p1_r5 <= dout_p1_r4;
|
||||||
|
dout_p2_r5 <= dout_p2_r4;
|
||||||
|
dout_p3_r5 <= dout_p3_r4;
|
||||||
|
dout_p4_r5 <= dout_p4_r4;
|
||||||
|
dout_p5_r5 <= dout_p5_r4;
|
||||||
|
dout_p6_r5 <= dout_p6_r4;
|
||||||
|
dout_p7_r5 <= dout_p7_r4;
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
reg [15:0] cs_wave = 0;
|
||||||
|
|
||||||
|
always@(*)
|
||||||
|
fork
|
||||||
|
case (intp_mode)
|
||||||
|
2'b00 :
|
||||||
|
begin
|
||||||
|
@(posedge clk_div16_e) cs_wave = dout_p0;
|
||||||
|
end
|
||||||
|
2'b01 :
|
||||||
|
begin
|
||||||
|
@(posedge clk_div16_e) cs_wave = dout_p0;
|
||||||
|
@(posedge clk_div16_6) cs_wave = dout_p1;
|
||||||
|
end
|
||||||
|
2'b10 :
|
||||||
|
begin
|
||||||
|
@(posedge clk_div16_e) cs_wave = dout_p0;
|
||||||
|
@(posedge clk_div16_a) cs_wave = dout_p1;
|
||||||
|
@(posedge clk_div16_6) cs_wave = dout_p2;
|
||||||
|
@(posedge clk_div16_2) cs_wave = dout_p3;
|
||||||
|
end
|
||||||
|
2'b11 :
|
||||||
|
begin
|
||||||
|
@(posedge clk_div32_7) cs_wave = dout_p0_r3;//f
|
||||||
|
@(posedge clk_div32_5) cs_wave = dout_p1_r3;//d
|
||||||
|
@(posedge clk_div32_3) cs_wave = dout_p2_r3;//b
|
||||||
|
@(posedge clk_div32_1) cs_wave = dout_p3_r3;//9
|
||||||
|
@(posedge clk_div32_f) cs_wave = dout_p4_r3;//7
|
||||||
|
@(posedge clk_div32_d) cs_wave = dout_p5_r3;//5
|
||||||
|
@(posedge clk_div32_b) cs_wave = dout_p6_r3;//3
|
||||||
|
@(posedge clk_div32_9) cs_wave = dout_p7_r3;//1
|
||||||
|
end
|
||||||
|
|
||||||
|
endcase
|
||||||
|
join
|
||||||
|
|
||||||
|
|
||||||
|
reg [15:0] cs_wave1 = 0;
|
||||||
|
|
||||||
|
always@(*)
|
||||||
|
fork
|
||||||
|
case (intp_mode)
|
||||||
|
2'b00 :
|
||||||
|
begin
|
||||||
|
@(posedge clk_div16_e) cs_wave1 = dout_p0;
|
||||||
|
end
|
||||||
|
2'b01 :
|
||||||
|
begin
|
||||||
|
@(posedge clk_div16_e) cs_wave1 = dout_p0;
|
||||||
|
@(posedge clk_div16_6) cs_wave1 = dout_p1;
|
||||||
|
end
|
||||||
|
2'b10 :
|
||||||
|
begin
|
||||||
|
@(posedge clk_div16_e) cs_wave1 = dout_p0;
|
||||||
|
@(posedge clk_div16_a) cs_wave1 = dout_p1;
|
||||||
|
@(posedge clk_div16_6) cs_wave1 = dout_p2;
|
||||||
|
@(posedge clk_div16_2) cs_wave1 = dout_p3;
|
||||||
|
end
|
||||||
|
2'b11 :
|
||||||
|
begin
|
||||||
|
@(posedge clk_div32_7) cs_wave1 = dout_clkl_p0;//f
|
||||||
|
@(posedge clk_div32_5) cs_wave1 = dout_clkl_p1;//d
|
||||||
|
@(posedge clk_div32_3) cs_wave1 = dout_clkl_p2;//b
|
||||||
|
@(posedge clk_div32_1) cs_wave1 = dout_clkl_p3;//9
|
||||||
|
@(posedge clk_div32_f) cs_wave1 = dout_clkl_p4;//7
|
||||||
|
@(posedge clk_div32_d) cs_wave1 = dout_clkl_p5;//5
|
||||||
|
@(posedge clk_div32_b) cs_wave1 = dout_clkl_p6;//3
|
||||||
|
@(posedge clk_div32_9) cs_wave1 = dout_clkl_p7;//1
|
||||||
|
end
|
||||||
|
|
||||||
|
endcase
|
||||||
|
join
|
||||||
|
|
||||||
|
|
||||||
|
wire [15:0] diff;
|
||||||
|
assign diff = cs_wave1 - cs_wave;
|
||||||
|
*/
|
||||||
|
integer signed In_fid;
|
||||||
|
integer signed diff_fid;
|
||||||
|
integer signed OrgOut_fid;
|
||||||
|
integer signed dout0_fid;
|
||||||
|
integer signed dout1_fid;
|
||||||
|
integer signed dout2_fid;
|
||||||
|
integer signed dout3_fid;
|
||||||
|
integer X1_fid;
|
||||||
|
integer X2_fid;
|
||||||
|
integer X4_fid;
|
||||||
|
integer X8_fid;
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
#0;
|
||||||
|
In_fid = $fopen("./in.dat");
|
||||||
|
diff_fid = $fopen("./diff_in.dat");
|
||||||
|
OrgOut_fid = $fopen("./OrgOut.dat");
|
||||||
|
dout0_fid = $fopen("./dout0.dat");
|
||||||
|
dout1_fid = $fopen("./dout1.dat");
|
||||||
|
dout2_fid = $fopen("./dout2.dat");
|
||||||
|
dout3_fid = $fopen("./dout3.dat");
|
||||||
|
case (intp_mode)
|
||||||
|
2'b00 : X1_fid = $fopen("./X1_data.dat");
|
||||||
|
2'b01 : X2_fid = $fopen("./X2_data.dat");
|
||||||
|
2'b10 : X4_fid = $fopen("./X4_data.dat");
|
||||||
|
2'b11 : X8_fid = $fopen("./X8_data.dat");
|
||||||
|
|
||||||
|
endcase
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
always@(posedge clk_l)
|
||||||
|
if(cnt >= 90)
|
||||||
|
begin
|
||||||
|
$fwrite(In_fid,"%d\n", $signed(TB.inst_z_dsp_en_Test.inst_z_dsp.inst_TailCorr_top.din_r1));
|
||||||
|
$fwrite(diff_fid,"%d\n", $signed(TB.inst_z_dsp_en_Test.inst_z_dsp.inst_TailCorr_top.IIRin_re));
|
||||||
|
$fwrite(OrgOut_fid,"%d\n",$signed(TB.inst_z_dsp_en_Test.inst_z_dsp.inst_TailCorr_top.dout));
|
||||||
|
end
|
||||||
|
|
||||||
|
always@(posedge clk_h)
|
||||||
|
if(cnt >= 90)
|
||||||
|
begin
|
||||||
|
$fwrite(dout0_fid,"%d\n",$signed(dout_p0));
|
||||||
|
$fwrite(dout1_fid,"%d\n",$signed(dout_p1));
|
||||||
|
$fwrite(dout2_fid,"%d\n",$signed(dout_p2));
|
||||||
|
$fwrite(dout3_fid,"%d\n",$signed(dout_p3));
|
||||||
|
end
|
||||||
|
/*
|
||||||
|
always@(*)
|
||||||
|
fork
|
||||||
|
case (intp_mode)
|
||||||
|
2'b00 :
|
||||||
|
begin
|
||||||
|
@(posedge clk_div16_e)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X1_fid,"%d\n",{{{dout_p0[15]}},dout_p0[14:0]});
|
||||||
|
end
|
||||||
|
2'b01 :
|
||||||
|
begin
|
||||||
|
@(posedge clk_div16_e)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X2_fid,"%d\n",{{{dout_p0[15]}},dout_p0[14:0]});
|
||||||
|
@(posedge clk_div16_6)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X2_fid,"%d\n",{{{dout_p1[15]}},dout_p1[14:0]});
|
||||||
|
end
|
||||||
|
2'b10 :
|
||||||
|
begin
|
||||||
|
@(posedge clk_div16_e)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X4_fid,"%d\n",{{{dout_p0[15]}},dout_p0[14:0]});
|
||||||
|
@(posedge clk_div16_a)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X4_fid,"%d\n",{{{dout_p1[15]}},dout_p1[14:0]});
|
||||||
|
@(posedge clk_div16_6)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X4_fid,"%d\n",{{{dout_p2[15]}},dout_p2[14:0]});
|
||||||
|
@(posedge clk_div16_2)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X4_fid,"%d\n",{{{dout_p3[15]}},dout_p3[14:0]});
|
||||||
|
end
|
||||||
|
2'b11 :
|
||||||
|
begin
|
||||||
|
@(posedge clk_div32_f)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X8_fid,"%d\n",$signed(dout0));
|
||||||
|
@(posedge clk_div32_d)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X8_fid,"%d\n",$signed(dout1));
|
||||||
|
@(posedge clk_div32_b)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X8_fid,"%d\n",$signed(dout2));
|
||||||
|
@(posedge clk_div32_9)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X8_fid,"%d\n",$signed(dout3));
|
||||||
|
@(posedge clk_div32_7)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X8_fid,"%d\n",$signed(dout4));
|
||||||
|
@(posedge clk_div32_5)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X8_fid,"%d\n",$signed(dout5));
|
||||||
|
@(posedge clk_div32_3)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X8_fid,"%d\n",$signed(dout6));
|
||||||
|
@(posedge clk_div32_1)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X8_fid,"%d\n",$signed(dout7));
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
endcase
|
||||||
|
join
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
always@(posedge clk_div16_e)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(In_fid,"%d\n",{{~{iir_in[15]}},iir_in[14:0]});
|
||||||
|
|
||||||
|
always@(posedge clk_div16_e)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X1_fid,"%d\n",{{~{dout_p3[15]}},dout_p3[14:0]});
|
||||||
|
|
||||||
|
always@(posedge clk_div16_e)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X2_fid,"%d\n",{{~{dout_p1[15]}},dout_p1[14:0]});
|
||||||
|
always@(posedge clk_div16_6)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X2_fid,"%d\n",{{~{dout_p3[15]}},dout_p3[14:0]});
|
||||||
|
|
||||||
|
always@(posedge clk_div16_e)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X4_fid,"%d\n",{{~{dout_p0[15]}},dout_p0[14:0]});
|
||||||
|
always@(posedge clk_div16_a)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X4_fid,"%d\n",{{~{dout_p1[15]}},dout_p1[14:0]});
|
||||||
|
always@(posedge clk_div16_6)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X4_fid,"%d\n",{{~{dout_p2[15]}},dout_p2[14:0]});
|
||||||
|
always@(posedge clk_div16_2)
|
||||||
|
if(cnt >= 90)
|
||||||
|
)
|
||||||
|
$fwrite(In_fid,"%d\n",{{~{iir_in[15]}},iir_in[14:0]});
|
||||||
|
|
||||||
|
always@(posedge clk_div16_e)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X1_fid,"%d\n",{{~{dout_p3[15]}},dout_p3[14:0]});
|
||||||
|
|
||||||
|
always@(posedge clk_div16_e)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X2_fid,"%d\n",{{~{dout_p1[15]}},dout_p1)
|
||||||
|
$fwrite(In_fid,"%d\n",{{~{iir_in[15]}},iir_in[14:0]});
|
||||||
|
|
||||||
|
always@(posedge clk_div16_e)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X1_fid,"%d\n",{{~{dout_p3[15]}},dout_p3[14:0]});
|
||||||
|
|
||||||
|
always@(posedge clk_div16_e)
|
||||||
|
if(cnt >= 90)
|
||||||
|
$fwrite(X2_fid,"%d\n",{{~{dout_p1[15]}},dout_p1 $fwrite(X4_fid,"%d\n",{{~{dout_p3[15]}},dout_p3[14:0]});
|
||||||
|
*/
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,593 @@
|
||||||
|
module TB();
|
||||||
|
|
||||||
|
initial
|
||||||
|
begin
|
||||||
|
$fsdbDumpfile("TB.fsdb");
|
||||||
|
$fsdbDumpvars(0, TB);
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
reg rstn;
|
||||||
|
reg [15:0] din_im;
|
||||||
|
|
||||||
|
reg [31:0] a0_re;
|
||||||
|
reg [31:0] a0_im;
|
||||||
|
reg [31:0] b0_re;
|
||||||
|
reg [31:0] b0_im;
|
||||||
|
reg [31:0] a1_re;
|
||||||
|
reg [31:0] a1_im;
|
||||||
|
reg [31:0] b1_re;
|
||||||
|
reg [31:0] b1_im;
|
||||||
|
reg [31:0] a2_re;
|
||||||
|
reg [31:0] a2_im;
|
||||||
|
reg [31:0] b2_re;
|
||||||
|
reg [31:0] b2_im;
|
||||||
|
reg [31:0] a3_re;
|
||||||
|
reg [31:0] a3_im;
|
||||||
|
reg [31:0] b3_re;
|
||||||
|
reg [31:0] b3_im;
|
||||||
|
reg [31:0] a4_re;
|
||||||
|
reg [31:0] a4_im;
|
||||||
|
reg [31:0] b4_re;
|
||||||
|
reg [31:0] b4_im;
|
||||||
|
reg [31:0] a5_re;
|
||||||
|
reg [31:0] a5_im;
|
||||||
|
reg [31:0] b5_re;
|
||||||
|
reg [31:0] b5_im;
|
||||||
|
|
||||||
|
reg [47:0] fcw;
|
||||||
|
|
||||||
|
reg [21:0] cnt;
|
||||||
|
reg [15:0] din_imp;
|
||||||
|
reg [15:0] din_rect;
|
||||||
|
reg [15:0] din_cos;
|
||||||
|
reg [15:0] iir_in;
|
||||||
|
|
||||||
|
wire [1 :0] source_mode;
|
||||||
|
wire [15:0] cos;
|
||||||
|
wire [15:0] sin;
|
||||||
|
wire [15:0] dout_p0;
|
||||||
|
|
||||||
|
reg en;
|
||||||
|
|
||||||
|
reg clk;
|
||||||
|
reg clk_div2;
|
||||||
|
reg clk_div4;
|
||||||
|
|
||||||
|
//a_fix is 55007237
|
||||||
|
//a_fix is 32690030
|
||||||
|
//a_fix is 429516
|
||||||
|
//a_fix is 0
|
||||||
|
//b_fix is 2143083068
|
||||||
|
//b_fix is 2145807236
|
||||||
|
//b_fix is 2146812530
|
||||||
|
//b_fix is 2147483648
|
||||||
|
|
||||||
|
initial
|
||||||
|
begin
|
||||||
|
#0;
|
||||||
|
rstn = 1'b0;
|
||||||
|
clk = 1'b0;
|
||||||
|
clk_div2 = 1'b0;
|
||||||
|
clk_div4 = 1'b0;
|
||||||
|
en = 1'b0;
|
||||||
|
|
||||||
|
din_im = 16'd0;
|
||||||
|
|
||||||
|
a0_re = 32'd55007237 ;
|
||||||
|
a1_re = 32'd32690030 ;
|
||||||
|
a2_re = 32'd429516;
|
||||||
|
a3_re = 32'd0;
|
||||||
|
a4_re = 32'd0;
|
||||||
|
a5_re = 32'd0;
|
||||||
|
|
||||||
|
a0_im = 32'd0;
|
||||||
|
a1_im = 32'd0;
|
||||||
|
a2_im = 32'd0;
|
||||||
|
a3_im = 32'd0;
|
||||||
|
a4_im = 32'd0;
|
||||||
|
a5_im = 32'd0;
|
||||||
|
|
||||||
|
b0_re = -32'd2143083068;
|
||||||
|
b1_re = -32'd2145807236;
|
||||||
|
b2_re = -32'd2146812530;
|
||||||
|
b3_re = -32'd0;
|
||||||
|
b4_re = -32'd0;
|
||||||
|
b5_re = -32'd0;
|
||||||
|
|
||||||
|
b0_im = 32'd0;
|
||||||
|
b1_im = 32'd0;
|
||||||
|
b2_im = 32'd0;
|
||||||
|
b3_im = 32'd0;
|
||||||
|
b4_im = 32'd0;
|
||||||
|
b5_im = 32'd0;
|
||||||
|
|
||||||
|
fcw = 48'h0840_0000_0000;
|
||||||
|
|
||||||
|
din_imp = 16'd0;
|
||||||
|
din_rect = 16'd0;
|
||||||
|
din_cos = 16'd0;
|
||||||
|
|
||||||
|
#300;
|
||||||
|
rstn = 1'b1;
|
||||||
|
#16600300;
|
||||||
|
// din_imp = 16'd30000;
|
||||||
|
// din_rect = 16'd30000;
|
||||||
|
// en = 1'b1;
|
||||||
|
#6400;
|
||||||
|
// din_imp = 16'd0;
|
||||||
|
#64000;
|
||||||
|
// din_rect = 16'd0;
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
always #200 clk = ~clk;
|
||||||
|
always #400 clk_div2 = ~clk_div2;
|
||||||
|
always #800 clk_div4 = ~clk_div4;
|
||||||
|
|
||||||
|
wire clk_div16_0;
|
||||||
|
wire clk_div16_1;
|
||||||
|
wire clk_div16_2;
|
||||||
|
wire clk_div16_3;
|
||||||
|
wire clk_div16_4;
|
||||||
|
wire clk_div16_5;
|
||||||
|
wire clk_div16_6;
|
||||||
|
wire clk_div16_7;
|
||||||
|
wire clk_div16_8;
|
||||||
|
wire clk_div16_9;
|
||||||
|
wire clk_div16_a;
|
||||||
|
wire clk_div16_b;
|
||||||
|
wire clk_div16_c;
|
||||||
|
wire clk_div16_d;
|
||||||
|
wire clk_div16_e;
|
||||||
|
wire clk_div16_f;
|
||||||
|
wire clk_l;
|
||||||
|
wire clk_h;
|
||||||
|
|
||||||
|
clk_gen inst_clk_gen(
|
||||||
|
.rstn (rstn ),
|
||||||
|
.clk (clk ),
|
||||||
|
.clk_div16_0 (clk_div16_0 ),
|
||||||
|
.clk_div16_1 (clk_div16_1 ),
|
||||||
|
.clk_div16_2 (clk_div16_2 ),
|
||||||
|
.clk_div16_3 (clk_div16_3 ),
|
||||||
|
.clk_div16_4 (clk_div16_4 ),
|
||||||
|
.clk_div16_5 (clk_div16_5 ),
|
||||||
|
.clk_div16_6 (clk_div16_6 ),
|
||||||
|
.clk_div16_7 (clk_div16_7 ),
|
||||||
|
.clk_div16_8 (clk_div16_8 ),
|
||||||
|
.clk_div16_9 (clk_div16_9 ),
|
||||||
|
.clk_div16_a (clk_div16_a ),
|
||||||
|
.clk_div16_b (clk_div16_b ),
|
||||||
|
.clk_div16_c (clk_div16_c ),
|
||||||
|
.clk_div16_d (clk_div16_d ),
|
||||||
|
.clk_div16_e (clk_div16_e ),
|
||||||
|
.clk_div16_f (clk_div16_f ),
|
||||||
|
.clk_h (clk_h ),
|
||||||
|
.clk_l (clk_l )
|
||||||
|
);
|
||||||
|
|
||||||
|
wire clk_div32_0;
|
||||||
|
wire clk_div32_1;
|
||||||
|
wire clk_div32_2;
|
||||||
|
wire clk_div32_3;
|
||||||
|
wire clk_div32_4;
|
||||||
|
wire clk_div32_5;
|
||||||
|
wire clk_div32_6;
|
||||||
|
wire clk_div32_7;
|
||||||
|
wire clk_div32_8;
|
||||||
|
wire clk_div32_9;
|
||||||
|
wire clk_div32_a;
|
||||||
|
wire clk_div32_b;
|
||||||
|
wire clk_div32_c;
|
||||||
|
wire clk_div32_d;
|
||||||
|
wire clk_div32_e;
|
||||||
|
wire clk_div32_f;
|
||||||
|
wire clk_l1;
|
||||||
|
wire clk_h1;
|
||||||
|
|
||||||
|
clk_gen inst1_clk_gen(
|
||||||
|
.rstn (rstn ),
|
||||||
|
.clk (clk_div2 ),
|
||||||
|
.clk_div16_0 (clk_div32_0 ),
|
||||||
|
.clk_div16_1 (clk_div32_1 ),
|
||||||
|
.clk_div16_2 (clk_div32_2 ),
|
||||||
|
.clk_div16_3 (clk_div32_3 ),
|
||||||
|
.clk_div16_4 (clk_div32_4 ),
|
||||||
|
.clk_div16_5 (clk_div32_5 ),
|
||||||
|
.clk_div16_6 (clk_div32_6 ),
|
||||||
|
.clk_div16_7 (clk_div32_7 ),
|
||||||
|
.clk_div16_8 (clk_div32_8 ),
|
||||||
|
.clk_div16_9 (clk_div32_9 ),
|
||||||
|
.clk_div16_a (clk_div32_a ),
|
||||||
|
.clk_div16_b (clk_div32_b ),
|
||||||
|
.clk_div16_c (clk_div32_c ),
|
||||||
|
.clk_div16_d (clk_div32_d ),
|
||||||
|
.clk_div16_e (clk_div32_e ),
|
||||||
|
.clk_div16_f (clk_div32_f ),
|
||||||
|
.clk_h (clk_h1 ),
|
||||||
|
.clk_l (clk_l1 )
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
always@(posedge clk_l or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
cnt <= 22'd0;
|
||||||
|
else
|
||||||
|
cnt <= cnt + 22'd1;
|
||||||
|
|
||||||
|
initial
|
||||||
|
begin
|
||||||
|
wait(cnt[16]==1'b1)
|
||||||
|
$finish(0);
|
||||||
|
end
|
||||||
|
|
||||||
|
always@(posedge clk_l or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
din_imp <= 22'd0;
|
||||||
|
else if(cnt == 100)
|
||||||
|
begin
|
||||||
|
din_imp <= 16'd32767;
|
||||||
|
//en <= 1'b1;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
din_imp <= 'h0;
|
||||||
|
|
||||||
|
always@(posedge clk_l or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
din_rect <= 22'd0;
|
||||||
|
else if(cnt >= 100 && cnt <=10100)
|
||||||
|
begin
|
||||||
|
din_rect <= 16'd30000;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
din_rect <= 16'd0;
|
||||||
|
end
|
||||||
|
|
||||||
|
always@(posedge clk_l or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
en <= 22'd0;
|
||||||
|
else if(cnt >= 90 )
|
||||||
|
begin
|
||||||
|
en <= 1'b1;
|
||||||
|
end
|
||||||
|
|
||||||
|
always@(posedge clk_l or negedge rstn)
|
||||||
|
if(!rstn)
|
||||||
|
begin
|
||||||
|
din_cos <= 16'd0;
|
||||||
|
iir_in <= 16'd0;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
din_cos <= {cos[15],cos[15:1]};
|
||||||
|
|
||||||
|
assign source_mode = 2'b01;
|
||||||
|
|
||||||
|
always @(*)
|
||||||
|
|
||||||
|
case(source_mode)
|
||||||
|
2'b00 : iir_in = din_imp;
|
||||||
|
2'b01 : iir_in = din_rect;
|
||||||
|
2'b10 : iir_in = din_cos;
|
||||||
|
endcase
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
NCO inst_nco_0(
|
||||||
|
.clk (clk_l ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.phase_manual_clr (1'b0 ),
|
||||||
|
.phase_auto_clr (1'b0 ),
|
||||||
|
.fcw (fcw ),
|
||||||
|
.pha (16'd0 ),
|
||||||
|
.cos (cos ),
|
||||||
|
.sin (sin )
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
wire [15:0] dout_p0;
|
||||||
|
wire [15:0] dout_p1;
|
||||||
|
wire [15:0] dout_p2;
|
||||||
|
wire [15:0] dout_p3;
|
||||||
|
wire [15:0] dout_p4;
|
||||||
|
wire [15:0] dout_p5;
|
||||||
|
wire [15:0] dout_p6;
|
||||||
|
wire [15:0] dout_p7;
|
||||||
|
|
||||||
|
wire [1:0] intp_mode;
|
||||||
|
assign intp_mode = 2'b11;
|
||||||
|
|
||||||
|
wire [1:0] dac_mode_sel;
|
||||||
|
assign dac_mode_sel = 2'b00;
|
||||||
|
|
||||||
|
wire tc_bypass;
|
||||||
|
assign tc_bypass = 1'b0;
|
||||||
|
|
||||||
|
z_dsp_en_Test inst_Z_dsp_en_Test
|
||||||
|
(
|
||||||
|
.clk (clk_h ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.tc_bypass (tc_bypass ),
|
||||||
|
.dac_mode_sel (dac_mode_sel ),
|
||||||
|
.intp_mode (intp_mode ),
|
||||||
|
.din_re (iir_in ),
|
||||||
|
.din_im (din_im ),
|
||||||
|
.a0_re (a0_re ),
|
||||||
|
.a0_im (a0_im ),
|
||||||
|
.b0_re (b0_re ),
|
||||||
|
.b0_im (b0_im ),
|
||||||
|
.a1_re (a1_re ),
|
||||||
|
.a1_im (a1_im ),
|
||||||
|
.b1_re (b1_re ),
|
||||||
|
.b1_im (b1_im ),
|
||||||
|
.a2_re (a2_re ),
|
||||||
|
.a2_im (a2_im ),
|
||||||
|
.b2_re (b2_re ),
|
||||||
|
.b2_im (b2_im ),
|
||||||
|
.a3_re (a3_re ),
|
||||||
|
.a3_im (a3_im ),
|
||||||
|
.b3_re (b3_re ),
|
||||||
|
.b3_im (b3_im ),
|
||||||
|
.a4_re (a4_re ),
|
||||||
|
.a4_im (a4_im ),
|
||||||
|
.b4_re (b4_re ),
|
||||||
|
.b4_im (b4_im ),
|
||||||
|
.a5_re (a5_re ),
|
||||||
|
.a5_im (a5_im ),
|
||||||
|
.b5_re (b5_re ),
|
||||||
|
.b5_im (b5_im ),
|
||||||
|
.dout0 (dout_p0 ),
|
||||||
|
.dout1 (dout_p1 ),
|
||||||
|
.dout2 (dout_p2 ),
|
||||||
|
.dout3 (dout_p3 ),
|
||||||
|
.dout4 (dout_p4 ),
|
||||||
|
.dout5 (dout_p5 ),
|
||||||
|
.dout6 (dout_p6 ),
|
||||||
|
.dout7 (dout_p7 ),
|
||||||
|
.vldo (vldo ),
|
||||||
|
.saturation_0 ( ),
|
||||||
|
.saturation_1 ( ),
|
||||||
|
.saturation_2 ( ),
|
||||||
|
.saturation_3 ( ),
|
||||||
|
.saturation_4 ( ),
|
||||||
|
.saturation_5 ( )
|
||||||
|
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
wire [15:0] dout_clkl_p0;
|
||||||
|
wire [15:0] dout_clkl_p1;
|
||||||
|
wire [15:0] dout_clkl_p2;
|
||||||
|
wire [15:0] dout_clkl_p3;
|
||||||
|
wire [15:0] dout_clkl_p4;
|
||||||
|
wire [15:0] dout_clkl_p5;
|
||||||
|
wire [15:0] dout_clkl_p6;
|
||||||
|
wire [15:0] dout_clkl_p7;
|
||||||
|
|
||||||
|
|
||||||
|
z_dsp_en_Test inst_z_dsp_en_Test
|
||||||
|
(
|
||||||
|
.clk (clk_l ),
|
||||||
|
.rstn (rstn ),
|
||||||
|
.tc_bypass (tc_bypass ),
|
||||||
|
.dac_mode_sel (dac_mode_sel ),
|
||||||
|
.intp_mode (intp_mode ),
|
||||||
|
.din_re (iir_in ),
|
||||||
|
.din_im (din_im ),
|
||||||
|
.a0_re (a0_re ),
|
||||||
|
.a0_im (a0_im ),
|
||||||
|
.b0_re (b0_re ),
|
||||||
|
.b0_im (b0_im ),
|
||||||
|
.a1_re (a1_re ),
|
||||||
|
.a1_im (a1_im ),
|
||||||
|
.b1_re (b1_re ),
|
||||||
|
.b1_im (b1_im ),
|
||||||
|
.a2_re (a2_re ),
|
||||||
|
.a2_im (a2_im ),
|
||||||
|
.b2_re (b2_re ),
|
||||||
|
.b2_im (b2_im ),
|
||||||
|
.a3_re (a3_re ),
|
||||||
|
.a3_im (a3_im ),
|
||||||
|
.b3_re (b3_re ),
|
||||||
|
.b3_im (b3_im ),
|
||||||
|
.a4_re (a4_re ),
|
||||||
|
.a4_im (a4_im ),
|
||||||
|
.b4_re (b4_re ),
|
||||||
|
.b4_im (b4_im ),
|
||||||
|
.a5_re (a5_re ),
|
||||||
|
.a5_im (a5_im ),
|
||||||
|
.b5_re (b5_re ),
|
||||||
|
.b5_im (b5_im ),
|
||||||
|
.dout0 (dout_clkl_p0 ),
|
||||||
|
.dout1 (dout_clkl_p1 ),
|
||||||
|
.dout2 (dout_clkl_p2 ),
|
||||||
|
.dout3 (dout_clkl_p3 ),
|
||||||
|
.dout4 (dout_clkl_p4 ),
|
||||||
|
.dout5 (dout_clkl_p5 ),
|
||||||
|
.dout6 (dout_clkl_p6 ),
|
||||||
|
.dout7 (dout_clkl_p7 )
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
reg [15:0] dout_p0_r1 = 0;
|
||||||
|
reg [15:0] dout_p1_r1 = 0;
|
||||||
|
reg [15:0] dout_p2_r1 = 0;
|
||||||
|
reg [15:0] dout_p3_r1 = 0;
|
||||||
|
reg [15:0] dout_p4_r1 = 0;
|
||||||
|
reg [15:0] dout_p5_r1 = 0;
|
||||||
|
reg [15:0] dout_p6_r1 = 0;
|
||||||
|
reg [15:0] dout_p7_r1 = 0;
|
||||||
|
reg [15:0] dout_p0_r2 = 0;
|
||||||
|
reg [15:0] dout_p1_r2 = 0;
|
||||||
|
reg [15:0] dout_p2_r2 = 0;
|
||||||
|
reg [15:0] dout_p3_r2 = 0;
|
||||||
|
reg [15:0] dout_p4_r2 = 0;
|
||||||
|
reg [15:0] dout_p5_r2 = 0;
|
||||||
|
reg [15:0] dout_p6_r2 = 0;
|
||||||
|
reg [15:0] dout_p7_r2 = 0;
|
||||||
|
reg [15:0] dout_p0_r3 = 0;
|
||||||
|
reg [15:0] dout_p1_r3 = 0;
|
||||||
|
reg [15:0] dout_p2_r3 = 0;
|
||||||
|
reg [15:0] dout_p3_r3 = 0;
|
||||||
|
reg [15:0] dout_p4_r3 = 0;
|
||||||
|
reg [15:0] dout_p5_r3 = 0;
|
||||||
|
reg [15:0] dout_p6_r3 = 0;
|
||||||
|
reg [15:0] dout_p7_r3 = 0;
|
||||||
|
|
||||||
|
|
||||||
|
always @(posedge clk_h or negedge rstn ) begin
|
||||||
|
if(!rstn) begin
|
||||||
|
dout_p0_r1 <= 0;
|
||||||
|
dout_p1_r1 <= 0;
|
||||||
|
dout_p2_r1 <= 0;
|
||||||
|
dout_p3_r1 <= 0;
|
||||||
|
dout_p4_r1 <= 0;
|
||||||
|
dout_p5_r1 <= 0;
|
||||||
|
dout_p6_r1 <= 0;
|
||||||
|
dout_p7_r1 <= 0;
|
||||||
|
dout_p0_r2 <= 0;
|
||||||
|
dout_p1_r2 <= 0;
|
||||||
|
dout_p2_r2 <= 0;
|
||||||
|
dout_p3_r2 <= 0;
|
||||||
|
dout_p4_r2 <= 0;
|
||||||
|
dout_p5_r2 <= 0;
|
||||||
|
dout_p6_r2 <= 0;
|
||||||
|
dout_p7_r2 <= 0;
|
||||||
|
dout_p0_r3 <= 0;
|
||||||
|
dout_p1_r3 <= 0;
|
||||||
|
dout_p2_r3 <= 0;
|
||||||
|
dout_p3_r3 <= 0;
|
||||||
|
dout_p4_r3 <= 0;
|
||||||
|
dout_p5_r3 <= 0;
|
||||||
|
dout_p6_r3 <= 0;
|
||||||
|
dout_p7_r3 <= 0;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
dout_p0_r1 <= dout_p0;
|
||||||
|
dout_p1_r1 <= dout_p1;
|
||||||
|
dout_p2_r1 <= dout_p2;
|
||||||
|
dout_p3_r1 <= dout_p3;
|
||||||
|
dout_p4_r1 <= dout_p4;
|
||||||
|
dout_p5_r1 <= dout_p5;
|
||||||
|
dout_p6_r1 <= dout_p6;
|
||||||
|
dout_p7_r1 <= dout_p7;
|
||||||
|
dout_p0_r2 <= dout_p0_r1;
|
||||||
|
dout_p1_r2 <= dout_p1_r1;
|
||||||
|
dout_p2_r2 <= dout_p2_r1;
|
||||||
|
dout_p3_r2 <= dout_p3_r1;
|
||||||
|
dout_p4_r2 <= dout_p4_r1;
|
||||||
|
dout_p5_r2 <= dout_p5_r1;
|
||||||
|
dout_p6_r2 <= dout_p6_r1;
|
||||||
|
dout_p7_r2 <= dout_p7_r1;
|
||||||
|
dout_p0_r3 <= dout_p0_r2;
|
||||||
|
dout_p1_r3 <= dout_p1_r2;
|
||||||
|
dout_p2_r3 <= dout_p2_r2;
|
||||||
|
dout_p3_r3 <= dout_p3_r2;
|
||||||
|
dout_p4_r3 <= dout_p4_r2;
|
||||||
|
dout_p5_r3 <= dout_p5_r2;
|
||||||
|
dout_p6_r3 <= dout_p6_r2;
|
||||||
|
dout_p7_r3 <= dout_p7_r2;
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
reg [15:0] cs_wave = 0;
|
||||||
|
|
||||||
|
always@(*)
|
||||||
|
fork
|
||||||
|
case (intp_mode)
|
||||||
|
2'b00 :
|
||||||
|
begin
|
||||||
|
@(posedge clk_div16_e) cs_wave = dout_p0;
|
||||||
|
end
|
||||||
|
2'b01 :
|
||||||
|
begin
|
||||||
|
@(posedge clk_div16_e) cs_wave = dout_p0;
|
||||||
|
@(posedge clk_div16_6) cs_wave = dout_p1;
|
||||||
|
end
|
||||||
|
2'b10 :
|
||||||
|
begin
|
||||||
|
@(posedge clk_div16_e) cs_wave = dout_p0;
|
||||||
|
@(posedge clk_div16_a) cs_wave = dout_p1;
|
||||||
|
@(posedge clk_div16_6) cs_wave = dout_p2;
|
||||||
|
@(posedge clk_div16_2) cs_wave = dout_p3;
|
||||||
|
end
|
||||||
|
2'b11 :
|
||||||
|
begin
|
||||||
|
@(posedge clk_div32_7) cs_wave = dout_p0_r3;//f
|
||||||
|
@(posedge clk_div32_5) cs_wave = dout_p1_r3;//d
|
||||||
|
@(posedge clk_div32_3) cs_wave = dout_p2_r3;//b
|
||||||
|
@(posedge clk_div32_1) cs_wave = dout_p3_r3;//9
|
||||||
|
@(posedge clk_div32_f) cs_wave = dout_p4_r3;//7
|
||||||
|
@(posedge clk_div32_d) cs_wave = dout_p5_r3;//5
|
||||||
|
@(posedge clk_div32_b) cs_wave = dout_p6_r3;//3
|
||||||
|
@(posedge clk_div32_9) cs_wave = dout_p7_r3;//1
|
||||||
|
end
|
||||||
|
|
||||||
|
endcase
|
||||||
|
join
|
||||||
|
|
||||||
|
|
||||||
|
reg [15:0] cs_wave1 = 0;
|
||||||
|
|
||||||
|
always@(*)
|
||||||
|
fork
|
||||||
|
case (intp_mode)
|
||||||
|
2'b00 :
|
||||||
|
begin
|
||||||
|
@(posedge clk_div16_e) cs_wave1 = dout_p0;
|
||||||
|
end
|
||||||
|
2'b01 :
|
||||||
|
begin
|
||||||
|
@(posedge clk_div16_e) cs_wave1 = dout_p0;
|
||||||
|
@(posedge clk_div16_6) cs_wave1 = dout_p1;
|
||||||
|
end
|
||||||
|
2'b10 :
|
||||||
|
begin
|
||||||
|
@(posedge clk_div16_e) cs_wave1 = dout_p0;
|
||||||
|
@(posedge clk_div16_a) cs_wave1 = dout_p1;
|
||||||
|
@(posedge clk_div16_6) cs_wave1 = dout_p2;
|
||||||
|
@(posedge clk_div16_2) cs_wave1 = dout_p3;
|
||||||
|
end
|
||||||
|
2'b11 :
|
||||||
|
begin
|
||||||
|
@(posedge clk_div32_7) cs_wave1 = dout_clkl_p0;//f
|
||||||
|
@(posedge clk_div32_5) cs_wave1 = dout_clkl_p1;//d
|
||||||
|
@(posedge clk_div32_3) cs_wave1 = dout_clkl_p2;//b
|
||||||
|
@(posedge clk_div32_1) cs_wave1 = dout_clkl_p3;//9
|
||||||
|
@(posedge clk_div32_f) cs_wave1 = dout_clkl_p4;//7
|
||||||
|
@(posedge clk_div32_d) cs_wave1 = dout_clkl_p5;//5
|
||||||
|
@(posedge clk_div32_b) cs_wave1 = dout_clkl_p6;//3
|
||||||
|
@(posedge clk_div32_9) cs_wave1 = dout_clkl_p7;//1
|
||||||
|
end
|
||||||
|
|
||||||
|
endcase
|
||||||
|
join
|
||||||
|
|
||||||
|
|
||||||
|
wire [15:0] diff;
|
||||||
|
assign diff = cs_wave1 - cs_wave;
|
||||||
|
integer signed In_fid;
|
||||||
|
integer signed OrgOut_fid;
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
#0;
|
||||||
|
In_fid = $fopen("./in.dat") ;
|
||||||
|
OrgOut_fid = $fopen("./OrgOut.dat");
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
always@(posedge clk_div32_f)
|
||||||
|
if(cnt >= 90) begin
|
||||||
|
$fwrite(In_fid, "%d\n",$signed(TB.inst1_Z_dsp.inst_TailCorr_top.din_re));
|
||||||
|
$fwrite(OrgOut_fid,"%d\n",$signed(TB.inst1_Z_dsp.inst_TailCorr_top.dout ));
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue