
コンピュータにおいて、バレルシフタとは、バイナリ入力値によって指定された可変ビット数だけデータワードをシフトできる組み合わせ論理回路である。出力ワードの空いたビットをゼロにして論理シフト演算(例えば、論理左シフト)を実行することも、設計上または1つ以上の機能選択入力によって指定されたとおりに、入力ワードのすべてのビットを回転させることもできる。
バレルシフタは、マイクロプロセッサ内でワードをシフトおよび回転するためによく使用され、[ 1 ]通常は単一のクロックサイクル内で行われます。
例えば、入力がA、B、C、Dである4ビットバレルシフタを考えてみましょう。このシフタは、ビットABCDの順序をDABC、CDAB、BCDAのように循環させることができます。この場合、ビットの損失はありません。つまり、すべての出力を最大3ビット右にシフトすることができ(したがって、A、B、C、Dの任意の循環組み合わせを作成できます)、バレルシフタは、マイクロプロセッサの有用な構成要素(ALUと並んで)として、さまざまな用途に利用できます。
バレルシフターを実装する一つの方法は、マルチプレクサのシーケンスとして構成することであり、あるマルチプレクサの出力が、シフト距離に応じて次のマルチプレクサの入力に接続される。
最速のシフタは、上記の 4 ビット シフタと同様の方法で、ただしサイズが大きいフル クロスバーとして実装されます。これらは遅延が最小限で、出力は常にシフト対象の入力より 1 ゲート遅れになります (シフト カウント デコーダが安定するのに必要なわずかな時間を考慮した後。このペナルティは、シフト カウントが変化する場合にのみ発生します)。ただし、これらのクロスバー シフタは、nビット シフトに対してn 2個のゲートを必要とします。このため、バレル シフタは、代わりに並列 2×1 マルチプレクサのカスケードとして実装されることが多く、これによりゲート数を大幅に削減でき、ゲート数はn log nに比例して増加します。伝搬遅延は大きくなり、log nに比例して増加します(クロスバー シフタのように一定ではありません)。
8ビットバレルシフタの場合、S[2]とS[1]の値に基づいて4ビットと2ビットシフトする、または同じデータを通過させる2つの中間信号が使用されます。この信号は、S[0]によって制御される別のマルチプレクサによってシフトされます。
int1 = IN 、S[2] == 0 の場合 = IN << 4、S[2] == 1 の場合 int2 = int1 、S[1] == 0 の場合 = int1 << 2、S[1] == 1 の場合 OUT = int2 、S[0] == 0 の場合 = int2 << 1、S[0] == 1 の場合
大型のバレルシフターには、追加の段階があります。
カスケード式シフターは、フルクロスバー式シフターに比べて、シフト回数のデコードロジックを必要としないという利点も備えている。
nビットワードに必要なマルチプレクサの数は[ 2 ] 一般的な5つのワードサイズと必要なマルチプレクサの数を以下に示します。
FO4におけるクリティカルパスのコスト(ワイヤ遅延なしの推定値):
バレルシフタの一般的な用途の一つは、浮動小数点演算のハードウェア実装です。浮動小数点加算または減算演算では、 2つの数値の仮数部を揃える必要があります。そのためには、小さい方の数値を右にシフトし、その指数を大きい方の数値の指数と一致するまで増やす必要があります。これは、指数を減算し、バレルシフタを使用して小さい方の数値をその差分だけ右にシフトすることで、1サイクルで実現されます。