首页 > 其他分享 >Verilog关于signed、有符号数、算数移位、$signed()的使用

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

时间:2024-05-11 09:53:38浏览次数:19  
标签:0010 符号 unsigned signed 扩位 Verilog 算数 display

 

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

关于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运算

5、算数左移。同样根据(有符号数signed和无符号数最根本的区别就是如何扩位,无符号数是添0,有符号数时添加符号位) 这句话进行理解,
在移位前数据a和移位后数据b,具有相同位数情况下,不需要扩位,即整体左移n位,右侧补。此时有符号数的算数左移<<<和有符号数的逻辑左移<<效果一致。
但是在移位前数据a和移位后数据thmp,不具有相同位数情况下,a进行MSB扩位,即为1_1100_0001,然后左移1位thmp=1_1000_0010,乘2运算。

reg  signed [7:0]a,b;
reg  signed [8:0]thmp;
a=8'b11000001;        //-63
b=a<<<1;            //b=1000 0010
thmp=a<<<1;            //thmp=-126,乘2运算。

6、总结:
其一:被signed定义的数据在电路中是以补码形式存储并计算的。
其二:有符号数signed和无符号数,区别在于如何扩位,无符号数是MSB添0,有符号数MSB添加符号位。
7、附录:
能够将如下代码和代码结果完全理解!

module test/**/ ;

reg signed [7:0]a,b;
wire signed [8:0]sum1;
reg signed [8:0]thmp;
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;
#10
  $display("signed a    =%b=%d",a,a);
  $display("signed b    =%b=%d",b,b);
  $display("a+b         =%b=%d",sum1,sum1);

  $display("unsigned c  =%b=%d",c,c);
  $display("unsigned d  =%b=%d",d,d);
  $display("c+d         =%b=%d",sum2,sum2);

  $display("$unsigned(a)=%b=%d",$unsigned(a),$unsigned(a));

  a=$signed(c);
  b=$signed(d);
#10
  $display("a+b         =%b=%d",sum1,sum1);

#10
  a=8'b1000_0010;
  b=8'b1000_0010;
  $display("a           =1000_0010=%d",a);
  $display("b           =1000_0010=%d",b);
#10
  a=a>>2;
  b=b>>>1;
  $display("a=a>>2      =%b=%d",a,a);
  $display("b=b>>>1     =%b=%d",b,b);

#10
  thmp=b<<<1;
  $display("thmo=b<<<1  =%b=%d",thmp,thmp);
end
assign sum1 = a+b;
assign sum2 = c+d;
//adder_8 u1(sum1,sum2,a,b,c,d);

initial
begin
  $vcdpluson;
end

endmodule

VCS仿真结果:

signed a    =11111111=         -1
signed b    =00000010=          2
a+b         =000000001=          1
unsigned c  =10000001=129
unsigned d  =00000010=  2
c+d         =010000011=131
$unsigned(a)=11111111=255
a+b         =110000011=       -125
a           =1000_0010=       -126
b           =1000_0010=       -126
a=a>>2      =00100000=         32
b=b>>>1     =11000001=        -63
thmo=b<<<1  =110000010=       -126

 

标签:0010,符号,unsigned,signed,扩位,Verilog,算数,display
From: https://www.cnblogs.com/zhiminyu/p/18185805

相关文章

  • SystemVerilog -- 11.2 SystemVerilog Concurrent Assertions
    SystemVerilogConcurrentAssertionsConcurrentAssertions描述了跨越仿真时间的行为,并且仅在时钟边沿发生时进行评估。SystemVerilogConcurrentAssertions语句可以在与其它语句同时运行的模块、接口或程序块中指定。以下是ConcurrentAssertions的属性:根据采样变量中的值......
  • FPGA实现Canny算法(Verilog)
    在边缘检测算法里面Sobel是比较简单的一个算法,但是其检测出来的边缘往往是比较粗的,效果不是很好,因为我们最理想的边缘肯定就是一个宽度为1的细线。Canny算法在此基础上进行了改进,通过使用边缘的梯度信息进行非最大值抑制(NMS)和利用双阈值,这些措施消除了假性边缘,提高了边缘检测的......
  • SystemVerilog -- 11.1 SystemVerilog Immediate Assertions
    SystemVerilogImmediateAssertionsImmediateAssertions基于模拟事件语义执行,并且需要在过程块中指定。在模拟过程中,它的处理方式与语句中的表达式相同。if如果表达式在执行语句时为true,则ImmediateAssertions将通过,如果表达式的计算结果为false(X、Z或0),则ImmediateAsserti......
  • SystemVerilog -- 11.0 Introduction
    SystemVerilogAssertions系统的行为可以写成一个assertion,该assertion在任何时候都应该为真。因此,assertion用于验证定义为属性的系统的行为,也可用于功能覆盖。Whatareproperitiesofadesign?如果assertion检查的设计属性未按预期方式运行,则assertion将失败。例如,假设设......
  • SystemVerilog -- 3.10 SystemVerilog Functions
    SystemVerilogFunctionsSystemVerilog函数具有与Verilog中的function相同的特征。Functionsa的主要用途是返回一个可在表达式中使用且不能消耗模拟时间的值。functionfunction不能具有时间控制语句,如@#forkjoinwaitfunction无法启动task,因为允许task消耗模拟时间。AN......
  • verilog 语义理解
    在verilog使用过程中,产生以下几个问题wire和reg的语义是什么,有什么不同?阻塞赋值和非阻塞赋值的语义是什么?assign和always语义是什么?弄清语义是为了正确的使用,不仅是结果正确,比如有时候可能两种写法得到的结果是一样的但是从语义来看会有一种是更适合当前语境的......
  • Verilog插件:补全模块实例模板
    https://mp.weixin.qq.com/s/tiaXdddID5-hxPtJZOvm8gIntellijIDEA插件VerilogLanguageSupport(插件链接),v2024.2.0版本特性。     https://mp.weixin.qq.com/s/tiaXdddID5-hxPtJZOvm8g ......
  • SystemVerilog -- 3.8 SystemVerilog case
    SystemVerilogcaseSystemVerilog语句检查表达式是否与多个表达式和分支中的一个匹配。该行为与Verilog中的行为相同。caseunique,unique0case所有case语句都可以由or关键字限定,以执行违规检查,就像我们在if-else-if构造中看到的那样。uniqueunique0unique并确保没有重叠的......
  • SystemVerilog -- 3.7 SystemVerilog 'unique' and 'priority' if-else
    SystemVerilog'unique'and'priority'if-else条件语句用于决定是否执行语句。ifelseSystemVerilog引入了一下用于违规检查的构造。ifelseunique-ifunique0-ifpriority-ifunique-if,unique0-ifunique-if按任意顺序评估条件,并执行以下操作:当所有条件都不匹配时,报......
  • SystemVerilog -- 3.6 SystemVerilog 'break' and 'continue'
    breakmoduletb;initialbegin//Thisforloopincrementsifrom0to9andexitfor(inti=0;i<10;i++)begin$display("Iteration[%0d]",i);//Let'screateaconditionsuchthattheforloopexitswheni......