「教えて!ピックアップ」リリース!

2つ数値の差を絶対値で求める適切な計算法を探しています.
2つの候補の内,回路の大きさが小さくなりそうな方はどちらですか?
また,絶対値を求める他の方法があったら教えてください。

<候補1>
X(絶対値)a1,a2(データ)

if(a1 < a2) X <= a2 - a1;
elsif (a2 > a1 ) X <= a1 -a2;
else X <= 0
<候補2>
df(N+1) 絶対値 X をビットで表現したときの最上位ビット

X <= a1-a2
X   <= ( df(N+1) xor df(N) ) &
( df(N+1) xor df(N-1) ) &
( df(N+1) xor df(N-2) ) &
・・・・・・・
( df(N+1) xor df(2) ) &
( df(N+1) xor df(1) ) &
( df(N+1) xor df(0) ) + ("000000000" & df(N+1));

A 回答 (3件)

考え方は<候補1>、回答のような1ビット演算回路をならべると、回路図が見やすそうで、規模も小さくなりそうだな、と思ったので。


<候補1>だと Nビット比較器とNビットセレクタとNビット減算器が必要な感じに見えたので、それだと無駄な配線が多くなりそうな感じがしたもので。

最近の論理合成プログラムはよくできてるそうで、プログラムのような感覚で設計できるとか。そんな環境なら、私の書いた方法はあまりやくにたたないかもしれません。
    • good
    • 0

ハードはそんなに詳しくはないのですが


絶対値の演算を論理回路を組み合わせてやりたい、ということでよろしいですか?

&,(N)は
a1: a1(N) & a1(N-1) & ...& a1(1) & a1(0)
a2: a2(N) & a2(N-1) & ...& a2(1) & a2(0)
のような構成の意味でしょうか。

入力a1(i),a2(i),cmp(i+1),sel(i+1),Carry(i-1)
出力cmp(i),sel(i),df(i),Carry(i)

cmp(i+1) =False なら
cmp(i)<= (a1(i) ≠ a2(i))
sel(i)<= (a1(i) > a2(i))

cmp(i+1) =Trueなら
cmp(i)<=cmp(i+1)
sel(i)<=sel(i+1)

出力は
sel(i) =True なら df(i),Carry(i)<=a1(i) - a2(i) -Carry(i-1)
sel(i) =False なら df(i),Carry(i)<=a2(i) - a1(i) -Carry(i-1)

のような回路をビット数並べるといい気がします。

この回答への補足

<絶対値の演算を論理回路を組み合わせてやりたい、ということでよろしいですか?

絶対値演算を論理式で記述するか,セレクタ(if文)を用いた記述するか どちらがシステム的に優れているかということです。

↓2の補数を求めています。
最上位ビットが1なら符号を反転,最後に1を足す.
X   <= ( df(N+1) xor df(N) ) &
     ( df(N+1) xor df(N-1) ) &
( df(N+1) xor df(N-2) ) &
・・・・・・・
( df(N+1) xor df(2) ) &
( df(N+1) xor df(1) ) &
( df(N+1) xor df(0) ) + ("000000000" & df(N+1));

補足日時:2010/03/11 23:16
    • good
    • 0
この回答へのお礼

お答えありがとうございます
この部分で if文を論理演算を表し,{ if(a1 < a2), else }
cmp(i+1) =False なら
cmp(i)<= (a1(i) ≠ a2(i))
sel(i)<= (a1(i) > a2(i))

cmp(i+1) =Trueなら
cmp(i)<=cmp(i+1)
sel(i)<=sel(i+1)
この部分で,if文の中身の計算ですね。
sel(i) =True なら df(i),Carry(i)<=a1(i) - a2(i) -Carry(i-1)
sel(i) =False なら df(i),Carry(i)<=a2(i) - a1(i) -Carry(i-1)

この方法は<候補1>と同じような気がします、、

お礼日時:2010/03/11 23:37

「回路の大きさが小さくなりそうな方」


回路が何を指しているのか判りませんが、1点だけ。
候補1の最後のelseは要りますか?

if(a1 < a2) X <= a2 - a1;
elsif (a1 > a2) X <= a1 -a2; ←ここの間違いは修正。
else X <= 0  ←ここ
a1 < a2 じゃ無かったら、
a1 > a2 又は a1 = a2
だけど、0を代入するなら、
a1 - a2
も、0になるんじゃないの?
    • good
    • 0
この回答へのお礼

回答ありがとうございます
ご指摘のとおり0の代入も必要なさそうですね
if(a1 < a2) X <= a2 - a1;
else X <= a1 -a2

お礼日時:2010/03/11 23:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング