論理回路デザイン
ArchiTek home page
コーディング

トップモジュール

/* **************************** MODULE PREAMBLE ********************************

	Copyright (c) 2012, ArchiTek
	This document constitutes confidential and proprietary information
	of ArchiTek. All rights reserved.
*/

// ***************************** MODULE HEADER *********************************
// ----------------------------------------------------------------- 
// CICフィルタモジュール 
//   積分フィルタ+デシメーション+微分フィルタ+デシメーションを行う
//   以下パラメータにて構成を変更する
// ----------------------------------------------------------------- 
module comCIC(
	iData,
	oData,
	clk,
	oClk,
	reset
	);

// ************************ PARAMETER DECLARATIONS *****************************
// -----------------------------------------------------------------
//   パラメータは下位モジュールに引き渡す                       
//   パラメータの整合性チェックは行われないので間違いのないように   
//   上位より指定する必要がある                               
// -----------------------------------------------------------------

	// -----------------------------------------------------------------
	// カスケードした積分・微分フィルタのタップ数を指定           
	// -----------------------------------------------------------------
	parameter	TAP_NUM		= 3;

	// -----------------------------------------------------------------
	// 微分フィルタの遅延数を指定                                 
	// 通常 1か2                                                  
	// -----------------------------------------------------------------
	parameter	DELAY_NUM	= 1;

	// -----------------------------------------------------------------
	// CICフィルタ内部でのデータビット幅を指定
	// ビット幅の計算は以下に従って計算します                           
	//      BIT_W = Data bit + TAP_NUM * log2(RE_SAMP * DELAY_NUM)   
	// 入力データのビットが8ビット                                     
	// TAP数が3 (TAP_NUM=3)                                            
	// 積分・微分フィルタの間にあるデシメーション 1/4                   
	//     なお、RE_SAMPの本moduleへの指定は clkとoClkの周波数比に  
	//     よって行う                                               
	//     今回上位モジュールでoClkをclkの1/4にしている         
	// 微分フィルタ遅延数が1(DELAY_NUM=1)                               
	// BIT_W = 8   + 3       * log2(4 * 1)                     
	//       = 8 + 3 * 2 = 8 + 6 = 14                             
	// -----------------------------------------------------------------
	parameter	BIT_W		= 14;

// ***************************** I/O DECLARATIONS ******************************
	input	[BIT_W-1:0]	iData;		// 入力データ
	output	[BIT_W-1:0]	oData;		// 出力データ
	input			clk;		// クロック
	input			oClk;		// デシメーション用クロック
	input			reset;		// リセット

// **************************** LOCAL DECLARATIONS *****************************
	wire	[BIT_W-1:0]	integDat;	// 積分フィルタ→微分フィルタ
	wire	[BIT_W-1:0]	diffDat;	// 微分フィルタ→デシメーション

// ****************************** MODULE BODY **********************************
	// ---------- Integration Block ------------
	// -----------------------------------------------------------------
	// 積分フィルタブロック                                             
	//   本ブロックの内部でタップ数分カスケードする               
	// -----------------------------------------------------------------
	comCIC_integration
		#(TAP_NUM, BIT_W)
	integSub(
		.iData		(iData),
		.oData		(integDat),
		.clk		(clk),
		.reset		(reset)
		);

	// ---------- Differentiation Block ------------
	// -----------------------------------------------------------------
	// 微分フィルタブロック                                             
	//   本ブロックの内部でタップ数分カスケードしている               
	//   またクロックをoClkを入れることでデシメーションする       
	// -----------------------------------------------------------------
	comCIC_differentiation
		#(TAP_NUM, DELAY_NUM, BIT_W)
	diffSub(
		.iData		(integDat),
		.oData		(diffDat),
		.clk		(oClk),
		.reset		(reset)
		);

	assign oData = diffDat;

endmodule
// *****************************************************************************
        

トップモジュール図

         
CSA A

積分モジュール

/* **************************** MODULE PREAMBLE ********************************

	Copyright (c) 2011, ArchiTek
	This document constitutes confidential and proprietary information
	of ArchiTek. All rights reserved.
*/

// ***************************** MODULE HEADER *********************************
// -----------------------------------------------------------------
// 積分フィルタモジュール                                           
//   パラメータのTAP_NUMでカスケードする数を指定される             
// -----------------------------------------------------------------
module comCIC_integration(
	iData,
	oData,
	clk,
	reset
	);

// ************************ PARAMETER DECLARATIONS *****************************
	parameter	TAP_NUM		= 3;
	parameter	BIT_W		= 14;

// ***************************** I/O DECLARATIONS ******************************
	input	[BIT_W-1:0]	iData;
	output	[BIT_W-1:0]	oData;
	input			clk;
	input			reset;

// **************************** LOCAL DECLARATIONS *****************************
	// -----------------------------------------------------------------
	// 積分フィルタのタップから出力された結果を保持する               
	// 次データ処理時に前回結果として利用している                       
	// -----------------------------------------------------------------
	reg	[BIT_W-1:0]	sumData[0:TAP_NUM-1];

	// -----------------------------------------------------------------
	// タップ数をfor文で記述するためのカウンタ                         
	// -----------------------------------------------------------------
	integer			i;

