Re: [問題] verilog 問題

看板Electronics作者 ( )時間19年前 (2006/05/15 00:46), 編輯推噓2(207)
留言9則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《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)

05/15 03:35, , 1F
感謝您 我是verilog新手~"~
05/15 03:35, 1F

05/15 03:41, , 2F
另外是...divide是課本上的test bench才是我寫的QQ
05/15 03:41, 2F

05/15 18:41, , 3F
那是否可請問是哪本書,出版社 ? 讓小的瞻仰瞻仰....
05/15 18:41, 3F

05/17 04:12, , 4F
The Verilog Hardware Descripion Language,Fifth Edition
05/17 04:12, 4F

05/17 04:13, , 5F
Kiuwer Academic Publishers 科大文化代理
05/17 04:13, 5F

05/17 04:22, , 6F
另外是.reg signed [`DdLen-1:0] dvInput,ddInput;
05/17 04:22, 6F

05/17 04:23, , 7F
wire signed [`QLen-1:0] quotient;
05/17 04:23, 7F

05/17 04:23, , 8F
這樣就可以了QQ
05/17 04:23, 8F

05/17 04:24, , 9F
2個signed是爆肝4天換來的orz...
05/17 04:24, 9F
文章代碼(AID): #14PrxPhF (Electronics)
文章代碼(AID): #14PrxPhF (Electronics)