FPGA—YOLO

Verilog关于signed、有符号数、算数移位、$signed()的使用

关于signed、有符号数、算数左移、算数右移、$signed()、$unsigned()的理解。

1、signed可以和reg和wire联合使用,用于定义有符号数。在代码中使用负的十进制数赋值给有符号数,在电路中是按该数值的补码形式存储的。如下:

wire signed a;
assign a = -8'd1;

使用display显示a的二进制=11111111,十进制= -1,如下:

$display("signed a =%b=%d",a,a);		 //signed a =11111111=         -1

2、使用signed定义的类型,做加法或乘法时,对操作数扩位处理时高位补符号位;即负数补1,正数补0;不使用signed的无符号类型,高位默认补0。

reg signed [7:0]a,b;
wire signed [8:0]sum1;
reg [7:0] c,d;
wire [8:0]sum2;
initial
begin 
  a = -8'd1;
  b = 8'd2;
  c = 8'b1000_0001;
  d = 8'b0000_0010;
end
assign sum1 = a+b;
assign sum2 = a+b;

其中有符号计算时,在电路中a=1111_1111,b=0000_0010;sum1比a和b多1bit,在加法结构中a扩位为1_1111_1111,b扩位为0_0000_0010,相加为10_0000_0001,保留9bit后sum1=1=0_0000_0001。
而在无符号计算时,c和d分别扩位为0_1000_0001和0_0000_0010,相加保留9bit后sum2=131=010000011。
综合后结构如下图:
在这里插入图片描述
有符号数signed和无符号数最重要的区别就是如何扩位,无符号数是添0,有符号数时添加符号位

3、 $signed$unsigned。首先明确这两个语句是可综合的。$signed(c)是一个function,将无符号数c转化为有符号数返回,不改变c的类型和内容。接上述代码历程:$unsigned同理。

4、算数右移>>>和逻辑右移。
对于无符号数,>>和>>>没有区别,都是按位右移,左侧补零。
有符号数的逻辑右移>>与无符号数一样,将所有位整体右移,左侧补零。
有符号数的算数右移>>>,左侧扩位符号位,如右移n位,则左侧增加n个符号位,右侧删除n位,即进行除n运算。详见下述代码:

reg  signed [7:0]a;
a=8'b1000_0010;			//即a=-126.
a=a>>>2;				//a=1110_0000	,即a=-32,除4运算
b=8'b0000_1000;			//即b=8
b=b>>>1;				//b=0000_0100,即b=4,除2运算

x=12’b1000110 x[0] 是最低位,和python相反

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注