• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:verilog ALU)

Verilog ALUの設計で躓いています

このQ&Aのポイント
  • Verilog初心者の私が作成している4ビットALUで、いくつかの課題に直面しています。具体的には、4ビットの入力と1ビットのオペレーションコントロールを使用して、加算およびオーバーフローを処理する必要があります。しかし、結果のオーバーフローを適切に扱う方法が分かりません。
  • また、2の補数を考慮する必要もあります。正の数と負の数の計算をどのように区別すれば良いのか、特に加算と引き算の場合について不明点があります。最上位ビットの値で判別すれば良いのは分かりますが、具体的な計算方法についてアドバイスをお願いします。
  • 以上が私の質問です。どなたか教えていただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • bug_bug
  • ベストアンサー率78% (36/46)
回答No.1

(1)verilogであれば連接演算子を使って5bitとして扱う. { Overflow, Result } <= {1'b0,A} + {1'b0,B}; (2)符号ありの4bitで表現できる数値は -8~7 と考えます. 4'b1111に 2つの意味を持たせてはいけません. 減算を加算回路として扱えるのが2の補数の特徴です. 4'b0111(7) + 4'b1111(-1) ---> 4'b0110(6), bollow<---1(overflow) 2の補数として考えることで加算回路と減算回路が等価になります. 演算結果をsignedとして扱うか, unsignedとして扱うかは呼び出し元が考えれば良いことです. 加算回路における carry と bollow について確認すると良いと思います.(論理が逆)

lockwell
質問者

お礼

