情報画像工学実験II

プログラム作成例・解説


課題7

バレルシフタの作成例を図9に示す。

図9. バレルシフタ

このバレルシフタでは、入力Aから与えられた値が、入力値Cの値に応じシフト回路を通ったり通らなかったりしながら、最終的に出力Yに出力される。C[2]=1のとき、4ビットシフト回路、C[1]=1のとき、2ビットシフト回路、C[0]=1のとき、1ビットシフト回路を通る。例えばC=5=(101)2のとき、C[2]=1, C[0]=1 なので4ビットシフト回路と1ビットシフト回路を通る。また、C[1]=0 なので、2ビットシフト回路は通らない。結果、4+1=5ビットシフトされた値がYから出力される。

図9に基づいて作成したバレルシフタを以下に示す。ここでは論理左シフトを行うバレルシフタを示す。モジュール MULTIPLEXER は課題2 で作成したマルチプレクサ(セレクタ)回路である。モジュール MULTIPLEXER8 は8ビットバス用のマルチプレクサであり、マルチプレクサを8個並列に並べた回路である。図9中に示したように、4ビットシフト回路、2ビットシフト回路、1ビットシフト回路はゲートを用いず、配線のみで構成する。

module BARREL_SHIFTER(A, C, Y);
	input [7:0] A;
	input [2:0] C;
	output [7:0] Y;
	
	wire [7:0] AS, D, DS, E, ES;
	
	assign AS = {A[3], A[2], A[1], A[0], 1'b0, 1'b0, 1'b0, 1'b0};	
			/* 4ビットシフト回路 */
	MULTIPLEXER8 U0 (.A(A), .B(AS), .C(C[2]), .Y(D));
			/* C[2]=1 なら 4ビット左シフト */
			
	assign DS = {D[5], D[4], D[3], D[2], D[1], D[0], 1'b0, 1'b0};
			/* 2ビットシフト回路 */
	MULTIPLEXER8 U1 (.A(D), .B(DS), .C(C[1]), .Y(E));
			/* C[1]=1 なら 2ビット左シフト */
			
	assign ES = {E[6], E[5], E[4], E[3], E[2], E[1], E[0], 1'b0};
			/* 1ビットシフト回路 */
	MULTIPLEXER8 U2 (.A(E), .B(ES), .C(C[0]), .Y(Y));
			/* C[0]=1 なら 1ビット左シフト */
endmodule

module MULTIPLEXER8(A, B, C, Y);
	input [7:0] A, B;
	input C;
	output [7:0] Y;
	
	MULTIPLEXER U0 (.A(A[0]), .B(B[0]), .C(C), .Y(Y[0]));
	MULTIPLEXER U1 (.A(A[1]), .B(B[1]), .C(C), .Y(Y[1]));
	MULTIPLEXER U2 (.A(A[2]), .B(B[2]), .C(C), .Y(Y[2]));
	MULTIPLEXER U3 (.A(A[3]), .B(B[3]), .C(C), .Y(Y[3]));
	MULTIPLEXER U4 (.A(A[4]), .B(B[4]), .C(C), .Y(Y[4]));
	MULTIPLEXER U5 (.A(A[5]), .B(B[5]), .C(C), .Y(Y[5]));
	MULTIPLEXER U6 (.A(A[6]), .B(B[6]), .C(C), .Y(Y[6]));
	MULTIPLEXER U7 (.A(A[7]), .B(B[7]), .C(C), .Y(Y[7]));
endmodule

単なるシフト回路は配線のみで構成できる一方、バレルシフタは多数のマルチプレクサを含み、比較的大きな回路となる。

マルチプレクサは三項演算子 ? : を用いて記述できる。三項演算子を用いたバレルシフタの記述例を以下に示す。

module BARREL_SHIFTER(A, C, Y);
	input [7:0] A;
	input [2:0] C;
	output [7:0] Y;
	
	wire [7:0] D, E;
	
	assign D = C[2] ? {A[3:0], 4'b0000} : A;	// C[2]=1 なら 1ビット左シフト	
	assign E = C[1] ? {D[5:0],   2'b00} : D;	// C[1]=1 なら 1ビット左シフト
	assign Y = C[0] ? {E[6:0],    1'b0} : E;	// C[0]=1 なら 1ビット左シフト
endmodule

課題6でも述べたとおり、ライブラリを持っていれば >>, << 演算子を用いてバレルシフタを記述することもできる。


課題6に戻る
課題8に進む
実験II-6トップページに戻る
難波担当実験・演習のページに戻る

難波 一輝 (助教・伊藤・北神・難波研究室)
工学部1号棟4階409号室、内線3255、043-290-3255、namba@ieee.org