• 締切済み

verilog ~ や() について特に気をつけなくちゃいけないことってありますか??

a,bともに正の数(15bit目が0のとき)のみしか計算が合いません。いろいろ試した結果「~」か「()」に問題があるのではないかと思っています。(優先順位はちゃんと考慮してプログラムを組んだつもりなのですが…)なにかこれらについて知らずに見落としていることがあるのではないかと思っています。もしくはほかに問題があるのでしょうか?おしえてgoo!!教えてください!内容は以下です ******************************** //module mul.v //`timescale 1ns/10p module mul(a,b,q); input [15:0] a,b; output [32:0] q; wire [15:0] _a,_b; wire [32:0] q; assign _a= a; assign _b= b; assign q =((a == 16'h8000) || (b == 16'h8000))?33'h1ffffffff: ((a[15] == 0) && (b[15] == 0))?_a * _b: ((a[15] == 0) && (b[15] == 1))?~(_a * (~_b+1))+1: ((a[15] == 1) && (b[15] == 0))?~((~_a+1) * _b)+1: ((a[15] == 1) && (b[15] == 1))?(~_a + 1) * (~_b + 1): _a * _b; endmodule **************************************************************** 以下演算結果、NOTが使われたときのみqの上位16bitの結果が計算と合わない(関数電卓で確認) ****************************************************************   300 c = 010 a = 0000000000000000 b = 0010011001100101 q = 000000000000000000000000000000000 310 c = 010 a = 0001000100010001 b = 0110001001100011 q = 000000110100011110001101110010011 320 c = 010 a = 0010001000100010 b = 1000011100001010 q = 000010010000000010100001101010100 330 c = 010 a = 0011001100110011 b = 0010001010000000 q = 000000110111001100101111110000000 340 c = 010 a = 0100010001000100 b = 0010000100100000 q = 000001000110101010100110010000000 350 c = 010 a = 0101010101010101 b = 0100010110101010 q = 000010111001110001001001101110010 360 c = 010 a = 0110011001100110 b = 1100110010011101 q = 001010001110110000001010010001110 370 c = 010 a = 0111011101110111 b = 0011111010010110 q = 000011101001101001101000110111010 380 c = 010 a = 1000100010001000 b = 1011100000010011 q = 001100010001010111110001000011000 390 c = 010 a = 1001100110011001 b = 0011100000001101 q = 000100001101000010100010011000101 400 c = 010 a = 1010101010101010 b = 1101011001010011 q = 010001110111000010111000100011110 410 c = 010 a = 1011101110111011 b = 1101110101101011 q = 010100010010111101110011000101001 420 c = 010 a = 1100110011001100 b = 0010101011010101 q = 000100010010000111101110110111100 430 c = 010 a = 1101110111011101 b = 0100101000000010 q = 001000000001000111001110110111010 440 c = 010 a = 1110111011101110 b = 0011111010101110 q = 000111010100000000000100111000100

みんなの回答

回答No.1

これまでの質問を全部ほったらかして新たに次々と質問をするのはいかがなもんでしょうか? 先ず自分で考える、或いは検討するという段階を省いて、ただ安易に解を求めすぎるのも考え物です。 数分、あるいは数十分考えて(試行錯誤して)はどうでしょうね? そもそも何の為にシミュレータがあるのでしょうか。 どこで思い通りにいかなかったを確認する為にほかなりません。 その確認を行えるようにするスキルを身につけることが求められているはずです。

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

