EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
verilog中有符号数和无符号数运算需要注意的问题
, [9 L$ g/ ~9 V, r
8 @3 B, A* [9 ?, W2 i6 i* I. }1 ?" |/ U! V9 w8 H8 w1 |- X
verilog中最简单的加减乘除运算对于有符号数和无符号数其实是有很大区别的,现总结几点如下:例子:对输入a,b取平均值,然后赋值给c输出
8 e+ l" B( W) X/ h2 M always @(posedge clk)- u. G9 j) Z7 G, R
c<=(a+b)>>1;" Q5 D4 V. T. N& g" s3 h N
; P$ l& f0 }8 [0 P; r1. a,b均为无符号数,结果正确
% w1 X* u7 a( l! R. S3 o3 u5 v. _4 ~% J9 b
2. a,b中一个为有符号数(a),另一个为无符号数(b),编译器会自动将无符号数(b)转换成有符号数,这样就成了2个有符号数之间的 运算了,结果是个有符号数,此时
5 c- Y5 e& d9 ]" G( p1> 如果a+b结果为正数(最高位为0),那么结果正确
1 U: n' S6 F; u6 R u2> 如果a+b结果为负数(最高位为1),那么结果错误,因为移位运算新移入的位将用0来填补,此时负数将变为正数,显然 错误。
; h( y& o" w1 t" j$ m2 A- g+ P* l
! Y, K0 a# ?0 p6 y: o. E所以综上,在进行有符号数运算的时候,最好像如下这样写:- w8 m9 ^% `8 W2 F, Z
reg signed [3:0] a;
! P5 o4 V+ u2 b+ V3 g& Zreg signed [3:0] b;
; i9 [/ p1 T! A7 |reg signed [3:0] c;
4 [' |6 Y! l4 a5 {" ~5 e& { always @(posedge clk)3 s7 o$ e4 G) ?5 c8 T" p) V0 w1 ?! }
c<=(a+b)/2;
0 I5 K( B S7 _这样就可以避免不必要的错误- V. U# o4 P# a/ C7 Y
9 U( Z5 K6 H: | k' E4 i# U |