• 締切済み

絶対値の取り方

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));

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

考え方は<候補1>、回答のような1ビット演算回路をならべると、回路図が見やすそうで、規模も小さくなりそうだな、と思ったので。 <候補1>だと Nビット比較器とNビットセレクタとNビット減算器が必要な感じに見えたので、それだと無駄な配線が多くなりそうな感じがしたもので。 最近の論理合成プログラムはよくできてるそうで、プログラムのような感覚で設計できるとか。そんな環境なら、私の書いた方法はあまりやくにたたないかもしれません。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

ハードはそんなに詳しくはないのですが 絶対値の演算を論理回路を組み合わせてやりたい、ということでよろしいですか? &,(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) のような回路をビット数並べるといい気がします。

tyamoroneu
質問者

お礼

お答えありがとうございます この部分で 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>と同じような気がします、、

tyamoroneu
質問者

補足

<絶対値の演算を論理回路を組み合わせてやりたい、ということでよろしいですか? 絶対値演算を論理式で記述するか,セレクタ(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));

  • edomin7777
  • ベストアンサー率40% (711/1750)
回答No.1

「回路の大きさが小さくなりそうな方」 回路が何を指しているのか判りませんが、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になるんじゃないの?

tyamoroneu
質問者

お礼

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

関連するQ&A