論理回路デザイン
ArchiTek home page
CSAについて[1]

CSAの概要

CSAのオーバーフロー問題

CSAによる減算

CSAコード

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

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

// ***************************** MODULE HEADER *********************************
//
// 通常形式の値とCSA形式の値を足すためのmodule
//  CSA形式の値+通常の値=CSA形式の値
//

module CSA (
	iA,
	iB,

	oY

	);

// ************************ PARAMETER DECLARATIONS *****************************

	parameter		W	= 4;		// 通常形式のビット幅

// *************************** I/O DECLARATIONS ********************************

	// Input
	input	[W*2-1:0]	iA;			// CSA形式の入力値 A
                                                        // ビット幅は通常形式の2倍
	input	[W-1:0]		iB;			// 通常形式の入力値 B

	// Output
	output	[W*2-1:0]	oY;			// CSA形式の出力値
                                                        // ビット幅は通常形式の2倍

// ************************** LOCAL DECLARATIONS *******************************

// ****************************** MODULE BODY **********************************
//実際の処理はCSAFuncで行う
assign oY		= CSAFunc(iA, iB);

// ************************** FUNCTIONS and TASKS ******************************

function [W*2-1:0] CSAFunc;
	input	[W*2-1:0]	opA;
	input	[W-1:0]		opB;
	reg	[1:0]		result[0:W-1];
	reg	[1:0]		tmp;
	integer			i;

	begin
                // 0ビット目の加算結果をresultに入れる
                // 0bit目はCarryはない
		result[0]	= {1'd0, opA[0]}
				+ {1'd0, opB[0]};

                // 1ビット目以降の加算結果をresultに入れる
                // 1ビット目以降は一つ前のCarryと値AとBのValueを加算
		for (i=1; i < W; i=i+1)
			result[i]	= {1'd0, opA[i*2-1]}
					+ {1'd0, opA[i*2]}
					+ {1'd0, opB[i]};

                // resultをCSA形式に詰めなおす
		for (i=0; i < W; i=i+1) begin
			tmp		= result[i];

			CSAFunc[i*2+1]	= tmp[1];
			CSAFunc[i*2]	= tmp[0];
		end
	end
endfunction

endmodule

// *****************************************************************************


        

CSA形式 ⇔ 通常形式 変換コード

//
// 通常の値をCSA形式に変換するfunction
//
function [CSA_BIT_W-1:0] bin2csaFunc;
	input	[BIT_W-1:0]	data;
	integer			i;

	begin
		for(i=0 ; i < BIT_W ; i=i+1) begin
			bin2csaFunc[i*2] = data[i];     // Value部分に値を入れる
			bin2csaFunc[i*2+1] = 1'b0;      // Carry部分には0を入れる
		end
	end

endfunction


//
// CSA形式の値を通常の値に変換するfunction
//
function [BIT_W-1:0] csa2binFunc;
	input	[CSA_BIT_W-1:0]		data;
	reg	[BIT_W-1:0]		carry;
	reg	[BIT_W-1:0]		value;
	integer			i;

	begin
		for (i=0; i < BIT_W; i=i+1) begin
			carry[i]	= data[i*2+1];     // Carry部分を取り出す
			value[i]	= data[i*2];       // Value部分を取り出す
		end

		// Carry部分を左に1bitシフトしてValueと足す
		csa2binFunc	= {carry[BIT_W-2:0], 1'b0} + value;
	end
endfunction


        

回路デザイン > テクニック > 高速演算    次のページ(パイプラインフィードバック)    このページのTOP ▲

[1]
高速演算にはCSA以外にも様々なものがあります。今後この章に追加していきたいと考えています。
[2]
参考資料:
・ウィキペディア 加算器
・ウィキペディア 桁上げ保存加算器

[3]
CSAによる減算処理にもオーバーフロー問題があることに注意が必要です