[爆卦]verilog 1'b0是什麼?優點缺點精華區懶人包

為什麼這篇verilog 1'b0鄉民發文收入到精華區:因為在verilog 1'b0這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者Acme ( )站內Electronics標題Re: [問題] verilog 問...


※ 引述《wowow11 (owo)》之銘言:

16'd8 = 0000_0000_0000_0100
16'd4 = 0000_0000_0000_0100
16'd2 = 0000_0000_0000_0010

負二要怎麼以binary表示 ?
1111_1111_1111_1101 + 1
1111_1111_1111_1110 是 -2
-----------------------------------------
1111_1111_1111_1101 是 -3
建議你先做一個,把負數轉為正數的東西
類似 assign posIn[15:0] = ddInput[15] ? ~ddInput[15:0] +1 : ddInput[15:0] ;

然後只有正數拿去做除數跟被除數
然後出來的結果再加個負號....
類似 assign realOp = ddInput[`DdLen]^dvInput[DdLen] ? ~Op : Op ;
-----------------------------------------

這樣應該就能解決您的問題 ,



不過你還有別的更大的問題,

1. code不能合成,裡面用一些wait , repeat
2. 沒有clk的概念.....etc


建議多想想什麼叫做 RTL code
還有您寫出來的code會被合成什麼樣的電路 ?



: 下面是一個divide的code
: `define DvLen 16
: `define DdLen 32
: `define QLen 16
: `define HiDdMin 16
: module divide
: (input [`DdLen-1:0] ddInput,dvInput,
: output reg signed [`QLen-1:0] quotient,
: input go,
: output reg done);
: reg signed [`DdLen-1:0] dividend;
: reg signed [`DvLen-1:0] divisor;
: reg negDivisor,negDividend;
: always begin
: done=0;
: wait(go);
: divisor=dvInput;
: dividend=ddInput;
: quotient=0;
: if (divisor) begin
: negDivisor=divisor[`DvLen-1];
: if (negDivisor) divisor=-dividend;
: negDividend=dividend[`DdLen-1];
: if (negDividend) dividend=-dividend;
: repeat (`DvLen) begin
: quotient=quotient<<1;
: dividend=dividend<<1;
: dividend[`DdLen-1:`HiDdMin]=
: dividend[`DdLen-1:`HiDdMin]-divisor;
: if (!dividend[`DdLen-1]) quotient=quotient+1;
: else
: dividend[`DdLen-1:`HiDdMin]=
: dividend[`DdLen-1:`HiDdMin]+divisor;
: end
: if (negDivisor != negDividend) quotient=-quotient;
: end
: done=1;
: wait(~go);
: end
: endmodule
: 教授要我們寫出一個4種狀況的test bench (正除正 正除負 負除正 負除負)
: 以下是我寫的code
: `include "3.1.v"
: module test_divide;
: reg [`DdLen-1:0] dvInput,ddInput;
: reg go;
: wire done;
: wire [`QLen-1:0] quotient;
: parameter DELY = 100;
: always begin go=1; forever #(DELY/2) go=~go; end
: divide t (ddInput,dvInput,quotient,go,done);
: initial begin
: ddInput=16'd0;dvInput=16'd0;
: #DELY go=1'b0; ddInput= 16'd8; dvInput= 16'd2;
: #DELY go=1'b0; ddInput= -16'd4; dvInput= 16'd2;
: #DELY go=1'b0; ddInput= 16'd2; dvInput= -16'd2;
: #DELY go=1'b0; ddInput= -16'd9; dvInput= -16'd3;
: #DELY $stop;
: end
: initial $monitor($time,,,"ddInput=%d dvInput=%d,quotient=%d",ddInput,dvInput,quotient);
: endmodule
: 在執行正除正沒問題 可是負數就出現一堆數字了 希望各位大大幫我更正一下QQ

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.228.245.85
※ 編輯: Acme 來自: 220.228.245.85 (05/15 01:26)
wowow11:感謝您 我是verilog新手~"~ 05/15 03:35
wowow11:另外是...divide是課本上的test bench才是我寫的QQ 05/15 03:41
Acme:那是否可請問是哪本書,出版社 ? 讓小的瞻仰瞻仰.... 05/15 18:41
wowow11:The Verilog Hardware Descripion Language,Fifth Edition 05/17 04:12
wowow11:Kiuwer Academic Publishers 科大文化代理 05/17 04:13
wowow11:另外是.reg signed [`DdLen-1:0] dvInput,ddInput; 05/17 04:22
wowow11:wire signed [`QLen-1:0] quotient; 05/17 04:23
wowow11:這樣就可以了QQ 05/17 04:23
wowow11:2個signed是爆肝4天換來的orz... 05/17 04:24

你可能也想看看

搜尋相關網站