`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date:    16:16:47 11/03/2020 
// Design Name: 
// Module Name:    cicFirFilterTop 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//FilteredDataWidth==ceil(log2((R*M)^N)/R)+inOutDataWidth;
//
//
//////////////////////////////////////////////////////////////////////////////////
module	cicFirFilterTop	
#(
	parameter	N =	3,	//filter order
	parameter	M =	2,	//comb delay	
	parameter	R = 2,	//decim fartor
	parameter	filteredDataWidth	=	20,
	parameter	inOutDataWidth	=	18,
	parameter	decimCntWidth	=	7,
	parameter	CoeffCount		=	16
)
(
	input	Clk_i,
	input	[inOutDataWidth-1:0] Data_i,
	input	DataNd_i,
	output	[inOutDataWidth-1:0] Data_o,
	output	DataValid_o
);

wire	[filteredDataWidth-1:0]	cicFilteredData;
wire	DataNd;

cicFilter 
#(
	.N (N),	//filter order
	.M (M),	//comb delay
	.R (R),	//decim fartor
	.filteredDataWidth	(filteredDataWidth),
	.inOutDataWidth		(inOutDataWidth),
	.decimCntWidth		(decimCntWidth)
)
cicFilterInst
(
	.Clk_i			(Clk_i),
	.Data_i			(Data_i),
	.DataNd_i		(DataNd_i),
	.Data_o			(cicFilteredData),
	.DataValid_o	(DataNd)
);



systolicFilter
#(
	.CoeffCount 		(CoeffCount),
	.filteredDataWidth	(38),
	.inOutDataWidth		(filteredDataWidth),
	.decimCntWidth		(decimCntWidth)
)
systolicFilterInst
(
	.Clk_i			(Clk_i),
	.Data_i			(cicFilteredData),
	.DataNd_i		(DataNd),
	.Data_o			(Data_o),
	.DataValid_o	(DataValid_o)
);
endmodule






