- ベストアンサー
Verilog ALUの設計で躓いています
- Verilog初心者の私が作成している4ビットALUで、いくつかの課題に直面しています。具体的には、4ビットの入力と1ビットのオペレーションコントロールを使用して、加算およびオーバーフローを処理する必要があります。しかし、結果のオーバーフローを適切に扱う方法が分かりません。
- また、2の補数を考慮する必要もあります。正の数と負の数の計算をどのように区別すれば良いのか、特に加算と引き算の場合について不明点があります。最上位ビットの値で判別すれば良いのは分かりますが、具体的な計算方法についてアドバイスをお願いします。
- 以上が私の質問です。どなたか教えていただけると助かります。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
関連する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を求めよ 答えよりも、解き方や考え方を詳しく教えてください。 全くわかりません。 また、これらを解くのに必要な知識、などありましたら、併せて教えてください。
- 締切済み
- その他(インターネット・Webサービス)
- 論理回路 / デコーダー / 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パターンつくって、それぞれの動作をするようにつなぎあわせればいいのだと思うのですがつなぎ合わせ方がわかりません。 ご教示お願い致します。できればビジュアルがあるとありがたいです。
- 締切済み
- ハードウェア・サーバー
- 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
- ベストアンサー
- Visual Basic
- 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
- ベストアンサー
- その他(プログラミング・開発)
お礼
遅くなりましたすみません。 2の補数がいまいち理解不足でした。ありがとうございました!