参考IP核,将输入系数的位宽都改为32位;使用参数化的方法来控制

This commit is contained in:
thfu 2024-11-25 20:26:22 +08:00 committed by futh0403
parent 5f445faf9e
commit d25f7e4439
16 changed files with 289 additions and 581 deletions

View File

@ -31,75 +31,81 @@
// Synthesizable (y/n): // Synthesizable (y/n):
// Other: // Other:
//-FHDR-------------------------------------------------------------------------------------------------------- //-FHDR--------------------------------------------------------------------------------------------------------
parameter data_in_width = 16;
parameter 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;
module IIR_Filter ( module IIR_Filter (
rstn, input rstn
en, ,input clk
clk, ,input en
din_re, ,input signed [data_in_width-1:0] din_re
din_im, ,input signed [data_in_width-1:0] din_im
a_re, ,input signed [coef_width-1 :0] a_re
a_im, ,input signed [coef_width-1 :0] a_im
b_re, ,input signed [coef_width-1 :0] b_re
b_im, ,input signed [coef_width-1 :0] b_im
dout
,output signed [data_in_width-1:0] dout
); );
input rstn;
input clk;
input en;
input signed [15:0] din_re;
input signed [15:0] din_im;
input signed [36:0] a_re;
input signed [36:0] a_im;
input signed [20:0] b_re;
input signed [20:0] b_im;
output signed [15:0] dout; wire signed [data_in_width+frac_data_out_width:0] x1_re;
wire signed [data_in_width+frac_data_out_width:0] x1_im;
wire signed [31:0] x1_re; mult_C
wire signed [31:0] x1_im; #(
wire signed [31:0] x2_re; .A_width(data_in_width)
wire signed [31:0] x2_im; ,.B_width(data_in_width)
wire signed [31:0] v_re; ,.C_width(coef_width+frac_data_out_width)
wire signed [31:0] v_im; ,.D_width(coef_width+frac_data_out_width)
reg signed [31:0] v1_re; ,.frac_coef_width(frac_coef_width)
reg signed [31:0] v1_im; )
inst_c1 (
wire signed [31:0] y_re;
wire signed [31:0] y_im;
wire signed [31:0] y1_re;
wire signed [31:0] y1_im;
wire signed [31:0] y2_re;
wire signed [31:0] y2_im;
reg signed [15:0] dout_re;
mult_C #(16,16,37,37) inst_c1 (
.clk (clk ), .clk (clk ),
.rstn (rstn ), .rstn (rstn ),
.en (en ), .en (en ),
.a (din_re ), .a (din_re ),
.b (din_im ), .b (din_im ),
.c (a_re ), .c ({a_re,{frac_data_out_width{1'b0}}}),
.d (a_im ), .d ({a_im,{frac_data_out_width{1'b0}}}),
.Re (x1_re ), .Re (x1_re ),//a*x(n)
.Im (x1_im ) .Im (x1_im )
); );
wire signed [data_in_width+frac_data_out_width+1:0] x2_re;
mult_C #(32,32,21,21) inst_c2 ( wire signed [data_in_width+frac_data_out_width+1:0] x2_im;
mult_C
#(
.A_width(data_in_width+frac_data_out_width+1)
,.B_width(data_in_width+frac_data_out_width+1)
,.C_width(coef_width)
,.D_width(coef_width)
,.frac_coef_width(frac_coef_width)
)
inst_c2 (
.clk (clk ), .clk (clk ),
.rstn (rstn ), .rstn (rstn ),
.en (en ), .en (en ),
.a (x1_re ), .a (x1_re ),//a*x(n)
.b (x1_im ), .b (x1_im ),
.c (b_re ), .c (b_re ),
.d (b_im ), .d (b_im ),
.Re (x2_re ), .Re (x2_re ),//a*b*x(n-1)
.Im (x2_im ) .Im (x2_im )
); );
wire signed [data_in_width+frac_data_out_width+1:0] v_re;
wire signed [data_in_width+frac_data_out_width+1:0] v_im;
assign v_re = x1_re - x2_re; assign v_re = x1_re + x2_re;
assign v_im = x1_im - x2_im; assign v_im = x1_im + x2_im;
reg signed [data_in_width+frac_data_out_width+1:0] v1_re;
reg signed [data_in_width+frac_data_out_width+1:0] v1_im;
always @(posedge clk or negedge rstn) always @(posedge clk or negedge rstn)
if (!rstn) if (!rstn)
@ -118,19 +124,44 @@ always @(posedge clk or negedge rstn)
v1_im <= v1_im; v1_im <= v1_im;
end end
mult_C #(32,32,21,21) inst_c3 ( wire signed [data_in_width+frac_data_out_width+1:0] y_re;
wire signed [data_in_width+frac_data_out_width+1:0] y_im;
wire signed [data_in_width+frac_data_out_width+1:0] y1_re;
wire signed [data_in_width+frac_data_out_width+1:0] y1_im;
wire signed [data_in_width+frac_data_out_width+1:0] y2_re;
wire signed [data_in_width+frac_data_out_width+1:0] y2_im;
reg signed [data_in_width-1:0] dout_re;
mult_C
#(
.A_width(data_in_width+frac_data_out_width+2)
,.B_width(data_in_width+frac_data_out_width+2)
,.C_width(coef_width)
,.D_width(coef_width)
,.frac_coef_width(frac_coef_width)
)
inst_c3 (
.clk (clk ), .clk (clk ),
.rstn (rstn ), .rstn (rstn ),
.en (en ), .en (en ),
.a (y_re ), .a (y_re ),//y(n)=a*x(n)+a*b*x(n-1)+b^2*y(n-2)
.b (y_im ), .b (y_im ),
.c (b_re ), .c (b_re ),
.d (b_im ), .d (b_im ),
.Re (y1_re ), .Re (y1_re ),//b*y(n-1)
.Im (y1_im ) .Im (y1_im )
); );
mult_C #(32,32,21,21) inst_c4 ( mult_C
#(
.A_width(data_in_width+frac_data_out_width+2)
,.B_width(data_in_width+frac_data_out_width+2)
,.C_width(coef_width)
,.D_width(coef_width)
,.frac_coef_width(frac_coef_width)
)
inst_c4 (
.clk (clk ), .clk (clk ),
.rstn (rstn ), .rstn (rstn ),
.en (en ), .en (en ),
@ -138,13 +169,34 @@ mult_C #(32,32,21,21) inst_c4 (
.b (y1_im ), .b (y1_im ),
.c (b_re ), .c (b_re ),
.d (b_im ), .d (b_im ),
.Re (y2_re ), .Re (y2_re ),//b^2*y(n-2)
.Im (y2_im ) .Im (y2_im )
); );
assign y_re = v1_re + y2_re; assign y_re = v1_re + y2_re;
assign y_im = v1_im + y2_im; assign y_im = v1_im + y2_im;
reg signed [data_in_width+frac_data_out_width+2:0] dout_round;
always@(posedge clk or negedge rstn)
if(!rstn)
begin
dout_round <= 'h0;
end
else if(en) begin
if(y_re[data_in_width+frac_data_out_width+1] == 1'b0)
begin
dout_round <= y_re + {{1'b1},{(frac_data_out_width-1){1'b0}}};
end
else if (y_re[data_in_width+frac_data_out_width+1] == 1'b1)
begin
dout_round <= y_re + {{1'b1},{(frac_data_out_width-1){1'b0}}} - 1'b1;
end
end
else begin
dout_round <= dout_round;
end
always @(posedge clk or negedge rstn) always @(posedge clk or negedge rstn)
if (!rstn) if (!rstn)
begin begin
@ -152,7 +204,7 @@ always @(posedge clk or negedge rstn)
end end
else if(en) else if(en)
begin begin
dout_re <= y_re[31:16]; dout_re <= dout_round[data_in_width+frac_data_out_width+2:frac_data_out_width];
end end
else else
begin begin

View File

@ -71,32 +71,32 @@ input rstn;
input clk; input clk;
input en; input en;
input tc_bypass; input tc_bypass;
input signed [15:0] din_re; input signed [31:0] din_re;
input signed [15:0] din_im; input signed [31:0] din_im;
input signed [36:0] a0_re; input signed [31:0] a0_re;
input signed [36:0] a0_im; input signed [31:0] a0_im;
input signed [20:0] b0_re; input signed [31:0] b0_re;
input signed [20:0] b0_im; input signed [31:0] b0_im;
input signed [36:0] a1_re; input signed [31:0] a1_re;
input signed [36:0] a1_im; input signed [31:0] a1_im;
input signed [20:0] b1_re; input signed [31:0] b1_re;
input signed [20:0] b1_im; input signed [31:0] b1_im;
input signed [36:0] a2_re; input signed [31:0] a2_re;
input signed [36:0] a2_im; input signed [31:0] a2_im;
input signed [20:0] b2_re; input signed [31:0] b2_re;
input signed [20:0] b2_im; input signed [31:0] b2_im;
input signed [36:0] a3_re; input signed [31:0] a3_re;
input signed [36:0] a3_im; input signed [31:0] a3_im;
input signed [20:0] b3_re; input signed [31:0] b3_re;
input signed [20:0] b3_im; input signed [31:0] b3_im;
input signed [36:0] a4_re; input signed [31:0] a4_re;
input signed [36:0] a4_im; input signed [31:0] a4_im;
input signed [20:0] b4_re; input signed [31:0] b4_re;
input signed [20:0] b4_im; input signed [31:0] b4_im;
input signed [36:0] a5_re; input signed [31:0] a5_re;
input signed [36:0] a5_im; input signed [31:0] a5_im;
input signed [20:0] b5_re; input signed [31:0] b5_re;
input signed [20:0] b5_im; input signed [31:0] b5_im;
output signed [15:0] dout; output signed [15:0] dout;
@ -116,6 +116,8 @@ reg signed [15:0] din_r1;
reg signed [15:0] din_r2; reg signed [15:0] din_r2;
reg signed [15:0] din_r3; reg signed [15:0] din_r3;
reg signed [15:0] din_r4; reg signed [15:0] din_r4;
reg signed [15:0] din_r5;
reg signed [15:0] dout_r; reg signed [15:0] dout_r;
diff inst_diffRe diff inst_diffRe
@ -223,6 +225,7 @@ always @(posedge clk or negedge rstn)
din_r2 <= 'h0; din_r2 <= 'h0;
din_r3 <= 'h0; din_r3 <= 'h0;
din_r4 <= 'h0; din_r4 <= 'h0;
din_r5 <= 'h0;
end end
else if(en) else if(en)
begin begin
@ -231,6 +234,7 @@ always @(posedge clk or negedge rstn)
din_r2 <= din_r1; din_r2 <= din_r1;
din_r3 <= din_r2; din_r3 <= din_r2;
din_r4 <= din_r3; din_r4 <= din_r3;
din_r5 <= din_r4;
end end
else else
begin begin
@ -239,9 +243,10 @@ always @(posedge clk or negedge rstn)
din_r2 <= din_r2; din_r2 <= din_r2;
din_r3 <= din_r3; din_r3 <= din_r3;
din_r4 <= din_r4; din_r4 <= din_r4;
din_r5 <= din_r5;
end end
assign Ysum = dout_0 + dout_1 + dout_2 + dout_3 + dout_4 + dout_5 + din_r4; assign Ysum = dout_0 + dout_1 + dout_2 + dout_3 + dout_4 + dout_5 + din_r5;
always@(posedge clk or negedge rstn) always@(posedge clk or negedge rstn)
if (!rstn)begin if (!rstn)begin

View File

@ -47,6 +47,7 @@ parameter integer A_width = 8;
parameter integer B_width = 8; parameter integer B_width = 8;
parameter integer C_width = 8; parameter integer C_width = 8;
parameter integer D_width = 8; parameter integer D_width = 8;
parameter integer frac_coef_width = 31;//division
input rstn; input rstn;
input clk; input clk;
@ -56,8 +57,8 @@ input signed [B_width-1:0] b;
input signed [C_width-1:0] c; input signed [C_width-1:0] c;
input signed [D_width-1:0] d; input signed [D_width-1:0] d;
output signed [A_width+C_width-22:0] Re; output signed [A_width+C_width-frac_coef_width-1:0] Re;
output signed [A_width+D_width-22:0] Im; output signed [A_width+D_width-frac_coef_width-1:0] Im;
wire signed [A_width+C_width-1:0] ac; wire signed [A_width+C_width-1:0] ac;
wire signed [B_width+D_width-1:0] bd; wire signed [B_width+D_width-1:0] bd;
@ -107,7 +108,7 @@ always@(posedge clk or negedge rstn)
Im_tmp <= Im_tmp; Im_tmp <= Im_tmp;
end end
assign Re = Re_tmp[A_width+D_width-1:20]; assign Re = Re_tmp[A_width+D_width-1:frac_coef_width];
assign Im = Im_tmp[A_width+D_width-1:20]; assign Im = Im_tmp[A_width+D_width-1:frac_coef_width];
endmodule endmodule

View File

@ -85,30 +85,30 @@ input [1:0] intp_mode;
input [1:0] dac_mode_sel; input [1:0] dac_mode_sel;
input signed [15:0] din_re; input signed [15:0] din_re;
input signed [15:0] din_im; input signed [15:0] din_im;
input signed [36:0] a0_re; input signed [31:0] a0_re;
input signed [36:0] a0_im; input signed [31:0] a0_im;
input signed [20:0] b0_re; input signed [31:0] b0_re;
input signed [20:0] b0_im; input signed [31:0] b0_im;
input signed [36:0] a1_re; input signed [31:0] a1_re;
input signed [36:0] a1_im; input signed [31:0] a1_im;
input signed [20:0] b1_re; input signed [31:0] b1_re;
input signed [20:0] b1_im; input signed [31:0] b1_im;
input signed [36:0] a2_re; input signed [31:0] a2_re;
input signed [36:0] a2_im; input signed [31:0] a2_im;
input signed [20:0] b2_re; input signed [31:0] b2_re;
input signed [20:0] b2_im; input signed [31:0] b2_im;
input signed [36:0] a3_re; input signed [31:0] a3_re;
input signed [36:0] a3_im; input signed [31:0] a3_im;
input signed [20:0] b3_re; input signed [31:0] b3_re;
input signed [20:0] b3_im; input signed [31:0] b3_im;
input signed [36:0] a4_re; input signed [31:0] a4_re;
input signed [36:0] a4_im; input signed [31:0] a4_im;
input signed [20:0] b4_re; input signed [31:0] b4_re;
input signed [20:0] b4_im; input signed [31:0] b4_im;
input signed [36:0] a5_re; input signed [31:0] a5_re;
input signed [36:0] a5_im; input signed [31:0] a5_im;
input signed [20:0] b5_re; input signed [31:0] b5_re;
input signed [20:0] b5_im; input signed [31:0] b5_im;
output signed [15:0] dout0; output signed [15:0] dout0;
output signed [15:0] dout1; output signed [15:0] dout1;

View File

@ -1,6 +0,0 @@
%%% so means original, s_mean means mean value
function [s,s_mean] = MeanIntp(s,s_r1)
s_mean = (s+s_r1)/2;
end

View File

@ -1,35 +0,0 @@
function out = MyIIR(a,b,x,YStartState,sel_double)
len = length(x);
switch sel_double
case 0
x = int64(x);
a = int64(a);
b = int64(b);
y(1) = int64(YStartState);
case 1
x = double(x);
a = double(a);
b = double(b);
y(1) = double(YStartState);
end
switch sel_double
case 0
for i = 1:len-1
y_tmp(i+1) = a*x(i+1) - b*y(i)';
y(i+1) = bitsra(y_tmp(i+1),20) + bitget(y_tmp(i+1),64);
end
out = bitsra(y,16);
case 1
for i = 1:len-1
y_tmp(i+1) = floor(a*x(i+1) - b*y(i)');
y(i+1) = floor(y_tmp(i+1)/2^20) + bitget(int64(y_tmp(i+1)),64);
end
out = floor(y/2^16);
end

View File

@ -1,31 +0,0 @@
clc;clear;close all
%%%verification of single IIR Filter by comparing matlab and verilog
cd('/data/work/thfu/TailCorr/script_m');
a = 13740916;
b = -1047703;
y(1) = 0;
sel_double = 0;
switch sel_double
case 0
iir_in = int64(importdata("/home/thfu/work/TailCorr/v02/sim/in") -32768);
iir_out = int64(importdata("/home/thfu/work/TailCorr/v02/sim/out") -32768);
case 1
iir_in = double(importdata("/home/thfu/work/TailCorr/v02/sim/in") -32768);
iir_out = double(importdata("/home/thfu/work/TailCorr/v02/sim/out") -32768);
end
Script_out = MyIIR(a,b,iir_in,y(1),sel_double)';
y_revised = iir_in + Script_out;
tau = finddelay(y_revised,iir_out);
Script_outPhi = cat(1,zeros(1,tau)',Script_out(1:end-tau,1));
n = 1:length(iir_in);
diff = iir_out(n)-Script_outPhi(n);
diff_plot(iir_out, Script_outPhi)
tau

View File

@ -1,45 +0,0 @@
%%%verification of polyphase structures using trig
clc;clear all;close all
fs = 1e8;
t = (0:1:1e2)'/fs;
% f = 20e6;
% s = sin(2*pi*f*t);
s = triang(1e2-1);
s = [zeros(1,10) s' zeros(1,10)]';
N = length(s);
ts = (0:1:N-1)'/fs;
%%%
s_r1 = [0 s(1:end-1,1)']';
[s2,s2_mean] = MeanIntp(s,s_r1);
s_intp2 = zeros(2*N,1);
s_intp2(1:2:2*N) = s2_mean;
s_intp2(2:2:2*N) = s2;
t_intp2 = (0:1:2*N-1)'/fs/2;
%%%
s2_r1 = [0 s2(1:end-1,1)']';
[s4_4,s4_3] = MeanIntp(s2,s2_mean);
[s4_2,s4_1] = MeanIntp(s2_mean,s2_r1);
s_intp4 = zeros(4*N,1);
s_intp4(1:4:4*N) = s4_1;
s_intp4(2:4:4*N) = s4_2;
s_intp4(3:4:4*N) = s4_3;
s_intp4(4:4:4*N) = s4_4;
t_intp4 = (0:1:4*N-1)'/fs/4;
figure('Units','normalized','Position',[0.000390625,0.517361111111111,0.49921875,0.422916666666667]);
plot(ts,s,t_intp2,s_intp2)
grid on
% xlim([0.58 0.62]*1e-6)
%
%
figure('Units','normalized','Position',[0.500390625,0.517361111111111,0.49921875,0.422916666666667]);
plot(t_intp4,s_intp4)
grid on
% xlim([0.58 0.62]*1e-6)

View File

@ -1,27 +0,0 @@
function out = TailCorr(alpha,beta,iir_in,YStartState,sel_double)
len = length(iir_in);
N = length(alpha);
iir_inR1 = cat(1,0,iir_in(1:end-1,1));
diff = iir_in - iir_inR1;
Ystart = YStartState;
for i = 1:1:N
y(1:len,i) = MyIIR(alpha(i),beta(i),diff,Ystart,sel_double);
y = floor(y);
end
switch sel_double
case 0
y_sum = int64(sum(y,2));
case 1
y_sum = double(sum(y,2));
end
out = iir_in+y_sum;

View File

@ -1,63 +0,0 @@
%%%2024-10-15
%%%verification 8 linear interpolation result by comparing matlab and verilog result
clc;clear;close all
cd('/data/work/thfu/TailCorr/script_m');
sel_double = 0;
switch sel_double
case 0
iir_in_verilog = int64(importdata("/home/thfu/work/TailCorr/sim/in.dat") - 32768);
% iir_out_x1 = int64(importdata("/home/thfu/work/TailCorr/sim/X1_data.dat") -32768);
% iir_out_x2 = int64(importdata("/home/thfu/work/TailCorr/sim/X2_data.dat") -32768);
% iir_out_x4 = int64(importdata("/home/thfu/work/TailCorr/sim/X4_data.dat") -32768);
iir_out_verilog_x8 = int64(importdata("/home/thfu/work/TailCorr/sim/X8_data.dat") -32768);
case 1
iir_in = double(importdata("/home/thfu/work/TailCorr/sim/in") + 0);
iir_out_x1 = double(importdata("/home/thfu/work/TailCorr/sim/X1_data.dat") - 32768);
iir_out_x2 = double(importdata("/home/thfu/work/TailCorr/sim/X2_data.dat") - 32768);
iir_out_x4 = double(importdata("/home/thfu/work/TailCorr/sim/X4_data.dat") - 32768);
iir_out_x8 = double(importdata("/home/thfu/work/TailCorr/sim/X8_data.dat") - 32768);
end
% iir_out_x1 = [iir_out_x1' zeros(1,2)]';
% iir_out_x2 = [iir_out_x2' zeros(1,3)]';
% iir_out_x4 = [iir_out_x4' zeros(1,6)]';
alpha = [1757225200, 1045400392, 13740916];
beta = -[1042856 1046395 1047703];
Ystart = 0;
y_revised_matlab = TailCorr(alpha,beta,iir_in_verilog,Ystart,sel_double);
N = length(y_revised_matlab);
x1 = (1:1:N)';
x8 = (1:1/8:N+1-1/8)';
y_revised_intp8_matlab = int64(interp1(x1,double(y_revised_matlab),x8,'linear'));
%%%
%tau0 = finddelay(y_revised_matlab,iir_out_x1);
%y_revisedPhi0 = cat(1,zeros(1,tau0)',y_revised_matlab(1:end-tau0,1));
%figure('Units','normalized','Position',[0.500390625,0.517361111111111,0.49921875,0.422916666666667]);
%diff_plot(iir_out_x1, y_revisedPhi0,'verdi','matlab',[200 N]);
%%%
%tau2 = finddelay(s_intp2,iir_out_x2);
%y_revisedPhi2 = cat(1,zeros(1,tau2)',s_intp2(1:end-tau2,1));
%figure('Units','normalized','Position',[0.500390625,0.517361111111111,0.49921875,0.422916666666667]);
%diff_plot(iir_out_x2, y_revisedPhi2,'verdi','matlab',[0 4e4])
%%%
%tau4 = finddelay(s_intp4,iir_out_x4);
%y_revisedPhi4 = cat(1,zeros(1,tau4)',s_intp4(1:end-tau4,1));
%figure('Units','normalized','Position',[0.000390625,0.034027777777778,0.49921875,0.422916666666667]);
%diff_plot(iir_out_x4, y_revisedPhi4,'verdi','matlab',[0 8e4])
%%%
tau8 = finddelay(y_revised_intp8_matlab,iir_out_verilog_x8);
y_revisedPhi8 = cat(1,zeros(1,tau8)',y_revised_intp8_matlab(1:end-tau8,1));
figure('Units','normalized','Position',[0.000390625,0.517361111111111,0.49921875,0.422916666666667]);
diff_plot(iir_out_verilog_x8, y_revisedPhi8,'verdi','matlab',[400 800]);

60
script_m/TailCorr_Test.m Normal file
View File

@ -0,0 +1,60 @@
%in+iir_out with 8 intp
clc;clear;close all
in = importdata("/home/thfu/work/TailCorr/sim/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(2:end)+ 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(154: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);
%%
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);
fprintf('a_fix is %d\n',a_fix);
fprintf('b_fix is %d\n',b_fix);

View File

@ -1,27 +0,0 @@
clc;clear;close all
cd('/data/work/thfu/TailCorr/script_m');
sel_double = 1;
switch sel_double
case 0
iir_in = int64(importdata("/home/thfu/work/TailCorr/v02/sim/in") -32768);
iir_out = int64(importdata("/home/thfu/work/TailCorr/v02/sim/out") -32768);
case 1
iir_in = double(importdata("/home/thfu/work/TailCorr/v02/sim/in") -32768);
iir_out = double(importdata("/home/thfu/work/TailCorr/v02/sim/out") -32768);
end
alpha = [1757225200, 1045400392, 13740916];
beta = -[1042856 1046395 1047703];
Ystart = 0;
y_revised = TailCorr(alpha,beta,iir_in,Ystart,sel_double);
tau = finddelay(y_revised,iir_out);
y_revisedPhi = cat(1,zeros(1,tau)',y_revised(1:end-tau,1));
diff_plot(iir_out, y_revisedPhi,'verdi','matlab',[0 1e4])

View File

@ -1,73 +0,0 @@
%%%20241009,comparing matlab and verilog result
clc;clear;close all
cd('/data/work/thfu/TailCorr/script_m');
sel_double = 1;
switch sel_double
case 0
iir_in = int64(importdata("/home/thfu/work/TailCorr/Test/sim/in") -32768);
iir_out_x1 = int64(importdata("/home/thfu/work/TailCorr/Test/sim/X1_data.dat") -32768);
iir_out_x2 = int64(importdata("/home/thfu/work/TailCorr/Test/sim/X2_data.dat") -32768);
iir_out_x4 = int64(importdata("/home/thfu/work/TailCorr/Test/sim/X4_data.dat") -32768);
case 1
iir_in = double(importdata("/home/thfu/work/TailCorr/Test/sim/in") + 0);
iir_out_x1 = double(importdata("/home/thfu/work/TailCorr/Test/sim/X1_data.dat") - 32768);
iir_out_x2 = double(importdata("/home/thfu/work/TailCorr/Test/sim/X2_data.dat") - 32768);
iir_out_x4 = double(importdata("/home/thfu/work/TailCorr/Test/sim/X4_data.dat") - 32768);
end
% iir_out_x1 = [iir_out_x1' zeros(1,2)]';
% iir_out_x2 = [iir_out_x2' zeros(1,3)]';
% iir_out_x4 = [iir_out_x4' zeros(1,6)]';
alpha = [1757225200, 1045400392, 13740916];
beta = -[1042856 1046395 1047703];
Ystart = 0;
y_revised = TailCorr(alpha,beta,iir_in,Ystart,sel_double);
s = round(y_revised);
N = length(s);
s_r1 = [0 s(1:end-1,1)']';
[s2,s2_mean] = MeanIntp(s,s_r1);
s2 = floor(s2);
s2_mean = floor(s2_mean);
s2_r1 = [0 s2(1:end-1,1)']';
[s4_4,s4_3] = MeanIntp(s2,s2_mean);
[s4_2,s4_1] = MeanIntp(s2_mean,s2_r1);
s4_1 = floor(s4_1);
s4_2 = floor(s4_2);
s4_3 = floor(s4_3);
s4_4 = floor(s4_4);
s_intp2 = zeros(2*N,1);
s_intp2(1:2:2*N) = s2_mean;
s_intp2(2:2:2*N) = s2;
s_intp4 = zeros(4*N,1);
s_intp4(1:4:4*N) = s4_1;
s_intp4(2:4:4*N) = s4_2;
s_intp4(3:4:4*N) = s4_3;
s_intp4(4:4:4*N) = s4_4;
%%%
tau1 = finddelay(y_revised,iir_out_x1);
y_revisedPhi1 = cat(1,zeros(1,tau1)',y_revised(1:end-tau1,1));
figure('Units','normalized','Position',[0.000390625,0.517361111111111,0.49921875,0.422916666666667]);
diff_plot(iir_out_x1, y_revisedPhi1,'verdi','matlab',[0 2e4])
tau2 = finddelay(s_intp2,iir_out_x2);
y_revisedPhi2 = cat(1,zeros(1,tau2)',s_intp2(1:end-tau2,1));
figure('Units','normalized','Position',[0.500390625,0.517361111111111,0.49921875,0.422916666666667]);
diff_plot(iir_out_x2, y_revisedPhi2,'verdi','matlab',[0 4e4])
tau4 = finddelay(s_intp4,iir_out_x4);
y_revisedPhi4 = cat(1,zeros(1,tau4)',s_intp4(1:end-tau4,1));
figure('Units','normalized','Position',[0.000390625,0.034027777777778,0.49921875,0.422916666666667]);
diff_plot(iir_out_x4, y_revisedPhi4,'verdi','matlab',[0 8e4])

View File

@ -6,7 +6,8 @@ Script_out = Script_out(1:N);
n = 0:1:N-1; n = 0:1:N-1;
diff = iir_out-Script_out; diff = iir_out-Script_out;
subplot(211) tiledlayout(2,1)
ax1 = nexttile;
plot(n,iir_out,n,Script_out) plot(n,iir_out,n,Script_out)
xlabel('n') xlabel('n')
legend(leg1,leg2) legend(leg1,leg2)
@ -14,15 +15,20 @@ xlim(a)
title('time domain') title('time domain')
grid on grid on
subplot(212) ax2 = nexttile;
plot(n,diff) plot(n,diff)
xlabel('n') xlabel('n')
title('diff') title('diff')
grid on grid on
hold on hold on
xlim(a) xlim(a)
linkaxes([ax1,ax2],'x');
[diff_max,R_mpos] = max(abs(diff)); [~,R_mpos_max] = max(diff);
plot(n(R_mpos),diff(R_mpos),'r*') [~,R_mpos_min] = min(diff);
text(n(R_mpos), diff(R_mpos), ['(',num2str(n(R_mpos)),',',num2str(diff(R_mpos)),')'],'color','k');
% max(abs(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');

View File

@ -1,21 +0,0 @@
%%%2024-10-17,verify 8 intp by comparing matlab and verilog
clc;clear all;close all;
in = importdata("/home/thfu/work/TailCorr/sim/in_intp8.dat");
intp8_verilog = importdata("/home/thfu/work/TailCorr/sim/out_intp8.dat");
N = length(in);
time = 1:1:N;
time8 = 1:1/8:N+1-1/8;
intp8_matlab = floor(interp1(time,in,time8,'linear'))';
%figure
%plot(time,in);
%hold on
%plot(time8,intp8_verilog);
%xlim([4500 5500])
tau8 = finddelay(intp8_matlab(1.8e4:3e4),intp8_verilog(1.8e4:3e4));
intp8_matlab_revised = cat(1,zeros(1,tau8)',intp8_matlab(1:end-tau8,1));
figure('Units','normalized','Position',[0.000390625,0.517361111111111,0.49921875,0.422916666666667]);
diff_plot(intp8_verilog, intp8_matlab_revised,'verdi','matlab',[2e4 2.2e4]);

View File

@ -54,6 +54,15 @@ reg clk;
reg clk_div2; reg clk_div2;
reg clk_div4; 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 initial
begin begin
#0; #0;
@ -64,29 +73,33 @@ begin
en = 1'b0; en = 1'b0;
din_im = 16'd0; din_im = 16'd0;
a0_re = 32'd1757225200;
a0_im = 32'd0; a0_re = 32'd55007237 ;
b0_re = -32'd1042856; a1_re = 32'd32690030 ;
b0_im = 32'd0; a2_re = 32'd429516;
a1_re = 32'd1045400392;
a1_im = 32'd0;
b1_re = -32'd1046395;
b1_im = 32'd0;
a2_re = 32'd13740916;
a2_im = 32'd0;
b2_re = -32'd1047703;
b2_im = 32'd0;
a3_re = 32'd0; a3_re = 32'd0;
a3_im = 32'd0;
b3_re = -32'd0;
b3_im = 32'd0;
a4_re = 32'd0; a4_re = 32'd0;
a4_im = 32'd0;
b4_re = -32'd0;
b4_im = 32'd0;
a5_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; a5_im = 32'd0;
b5_re = -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; b5_im = 32'd0;
fcw = 48'h0840_0000_0000; fcw = 48'h0840_0000_0000;
@ -551,123 +564,22 @@ always@(*)
wire [15:0] diff; wire [15:0] diff;
assign diff = cs_wave1 - cs_wave; assign diff = cs_wave1 - cs_wave;
integer signed In_fid; integer signed In_fid;
integer X1_fid; integer signed OrgOut_fid;
integer X2_fid;
integer X4_fid;
integer X8_fid;
initial begin initial begin
#0; #0;
In_fid = $fopen("./in.dat"); In_fid = $fopen("./in.dat") ;
case (intp_mode) OrgOut_fid = $fopen("./OrgOut.dat");
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 end
always@(posedge clk_div16_f) always@(posedge clk_div32_f)
if(cnt >= 90) if(cnt >= 90) begin
$fwrite(In_fid,"%d\n",{{{~iir_in[15]}},iir_in[14:0]}); $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 ));
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",{{{dout_p0[15]}},dout_p0[14:0]});
@(posedge clk_div32_d)
if(cnt >= 90)
$fwrite(X8_fid,"%d\n",{{{dout_p1[15]}},dout_p1[14:0]});
@(posedge clk_div32_b)
if(cnt >= 90)
$fwrite(X8_fid,"%d\n",{{{dout_p2[15]}},dout_p2[14:0]});
@(posedge clk_div32_9)
if(cnt >= 90)
$fwrite(X8_fid,"%d\n",{{{dout_p3[15]}},dout_p3[14:0]});
@(posedge clk_div32_7)
if(cnt >= 90)
$fwrite(X8_fid,"%d\n",{{{dout_p4[15]}},dout_p4[14:0]});
@(posedge clk_div32_5)
if(cnt >= 90)
$fwrite(X8_fid,"%d\n",{{{dout_p5[15]}},dout_p5[14:0]});
@(posedge clk_div32_3)
if(cnt >= 90)
$fwrite(X8_fid,"%d\n",{{{dout_p6[15]}},dout_p6[14:0]});
@(posedge clk_div32_1)
if(cnt >= 90)
$fwrite(X8_fid,"%d\n",{{{dout_p7[15]}},dout_p7[14:0]});
end 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(X4_fid,"%d\n",{{~{dout_p3[15]}},dout_p3[14:0]});
*/
endmodule endmodule