関連するQ&A

  • フリーのverilog-HDLシミュレータ

    Windows上で動作するフリーのverilog-HDLシミュレータを探しています。 Siliosが少し前までフリーでダウンロードできたそうなのですが、今はダウンロードが禁止されています。。 例えば、このような回路を波形を見ながら解析したいと考えています。 //○シミュレーション対象:4ビット加算回路 module adder ( a, b, q ); input [3:0] a,b; output [3:0] q; assign q = a + b; endmodule //○シュミレーション記述 `timescale 1us/1us module adder_test; reg [3:0] a,b; wire [3:0] q; parameter STEP=1000 adder adder ( a, b, q ); initial begin a = 4'h0; b = 4'h0; #STEP a = 4'h5; b = 4'ha; #STEP a = 4'h7; b = 4'ha; #SEEP $finish; end endmodule

  • 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

  • verilog初心者です 符号拡張について教えください

    また似たような質問で申しわけないです。(T T;) 入力16ビット、出力を32ビット(←乗算器にもつなぐ入力の為)全加算器verilog記述についての質問です ****************************************************************//fulladder_16.v `timescale 1ns/10ps module fulladder_16(a,b,q); input [15:0] a,b; output [32:0] q; wire [15:0] cin; //module fulladd.v instance fulladd add0(.a(a[0]),.b(b[0]),.cin(1'b0),.q(q[0]),.cout(cin[0])); fulladd add1(.a(a[1]),.b(b[1]),.cin(cin[0]),.q(q[1]),.cout(cin[1])); fulladd add2(.a(a[2]),.b(b[2]),.cin(cin[1]),.q(q[2]),.cout(cin[2])); : : fulladd add14(.a(a[14]),.b(b[14]),.cin(cin[13]),.q(q[14]),.cout(cin[14])); fulladd add15(.a(a[15]),.b(b[15]),.cin(cin[14]),.q(q[15]),.cout(cin[15])); /*fulladd add0(.a(a[0]),.b(b[0]),.cin(1'b0),.q(q[0]),.cout(cin[0])); fulladd add1[15:1](.a(a[15:1]),.b(b[15:1]),.cin(cin[14:0]),.q(q[15:1]),.cout(cin[15:1]));*/ assing q = {{17{q[15]}},q}; endmodule /*ここでqの17~33bit目までを、上の記述のqの最上位ビットで拡張したくてこのように記述したのですが、この記述ではうまくいきません。 q =(算出された16ビットの最上位ビット × 17)と(算出された16ビット)  で33ビットにしたいわけです。どのように記述したらいいでしょうか?教えてください!!m(_ _)m ちなみにインスタンスしたのはしたの全加算器です //fulladder `timescale 1ns/10ps module fulladd(a,b,cin,q,cout); input a,b,cin; output q,cout; assign q = a^b^cin; assign cout = (a & b)|(b & cin)|(cin & a); endmodule

  • verilog 符号付加減算(最上位符号拡張)について教えてください

    verilog初心者で、(2の補数形式)符号付加減乗算器を作成しています。 …が符号拡張のところで解決できずにいます f(--;) もとの数a,bの最上位ビット(符号ビット)を16ビット分(乗算器に あわせ)増やすことは理解できたのですが、それをどうverilog 記述すればいいのかわかりません。下記にある記述ではエラーと なってしましました。 0拡張や、演算結果の最上位ビットだけを符号ビットにしてみたりし たのですが、これではダメとのことで もうどうやったらいいのか わからなくなってきました。(TT); どなたか教えてください。 m(_ _)m -------------------------------------------------------------- module kadai(a,b,c,q); input [15:0] a,b; input [2:0] c; output [32:0] q; wire [32:0] q; assign q =(c == 3'b000)?{16{a[0]},a}+{16{b[0]},b}: (c == 3'b001)?{16{a[0]},a}-{16{b[0]},b}:      (c == 3'b010)?{16{a[0]},a}*{16{b[0]},b}; endmodule ---------------------------------------------------------------- {16{a[0]},a}や{16{a[0]},b}という表現がいけないようなのですが… よろしくお願い致します。

  • Verilog-HDLでの記述方法

    Verilog-HDLで回路を記述しているのですが、疑問点があるので質問させていただきます。 回路記述はおおまかに以下のようなものです。 module Adder(A, B, S, C); input [3:0] A; input [3:0] B; output [3:0] S; output C; 4ビット加算器のインスタンス(.A(A), .B(B), .S(S), .C(C)); endmodule この回路への入力は上位モジュールから与えられるとします。 このような回路記述をしていたとして、たとえば入力線Aの特定のビットが常に0になってしまう故障を記述したいとき wire err = 1'b0; assign A[0] = err; という記述を追加してみたのですが、どうもA[0]には不定値が入り込んでいるようです。 このような記述ではA[0]を常に0にすることはできないのでしょうか?またこのような故障を仮定したい場合はどのように記述すべきなのでしょうか?

  • verilog 符号付加減算(最上位符号拡張)について教えてください

    何度も申し訳ないです。 質問させてください 2の補数形式の加減算 q = a + b において、a[15:0] b[15:0]であるとすると q はオーバーフローを考えてq= [16:0] となります。 そしてaとbの最上位ビットが符号となるためa[15]とb[15]の組合せを場合わけして  q[16]の最上位bitに出力する必要があるのではないかと考えています。 なので、以下のように記述したのですが…うまくいっていません。 ********************************************* module fulladder_16(a,b,q); input [15:0] a,b; output [16:0] q; wire [15:0] cin,out_q; reg s; //フルアダーモジュールをインスタンス fulladd add0(.a(a[0]),.b(b[0]),.cin(1'b0),.q(out_q[0]),.cout(cin[0])); fulladd add1[15:1](.a(a[15:1]),.b(b[15:1]),.cin(cin[14:0]),.q(out_q[15:1]),.cout(cin[15:1])); //aとbの最上位ビットの組合せを分けて、sに代入 always@(a[15] or b[15] or cin[15]) begin if(a[15] == 1) if(b[15] == 1) s = 1; else if(b[15] == 0) if(cin[15] == 1) s = 0; else s = 1; else if(a[15] == 0) if(b[15] == 1) if(cin[15] == 1) s = 0; else s = 1; else if(b[15] == 0) s = 0; end //最後に出力 q をbit拡張 assign q = {s,out_q}; endmodule //fulladder module fulladd(a,b,cin,q,cout); input a,b,cin; output q,cout; assign q = a^b^cin; assign cout = (a & b)|(b & cin)|(cin & a); endmodule ************************************************ これでシミュレーションを行ったところ     a = 0000000000000000 b = 0000000000000000 q = xxxxxxxxxxxxxxxxx0000000000000000 a = 0001000100010001 b = 0011010100100100 q = xxxxxxxxxxxxxxxxx0100011000110101 a = 0010001000100010 b = 0101111010000001 q = xxxxxxxxxxxxxxxxx1000000010100011 a = 0011001100110011 b = 1101011000001001 q = xxxxxxxxxxxxxxxxx0000100100111100 a = 0100010001000100 b = 0101011001100011 q = xxxxxxxxxxxxxxxxx1001101010100111 a = 0101010101010101 b = 0111101100001101 q = xxxxxxxxxxxxxxxxx1101000001100010 a = 0110011001100110 b = 1001100110001101 q = xxxxxxxxxxxxxxxxx1111111111110011 a = 0111011101110111 b = 1000010001100101 q = xxxxxxxxxxxxxxxxx1111101111011100 a = 1000100010001000 b = 0101001000010010 q = 111111111111111111101101010011010 a = 1001100110011001 b = 1110001100000001 q = 111111111111111110111110010011010  a = 1010101010101010 b = 1100110100001101 q = 111111111111111110111011110110111 となりうまく最上位ビットが出力してくれませんでした。 どなたか教えてください…(TT)

  • Verilog HDL 3_5セレクタ

    Verilog_HDLで3_5セレクタを作成しているのですが、うまくいかないので助けてください。 1つの4ビットの入力と2つの5ビットの入力の中から5ビットの出力を選び出す回路です。入力が4ビットのとき、最上位に0をつけ、5ビットにする。SELの組み合わせにより、出力を選択する。 /* 3-5SELECTOR */ module SEL3_5module (A, B, C, SEL, OUT); input [3:0] A; input [4:0] B, C; input [1:0] SEL; output [4:0] OUT; wire [4:0] IN; CONECT (A[0],IN[0]); CONECT (A[1],IN[1]); CONECT (A[2],IN[2]); CONECT (A[3],IN[3]); CONECT (0,IN[4]); assign OUT = SEL4_5_FUNC (IN, B, C, SEL); function [4:0] SEL4_5_FUNC; input [4:0] IN, B, C; input [1:0] SEL; case ( SEL ) 0: SEL4_5_FUNC = IN; 1: SEL4_5_FUNC = B; 2: SEL4_5_FUNC = C; 3: SEL4_5_FUNC = 0; endcase endfunction endmodule エラー文はError: Node instance "comb_4" instantiates undefined entity "CONNECT" Error: Node instance "comb_5" instantiates undefined entity "CONNECT" Error: Node instance "comb_6" instantiates undefined entity "CONNECT" Error: Node instance "comb_7" instantiates undefined entity "CONNECT" Error: Node instance "comb_8" instantiates undefined entity "CONNECT" です。 よろしくお願いします

  • Verilogでメモリのmoduleと演算のmoduleを組み合わせたい

    module spram_sr(clk, we, address, data_i, data_o); input clk; input we; input [7:0] address; input [2:0] data_i; output [2:0] data_o; reg [6:0] ram [15:0]; reg [6:0] read_a; always @(posedge clk) begin if (we) begin ram[address] <= data_i; end read_a <= address; end assign data_o = ram[read_a]; endmodule を使って、メモリから8bitの整数を取り出して、0~15個の数値をたすような計算をさせたいと思って別に計算させるmoduleを作りました。これに計算をさせるスタート信号と計算終了を知らせるフィニッシュ信号を加えています。 module sigma(clk,x,sum,start,finish); input clk; input[7:0] x, start; output[7:0] sum; output finish; reg[7:0] sum,start,write_add; reg finish; integer i; always@(posedge clk) begin if(start) for(i=0;i<=15;i=i+1) sum<=sum+x[i]; write_add<=sum; finish<=1'b1; end endmodule この二つを使いたいのですが、メモリから演算のモジュールに整数を渡すやりかたがわかりません。もう一つmoduleを使って制御する必要があるのでしょうか?すいませんが、どなたか教えていただけないでしょうか?

  • 2ビットのレジスタのVerilog HDL記述

    QuatusIIで2ビットのレジスタをつくっているのですが、ブロック図をコンパイルするときにエラーがでてしまいます。 エラー内容をみるとVerilog HDL記述が間違えているみたいなのですが、どこが間違えているか教えてください。 /* REG2 */ module REG2module ( EN, CLR_B, IN1, IN2, CLK, Q ); input CLR_B, CLK; input IN1, IN2; output [1:0] Q; output EN; assign EN=FUNC_EN (IN1, IN2); function FUNC_EN; input IN1,IN2; if (IN1>0|IN2>0) FUNC_EN=1; else FUNC_EN=0; endfunction wire [1:0] D; CONECT (IN1,D[0]); CONECT (IN2,D[1]); reg [1:0] Q; always @( posedge CLK or negedge CLR_B ) if( !CLR_B ) Q <= 0; else if(EN) Q <= D; endmodule エラーにはError: Node instance "comb_8" instantiates undefined entity "CONECT" Error: Node instance "comb_9" instantiates undefined entity "CONECT" と出ています。意味を調べたのですが、CONECTが定義されていない?という事は具体的にどうすればいいでしょうか。 CONECT (IN1,D[0]); CONECT (IN2,D[1]); の部分が間違っているのはなんとなくわかるのですが、どうしたらいいかわかりません。 よろしくお願いします

  • 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