作者Acme ( )
站内Electronics
标题Re: [问题] verilog 问题
时间Mon May 15 01:15:46 2006
※ 引述《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)
1F:推 wowow11:感谢您 我是verilog新手~"~ 05/15 03:35
2F:推 wowow11:另外是...divide是课本上的test bench才是我写的QQ 05/15 03:41
3F:→ Acme:那是否可请问是哪本书,出版社 ? 让小的瞻仰瞻仰.... 05/15 18:41
4F:→ wowow11:The Verilog Hardware Descripion Language,Fifth Edition 05/17 04:12
5F:→ wowow11:Kiuwer Academic Publishers 科大文化代理 05/17 04:13
6F:→ wowow11:另外是.reg signed [`DdLen-1:0] dvInput,ddInput; 05/17 04:22
7F:→ wowow11:wire signed [`QLen-1:0] quotient; 05/17 04:23
8F:→ wowow11:这样就可以了QQ 05/17 04:23
9F:→ wowow11:2个signed是爆肝4天换来的orz... 05/17 04:24