【ハウツー】

ALUにおけるボローフラグを考える

1 足し算と引き算の回路を別に作ると"もったいない"設計になる

    田中範明(noritan.org)  [2009/12/24]

    CPUの引き算命令では、ボローフラグが使用されており、大概、キャリーフラグで代用されます。6800では、「ボロー有り」の時にキャリーフラグが1になります。ところが、6502の場合には、「ボロー有り」の時にキャリーフラグが0になります。この違いは、どこから来たのでしょうか。

    ボローの存在

    小学校の算数で筆算により引き算を行う時、被減数(引かれる数:minuend)が減数(引く数:subtrahend)よりも大きいときには、上の桁から10借りてきます。CPUでも同じように上の桁に借りを作ることがあり、「ボロー」(借り:borrow)と呼んでいます。

    ボローは、上の桁に「借りた・借りていない」という二者択一の1ビットの情報で表現することができます。そこで、多くの場合、足し算において「上の桁への繰り上がり」を表現するためのキャリーフラグで代用されます。

    Motoloraの6800やIntelの8080の場合、「借りた」場合には、キャリーが1に設定されます。一方、MOS Technologyの6502の場合、「借りた」場合には、キャリーが0に設定されます。この違いは、なぜ、現れるのでしょうか。その理由は、ALU(算術論理演算ユニット:Arithmetic Logic Unit)の設計に関わってきます。

    ALUを作ってみよう

    一般的なCPUの場合、足し算を行う命令と引き算を行う命令が装備されています。そこで、ここでは、足し算と引き算だけを行う簡単なALUの設計を例に取り上げて、具体的に理由を探っていきます。ここで設計するALUは、2つの8ビット入力(x[7:0]、 y[7:0])の和と差を計算する装置です。

    和と差を計算するALU

    和と差の結果は、8ビットの出力(s[7:0])となります。他にキャリー入出力(Cin、 Cout)とボロー入出力(Bin、 Bout)を追加して、もっとビット数の大きな計算にも対応します。また、「和を計算するか、差を計算するか」という計算内容を指示するための入力(f)もあります。

    安易な実装

    入力"f"に従って、計算内容を切り替えるように作ればよいのだから、以下のような実装にすると解決できそうです。

    安易な実装によるALU

    2つの入力を持つ足し算回路と引き算回路を用意し、入力"f"によって出力を切り替えます。確かに簡単です。論理合成も通ることでしょう。ところが、この回路の場合、足し算回路と引き算回路が同時に使われることがありません。そのため、実装した回路のうち、半分しか使用されないという、実にもったいない構成になってしまいます。

    なぜ、この構成ではもったいないのか。それは、引き算回路の実現方法に原因があります。

    関連したタグ

    新着記事

    特設サイトの情報

      求人情報

      人気記事

      一覧

      イチオシ記事

      新着記事

      特別企画

      転職ノウハウ

      あなたの仕事適性診断

      4つの診断で、自分の適性を見つめなおそう!

      Heroes File ~挑戦者たち~

      働くこと・挑戦し続けることへの思いを綴ったインタビュー

      はじめての転職診断

      あなたにピッタリのアドバイスを読むことができます。

      転職Q&A

      転職に必要な情報が収集できます

      スカウト転職する

      企業からアプローチのメッセージが届きます。

      マイナビニュースマガジン