看板 Electronics 關於我們 聯絡資訊
※ 引述《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