FPU高速化

ちょっとインターフェースとかそのあたりの問題があったりなかったりということで、faddとfsubを書き直した。正確には、faddを作っただけなのだけれども、fsubは第二引数の最上位ビットにnotを入れるだけなので、大したことはない。
で、今更なのだけれども異符号の足し算(つまりは引き算)の回路はめちゃくちゃめんどくさい。そりゃ整数では2の補数表現とか使うよなあ。下手なことすると遅いんだもん。特に、桁が減るようなとき、例えば1.0-0.99のような近い数の除算はかなりめんどくさい。どれだけシフトしてやればいいのか分からないので、ループでまわしてやる必要があったりするのだけれども、ループは基本的に遅い。VHDLのループは、同じ回路を繰り返すのだから当然遅くなってしかるべきなんだけれども、致命的になりうる。
ということで、Tipsとして書いておくと、例えば00000000010000001000000というような数があったとして、これの最上位bitが1になるようにする方法を、

for i in 0 to 22 loop
    if 1bitシフト可能かどうか then
        1bitシフトする
    end if;
end loop;

というように1bitずつシフトするのではなくて、

if 16bitシフト可能かどうか then
     16bitシフトする
end if;
if 8bitシフト可能かどうか then
     8bitシフトする
end if;
if 4bitシフト可能かどうか then
     4bitシフトする
end if;
if 2bitシフト可能かどうか then
     2bitシフトする
end if;
if 1bitシフト可能かどうか then
     1bitシフトする
end if;

と書いたほうが速くなる。この規模で10ns程度は変わる。