遅くなりましたすみません。 2の補数がいまいち理解不足でした。ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Verilog

    16ビットのデータを32ビットに拡張する符号拡張(2の補数含む)のモジュールを作りたいのですが、どうすれば出来るのかがよくわかりません module SignExtension(a, result); input [15:0] a; output [31:0] result; どなたか宜しくお願いします

  • ALUのオーバーフローフラグの生成条件の証明などの問題

    ALUのオーバーフローフラグの生成条件の証明などの問題 A,Bを2の補数による符号付きnビット2進数の整数入力とする。nビットALUの演算結果により生成される条件判定フラグ、すなわちN(Negative)、 V(oVerflow)フラグについて書の問に答えよ。ただし、ALUの演算結果は(F[n-1]・・・F[0])とし、ALUを構成する加算回路の桁上げ出力に おいて、最上位の桁上げ出力はC[n]、その1ビット下位の桁上げ出力をC[n-1]とする。 (1)オーバーフローフラグV(oVerflow)を生成する条件が"C[n]xorC[n-1]=1"となる事を証明せよ。 (2)上記ALUを用いた算術比較演算において、A<Bの判定条件がオーバーフローの有無に関係なく、"N xor V=1"となる事を証明せよ。 ------------------------------------------------------------ このような問題があるんですが、解答は分かりません。 証明せよとは一体どのように記述すればいいんでしょうか? あと、(2)は何故"N xor V=1"と表せるんでしょうか? 一応、自分で考えたのはこんな感じです。 (1) 加算時のオーバーフローの条件は、 符号がA,B共に負、つまりC[n]が1でかつ、nビット目が1にならずに、正の値になってしまう数であるC[n-1]=0の場合と、 符号がA,B共に正、つまりC[n]が0でかつ、nビット目が1にならずに、負の値になってしまう数であるC[n-1]=1の場合である。 よって、オーバーフローフラグが生成される条件をC[n]xorC[n-1]=1と表すことができる。 (2) 演算結果が負でかつ、オーバーフローが発生していなければA<Bだから?分かりません。

  • ビットやバイトの計算がわかりません

    何度読んでも理解できません。 (1)ビット列A=111011、ビット列B=110110、ビット列C=010011に対し、A+(B・C)の結果は何になるか? (2)ビット列A=111010、ビット列B=010110、ビット列C=011011に対し、(A+B)・Cの結果は何になるか? (3)2進数Xの1の補数は101101、2の補数はYになる。 XとYを求めよ (4)2進数Xの1の補数は1011001、2の補数はYになる。XとYを求めよ 答えよりも、解き方や考え方を詳しく教えてください。 全くわかりません。 また、これらを解くのに必要な知識、などありましたら、併せて教えてください。

  • 論理回路 / デコーダー / ALU

    2系統の入力A0、A1と4系統の出力B0~B3を持つ、2ビットのデコーダーを用いて 3系統のデータ入力D0,D1,carry-inと、2系統のデータ出力E,carry-outを持った、1ビットのALU回路を構成したい。 ALU回路の命令はA0とA1の2系統の入力があり、上記で設計したデコーダーを用いて、以下の表1通りに、入力と出力の間の関係を制御したい。このような1ビットALU回路を設計せよ。 表1 A0|A1|E|carry-out 0|0|3ビットの入力(D0,D1,carry-in)からなる全加算器の和ビット|3ビットの入力(D0,D1,carry-in)からなる全加算器の繰り上がりビット 0|1|D0 AND D1|0 1|0|DO OR D1|0 1|1|if(DO==D1) 1else 0|0 という問題です。 表がみにくくて申し訳ありません。 デコーダをマルチプレクサにして、4パターンつくって、それぞれの動作をするようにつなぎあわせればいいのだと思うのですがつなぎ合わせ方がわかりません。 ご教示お願い致します。できればビジュアルがあるとありがたいです。

  • 論理回路

    この問題教えていただけませんか (1)次の減算を符号無し4ビットで補数計算をせよ。 (1) +5 -)+6   0101 +) (2) -5  -)-4 (2)次の16進数減算を補数加算せよ。 (1)4B0C -) 3A56・・・3A56の16の補数を加算

  • LaTeXのプログラミングについて

    \documentclass{jarticle} \begin{document} \begin{equation} \int_a^b f(x)dx=-\int_b^a f(x)dx \end{equation} \begin{equation} S_n = \frac{1-r}{a(1-r^n)} \end{equation} \begin{eqnarray} \alpha &=& 2 (1 + \beta)\nonumber\\ &=& 2 + 2\beta \end{eqnarray*} x = \left\{\begin{array}{11} y & \mbox{if $y>0$}\\ z+y&\mbox{otherwize} \end{array}\right . \end{eqnarray*} というコマンドをコンパイルしようとしたのですが、 何度やっても "x = \left\{begin{array}{11}" の部分でエラーが出てしまいます。 一体どの部分が間違っているのか 分かる方いらっしゃいましたら、是非ご回答を よろしくお願いします。

  • 2の補数を使った計算

    ある計算機があり、2の補数を「ビット反転して1を加算する」方法とするときに10進数の計算「100-80」を2の補数を使って計算する場合は16進数で表すと幾つと幾つの加算になるのでしょうか?? 2の補数を使うというのがよくわからないのですが・・・

  • verilog で「*」を使って2の補数形式の乗算って・・・

    加算器、減算器 どうやらうまくいったようでやっと乗算器を作っています。それで早速質問ですが、2の補数形式を「*」をつかって作りたいのですが、次のようにやると文法エラーになってしまいます。 ****************************** module mul(a,b,q); input [15:0] a,b; output [32:0] q; reg [32:0] q; always@(a or b) begin if((a == 16'h8000) || (b == 16'h8000)) $monitor("error"); else if((a[15] == 0) && (b[15] == 0)) q = a * b; else if((a[15] == 0) && (b[15] == 1)) begin q =a * (~b+1); q = ~q+1; end else if((a[15] == 1) && (b[15] == 0)) begin q =(~a+1) * b; q = ~q+1; end elseif((a[15] == 1) && (b[15] == 1)) q = (~a + 1) * (~b + 1); else q = a * b; end endmodule ******************************** 内容は q = (~a + 1) * (~b + 1); (mul.v,28|16): expecting a semicolon(';') けれどどこが間違っているのか… ちなみにalways@(a[15] or b[15])のように書き換えるとシミュレーションできるのですが、結果があっていません。 どなたか教えてくださいm(_ _)m

  • VBA と JIS Full BASIC

     下のJIS Full Basic スタイルとだいたい同じようなコードを VBA で書いたのですが   Z = Sqr(x^2 + y^2) のところでエラーが出ます。どこがおかしいのでしょうか。 Function gcd(a, b)   Do While b <> 0    r = a Mod b    a = b    b = r   Loop   gcd = a End Function Rem 既約なピタゴラス数を求める Sub Pythagoras()  LAST = 200   LAST = 200   For x = 1 To LAST    For y = x + 1 To LAST      Z = Sqr(x^2 + y^2)      'ここでコンパイルエラーが出る      If Int(Z) = Z Then       If gcd(x, y) = 1 And gcd(x, z) = 1 And gcd(y, z) = 1 Then         Debug.Print x & ", " & y & ", " & z       End If      End If    Next y   Next x End Sub ---------------------------- JIS Full Basic スタイルのコード REM ピタゴラス数 FUNCTION gcd(a,b)   DO WHILE b <> 0    LET r = MOD(a,b)    LET a = b    LET b = r   LOOP   LET gcd = a END FUNCTION LET LAST = 200 FOR x = 1 TO LAST   FOR y = x + 1 TO LAST    LET z = SQR(x^2+y^2)    IF INT(z) = z THEN      IF gcd(x,y) = 1 AND gcd(x,z) = 1 AND gcd(y,z) = 1 THEN       PRINT x,y,z      END IF    END IF   NEXT y NEXT x END

  • Verilog HDLについて質問

    以下のプログラムを入力し、試してもうまくいきません。どこがいけないのでしょうか。 しようとおもっていることを大まかにいうと、 ・x1の立ち上がりに、money1に1を足す ・x2の立ち上がりに、money2に2を足す ・クロックの立ち上がりに、sumにmoney1とmoney2を足したものを入れて、 sumが3だったら、z1に割り当てたLEDを光らせる sumが4だったら、z2に割り当てたLEDを光らせる というものです。 試してみると結果はz1,z2両方のLEDが、x1,x2を立ち上げなくても最初から光ってしまいます。 module vendmachine(x1,x2,z1,z2,clk); input x1,x2,clk; output z1,z2; reg [2:0] money1; reg [2:0] money2; reg [2:0] sum; reg ledz1,ledz2; always@(posedge x1) begin money1=money1+3'd1; end always@(posedge x2) begin    money2=money2+3'd2; end always@(posedge clk) begin sum=money1+money2; if(sum==3'd3)begin ledz1=1'b1; end if(sum==3'd4)begin ledz1=1'b1; ledz2=1'b1; end end assign z1=ledz1; assign z2=ledz2; endmodule