// ****************************** MODULE BODY **********************************
	// ------------------------------------------------- 
	// 入力データとひとつ前の結果との加算処理            
	// ------------------------------------------------- 
	always @(posedge clk)
		if(reset)
			// -------------------------------------------------
			// リセット時の初期化                               
			// -------------------------------------------------
			for(i=0 ; i < TAP_NUM ; i=i+1)
				sumData[i] <= #1 {BIT_W{1'b0}};
		else begin
			// -------------------------------------------------
			// 一つ目は入力データと前回の結果を加算             
			// -------------------------------------------------
			sumData[0] <= iData + sumData[0];

			// -------------------------------------------------
			// 二つ目移行は前のタップの結果と前回の結果を加算   
			// -------------------------------------------------
			for(i=1 ; i < TAP_NUM ; i=i+1)
				sumData[i] <= #1 sumData[i-1] + sumData[i];
		end

	// -------------------------------------------------
	// 最後タップの結果を出力                           
	// -------------------------------------------------
	assign oData = sumData[TAP_NUM-1];

endmodule
// *****************************************************************************
        

積分モジュール図

         
CSA A

微分モジュール

/* **************************** MODULE PREAMBLE ********************************

	Copyright (c) 2011, ArchiTek
	This document constitutes confidential and proprietary information
	of ArchiTek. All rights reserved.
*/

// ***************************** MODULE HEADER *********************************
// -----------------------------------------------------------------
// 微分フィルタモジュール                                           
//   パラメータのTAP_NUMでカスケードする数を指定される
// -----------------------------------------------------------------
module comCIC_differentiation(
	iData,
	oData,
	clk,
	reset
	);

// ************************ PARAMETER DECLARATIONS *****************************
	parameter	TAP_NUM		= 3;
	parameter	DELAY_NUM	= 1;

	parameter	BIT_W		= 14;
	
// ***************************** I/O DECLARATIONS ******************************
	input	[BIT_W-1:0]	iData;
	output	[BIT_W-1:0]	oData;
	input			clk;
	input			reset;

// **************************** LOCAL DECLARATIONS *****************************
	// -----------------------------------------------------------------
	// 微分フィルタのタップから出力された結果を保持する               
	// 次データ処理時に前回結果として利用される                       
	// -----------------------------------------------------------------
	reg	[BIT_W-1:0]	diffData[0:TAP_NUM-1];

	// -----------------------------------------------------------------
	// 遅延するためデータを保持する                                   
	// タップ数と遅延分の2次元配列となる   
	// -----------------------------------------------------------------
	reg	[BIT_W-1:0]	delayData[0:TAP_NUM-1][0:DELAY_NUM-1];

	// -----------------------------------------------------------------
	// タップ数をfor文で記述するためのカウンタ                         
	// -----------------------------------------------------------------
	integer			i;

	// -----------------------------------------------------------------
	// 遅延データをfor文で記述するためのカウンタ                       
	// -----------------------------------------------------------------
	integer			j;

// ****************************** MODULE BODY **********************************
	// -------------------------------------------------
	// 遅延処理処理                                     
	// -------------------------------------------------
	// --------- Delay ---------
	always @(posedge clk or negedge reset_n)
		if(reset)
			// -------------------------------------------------
			// リセット時の遅延データ初期化                     
			// -------------------------------------------------
			for(i=0 ; i < TAP_NUM ; i=i+1)
				for(j=0 ; j < DELAY_NUM ; j=j+1)
					delayData[i][j] <= #1 {BIT_W{1'b0}};
		else begin
			// -------------------------------------------------
			// 遅延データの格納                                 
			// -------------------------------------------------
			for(i=0 ; i < TAP_NUM ; i=i+1) begin
				if(i == 0)
				// -----------------------------------------
				// 一つ目のタップの入力は入力データ         
				// -----------------------------------------
					delayData[i][0] <= #1 iData;
				else
				// -----------------------------------------
				// 二つ目以降のタップの入力は前のタップの結果
				// -----------------------------------------
					delayData[i][0] <= #1 diffData[i-1];

				// -----------------------------------------
				// 遅延分ループ                             
				// -----------------------------------------
				for(j=1 ; j < DELAY_NUM ; j=j+1)
					delayData[i][j] <= #1 delayData[i][j-1];
			end
		end

	// -------------------------------------------------
	// 入力データとひとつ前の結果との減算処理           
	// -------------------------------------------------
	// --------- Diff ---------
	always @(posedge clk or negedge reset_n)
		if(reset)
			// -------------------------------------------------
			// リセット時の結果データ初期化                     
			// -------------------------------------------------
			for(i=0 ; i < TAP_NUM ; i=i+1)
				diffData[i] <= #1 {BIT_W{1'b0}};
		else begin
			// -------------------------------------------------
			// 一つ目は入力データと前回の結果を減算             
			// -------------------------------------------------
			diffData[0] <= #1 iData - delayData[0][DELAY_NUM-1];

			// -------------------------------------------------
			// 二つ目移行は前のタップの結果と遅延させたものを減算
			// -------------------------------------------------
			for(i=1 ; i < TAP_NUM ; i=i+1)
				diffData[i] <= #1 diffData[i-1] 
						- delayData[i][DELAY_NUM-1];
		end

	// -------------------------------------------------
	// 最後タップの結果を出力                           
	// -------------------------------------------------
	assign oData = diffData[TAP_NUM-1];

endmodule
// *****************************************************************************
        

微分モジュール図

         
CSA A

回路デザイン > 設計例 [CICフィルタ] > コーディング    次のページ(テスト・考察)   このページのTOP ▲