精华内容
下载资源
问答
  • 有符号数 原码,反码,补码等,他的范围是随意的 计算机通常用补码来表示有符号数 计算机的一个数据可以看作是有符号数,也可以看作无符号数的 也就是说计算机并不知道你存的是有符号数还是无符号数,而且所做...

    计算机不能区分两者

    无符号数 没有原码,反码,补码等,他的范围是 ≥0 的
    有符号数 有原码,反码,补码等,他的范围是随意的

    计算机通常用补码来表示有符号数
    计算机的一个数据可以看作是有符号数,也可以看作无符号数的
    也就是说计算机并不知道你存的是有符号数还是无符号数,而且所做的运算并不需要管你存的是什么数


    王爽《汇编》是这样写的,下面是负数的时候为反码

    			00000001B,可以看作无符号数为1,有符号数为+1
    			10000001B,可以看作无符号数129,有符号数-127
    

    这两个数进行Add的时候

    			看作无符号数  1+129=130 (10000010B)
    			看作有符号数 +1-127=-126(10000010B)
    

    结果一致,不管我们如何看待,都已经包含两种含义


    展开全文
  • 二是verilog和VHDL有符号数运算的解释和对比。 1. 小数计算(定点小数) 1.1 用二进制表示小数 由于FPGA中存在的都是二进制数,所以首先明确一个知识点:如何用二进制表示小数? 如上图,一个带小数点的8位二...

    这篇blog有两个关键点,如题,一是关于FPGA或者说HDL是如何执行定点小数运算的;二是verilog和VHDL有符号数运算的解释和对比。

    1. 小数计算(定点小数)

    1.1 用二进制表示小数

    由于FPGA中存在的都是二进制数,所以首先明确一个知识点:如何用二进制表示小数?
    这里写图片描述
    如上图,一个带小数点的8位二进制所表示的数的大小就是:1*4+1*2+1*1+1*0.5+1*0.25+1*0.125+1*0.0625+1*0.03125 = 7.96875.实际上还有另外一种表示方式:0xff/2^5 = 7.96875.
    由于我上面的8位数用5位表示小数,所以能表示的最小粒度即LSB就是0.03125,就是说只能表示0.03125的整数倍;从这里我们也可以看出,用来表示小数的位数越多,可以表示的小数范围越大,表示的越精准。
    x表示实际的数(浮点数,如2.2), q表示它的n位定点小数。

    q = (int) (x * 2^n)
    
    x = (float)q/2^n

    比如我想把2.2转换为有5为小数的8位二进制。则2.2*2^5 = 70.4,取整数即70=b’1000110. 那么整数70表示的实际小数是多少呢,70/2^5 = 2.1875,所以我其实是用2.1875来近似表示了2.2.

    1.2 小数的加减乘除

    执行运算的基本原则如下所示,其中x1, x2, x3代表三个浮点数,q1, q2, q3代表其二进制表示。

    q3 = q1 + q2   若 x3 = x1 + x2
    
    q3 = q1 - q2   若 x3 = x1 - x2
    
    q3 = q1 * q2 / 2^n 若 x3 = x1 * x2
    
    q3 = q1 * 2^n / q2 若 x3 = x1 / x2

    加法和减法运算不做解释,对于乘法运算:
    这里写图片描述
    如上所示,两个16位数相乘,将得到一个32位数。可以看作是整数部分两个8位相乘得到一个16位整数;小数部分两个16位相乘得到一个16位小数。如果最后我们想要一个16位的结果,就只能选择中间的16位,将得到的32位数右移8位之后,高位截断8位,就可以得到我们要的16位结果。这就是上面 “/2^n”的来源。
    除法比较复杂,不在此解释。

    2. FPGA有符号数运算

    在FPGA中,有符号数的运算规则是不需要自己来写的,比如对于负数还要考虑反码啊啥的,这些都是不用考虑的,无论是Verilog还是VHDL都给我们提供了相应的解决方案。

    2.1 Verilog有符号数运算

    对于Verilog,这里我直接翻译一位大神的博客。原网址见:http://billauer.co.il/blog/2012/10/signed-arithmetics-verilog/

    黄金法则:两个操作数必须都是有符号数,结果才是有符号数!

    Verilog倾向于使用无符号数,比如以下几种计算的结果都会是无符号数:

    • 任何有两个操作数的计算。除非这两个都是有符号数
    • 基本的数字的运算(如12’d10),除非显示指定了“s”
    • 位选操作
    • Part-select results
    • 级联操作 Concatenations

    所以,要进行有符号数运算,要么使用$signed系统函数,要么在定义wire或者reg类型变量时加上signed
    例如要把一个有符号数和一个无符号数相乘,得到一个有符号数,要这样做:

    reg         [15:0] a; // Unsigned
    reg signed  [15:0] b;
    wire signed [16:0] signed_a;
    wire signed [31:0] a_mult_b;
    
    assign signed_a = a; // Convert to signed
    assign a_mult_b = signed_a * b

    注意,signed_a要比a位宽多一位,这一位用来放置符号位0. 也许你会觉得需要显式指定signed_a的最高位,比如{1’b0, a}而不仅仅是直接赋值为a,但其实是不用的。

    关于更多更详细的verilog有符号数计算,我上传一份名为“Signed Arithmetic in Verilog 2001 – Opportunities and Hazards” 的文档,请在我的资源中下载。

    2.2 VHDL有符号数运算

    关于VHDL有符号数的计算,跟VHDL的signed和unsigned两种数据类型息息相关,请移步我的另一篇blogVHDL中数据类型转换与移位(STD_LOGIC_ARITH与NUMERIC_STD) 中查看详解。

    参考链接

    1. verilog数值计算-有符号数和无符号数 https://blog.csdn.net/mdpsdhr/article/details/61922126
    2. FPGA内部计算小数 http://www.cnblogs.com/woshitianma/archive/2013/05/19/3087258.html
    3. FPGA浮点小数与定点小数的换算及应用 https://blog.csdn.net/github_33678609/article/details/53465626
    展开全文
  • verilog有符号数计算

    千次阅读 2018-01-14 15:25:08
    看了许多关于有符号数计算的文章,这里做一下总结。首先看看符号数是如何存储的,比如我们定义一个位宽为8位的 a=-10,通过仿真软件可以看到它的表示为1111 0110,最高位是1代表符号数,大小是它的反码加1。接...
    看了许多关于有符号数计算的文章,这里做一下总结。
    首先看看有符号数是如何存储的,比如我们定义一个位宽为8位的 a=-10,通过仿真软件可以看到它的表示为1111 0110,最高位是1代表有符号数,大小是它的反码加1。接下来我们会分别做一下四个实验:有符号数与无符号数的乘加计算和全是有符号数的乘加计算。
    1.有符号数+无符号数
    module mult(
    input [7:0] a ,
    input signed [7:0] b,
    output signed [15:0]c
         );
     assign c = a + b;
    endmodule
    这里 a = 10;b=-20。我们可以看到此时的二进制码
    a  0000 1010 
    b  1110 1100
    然而计算后的结果c = 0000 0000 1111 0110 虽然c确实等于a+b,但这显然是个错误的结果。
    2.有符号数+有符号数
    module mult(
    input signed [7:0] a,
    input signed [7:0] b,
    output signed [15:0]c
         );
    assign c = a + b;
    endmodule
    这里 a = -10;b=-20。我们可以看到此时的二进制码
    a  1111 0110
    b  1110 1100
    然而计算后的结果c = 1111 1111 1110 0010 这时计算结果就正确了。
    3.有符号数*无符号数
    module mult(
    input [7:0] a ,
    input signed [7:0] b,
    output signed [15:0]c
        );
    assign  c = a * b;
    endmodule
    这里 a = 10;b=-20。我们可以看到此时的二进制码
    a  0000 1010 
    b  1110 1100
    然而计算后的结果c = 0000 1001 0011 1000 虽然c确实等于a*b,但这显然是个错误的结果。
    4.有符号数*有符号数
    module mult(
    input signed [7:0] a,
    input signed [7:0] b,
    output signed [15:0]c
        );
    assign  c = a * b;
    endmodule
    这里 a = -10;b=-20。我们可以看到此时的二进制码
    a  1111 0110
    b  1110 1100
    然而计算后的结果c = 0000 0000 1100 1000 这时计算结果就正确了。
    我们可以发现规律,当有符号数与无符号数进行运算的时候把无符号数也定义为signed这时无论是加法还是乘法计算结果都正确了。因此当遇到有符号数计算时,无论是有符号数还是无符号数都当成有符号数来处理。
    展开全文
  • fpga中有符号数计算

    千次阅读 2018-01-23 09:30:09
    1.如果要完成有符号数计算,对于加、减操作通过补码处理即可用无符号加法完成。不过在计算的时候要考虑位数的限制,不管在做加法还是减法,结果的位数要比原来的数据多出一位, 这样计算的时候才不会出现量程的错误...
    

    在fpga设计中,所有的算数运算符都是按照无符号数进行的。最近用FPGA做了有符号的计算,来记录一下

    1.如果要完成有符号数计算,对于加、减操作通过补码处理即可用无符号加法完成。不过在计算的时候要考虑位数的限制,不管在做加法还是减法,结果的位数要比原来的数据多出一位,

    这样计算的时候才不会出现量程的错误。

    example1:

    module signed_yz
    (
    input clk,rst_n,
    input signed [7:0]data,
    input signed [7:0]datb,
    output signed [8:0]datc
    );
    assign datc=data+datb;

    endmodule

    仿真结果图 :

     

    2.对于乘法操作,无符号数直接采用“*”运算符;

    有符号数运算可通过定义输出为 signed 来处理。通过“*”运算符完成有符号数的乘法运算。

    example2:

    module signed_yz
    (
    input clk,rst_n,
    //unsigned data
    input [7:0]udata,
    input [7:0]udatb,
    output [15:0]udatc,
    //signed data
    input signed [7:0]data,
    input signed [7:0]datb,
    output signed [15:0]datc

    );

    assign udatc=udata*udatb;
    assign datc=data*datb;

    endmodule

    从其 RTL 结构图可以看到乘法器标注为:
    “signed” ,为有符号数乘法器。

     

    仿真结果图 :

          

         以上为FPGA中符号数的计算,记录一下自己的学习过程,同时也供大家学习。

    展开全文
  • 有符号数的运算方法

    千次阅读 2020-05-12 20:35:37
    有符号数的加减法 1、符号数与无符号数的人为规定性: 一个数,是有符号数还是无符号数都是人为规定的。进行二进制运算时用无符号数或是补码运算时,结果都是正确的。 10000100+00001110 若规定为无符号数,即 ...
  • Verilog 有符号数与无符号数运算

    千次阅读 2020-05-19 14:35:27
    符号数运算,左值位宽不够,发生截断的现象 reg [3:0] a = 4'b1111;...2. 两个无符号数运算,赋值给一个符号的数。可以看出,右侧先按照无符号数进行运算,取得的运算结果按照左侧的符号进行.
  • C++ 有符号数与无符号数混合运算

    千次阅读 2019-07-11 10:31:45
    感谢博主的分享,转自:C++ 有符号数与无符号数混合运算 当算术表达式中既符号数符号数时,那么在进行运算之前,这个带符号数值会先被转换成无符号数!然后再进行运算。如, unsigned i = 10; int j = -...
  • c语言有符号数和无符号类型计算

    千次阅读 2015-07-16 14:47:52
    因此,从这个意义上讲,无符号数的运算优先级要高于有符号数,这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。  首先进行一个实验,分别定义一个signed int型数据和unsigne
  • 我们都知道,编程中,数据类型分为有符号数和无符号数,即我们通常说的正数和负数。现以unsigned char和signed char类型的数为例,来说明有符号数与无符号数在计算机中的存储问题。 计算机中的一个unsigned char型...
  • verilog数值计算-有符号数和无符号数

    万次阅读 多人点赞 2017-03-13 17:18:07
    verilog数值计算-有符号数和无符号数 位宽截断 算术运算 有符号数赋值 位宽截断 位宽大的数赋值给位宽小的数,数据就会被截断,截断的规则就是从低位开始取,被截断的是高位 codewire [5:0] a; wire [4:0] f; ...
  • C语言中的自动类型转换: 在C语言中,进行混合运算时,编译系统遵循一定规则,完成数据类型的自动转换...所以,无符号数有符号数进行运算时,先需要将有符号数转化为无符号数进行操作。以下代码所展示出的结果,...
  • 有符号数与无符号数之间的运算

    千次阅读 2017-08-17 21:16:58
    在C/C++中,经常可能会涉及到一个无符号数与一个有符号数之间的运算。其实这个问题是关于C/C++语言中的整数自动转换原则:当表达式中存在符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此,从这个...
  • (1)采用取反操作若该值与其求反后的值都大于0,则该数为无符号数,反之则是有符号数。解析:因为数据在计算机中都是以二进制的0或1存储的,证书以0开头,负数以1开头,求反操作会把所有的0改为1,所有的1改成0,...
  • 有符号数和无符号数详解

    千次阅读 多人点赞 2020-05-10 13:47:41
    有符号数和无符号数2.1 什么是无符号数 ?2.2 什么是有符号数 ?3. 原码、反码、补码3.1 背景3.2 原码、反码、补码3.2.1 什么是机器数?3.2.2 什么是真值?3.2.3 原码、反码、补码4. -1 和 0xFFFFFFFF问题参考 1. ...
  • 计算机中的有符号数和无符号数

    千次阅读 2015-09-05 11:46:36
     在计算机中,可以区分正负类型的数,成为“有符号数”(signed);无正负类型的数(只有整数类型),成为“无符号数”(unsigned)。简明的说,无符号说就是其所有的位数都用来表示数值的大小,有符号数除最高位来...
  • verilog中有符号数运算

    万次阅读 2017-01-07 12:35:36
    有符号数计算:若需要关于号数的计算,应当利用Verilog 2001所提供的signed及$signed()机制。   Ex:   input signed [7:0] a, b;   output signed [15:0] o;   assign o = a * b;   or   ...
  • 汇编8位有符号数相加

    千次阅读 2019-05-11 21:37:45
    操作环境:emu8086 问题描述: 设从BUF开始存放若干带符号字节数(8位),将它们相加并将结果(超过一个字节范围)存放到字...2、两8位有符号数相加时会出现溢出:两正数相加的和超过127,两负数相加的和低于-1...
  • 有符号数下的负数

    千次阅读 2019-07-23 11:13:34
    以短整型为例,其他的有符号和无符号类型都类似: short int为有符号短整型,范围在:-32768 - 32767 unsigned short int 为无符号短整型,范围在:0 - 65536 a: short int类型下的变量variableA 为 32767,则...
  • FPGA 中的有符号数乘法

    千次阅读 2020-01-31 15:39:46
      FPGA中乘法器是很稀缺的资源,但也是我们做算法必不可...在里面可以设置符号还是无符号数乘法。   当然,我们也可以直接使用*符合来进行乘法,对于无符号的乘法 reg [7:0] ubyte_a; reg [7:0] ubyte_...
  • 计算机组成-无符号数乘法

    万次阅读 2018-08-17 10:02:08
    下面是C语言编写的一个乘法子程序,实现两个16位无符号数相乘,结果为32位无符号数。 unsigned int mul16(unsigned int x, unsigned int y){ unsigned int a,b,c; unsigned int i; a=x; b=y; c=0; f...
  • 位数问题 a_width位的a,乘以B_width位的b,结果的位数是A_width + B_width。 定点小数问题 小数位数等于a的小数位数,加上b的小数位数之和。 补码相乘问题 补码 * 补码 = 补码 ...有符号数 * 有符号数 前三个加
  • 符号的二进制计算

    千次阅读 2020-01-16 15:50:19
    十进制的补码 二进制的补码
  • 以上定义的两个数据都是机器码形式(二进制/十六进制),它们可能是无符号数(的补码形式)236和2,也可能是有符号数的补码形式-20和20,(机器内部的计算都是以补码形式进行),所以无法直接看出它们的真值(十进制...
  • 一、无符号数 1.高位溢出赋给一个位宽不够的数 wire [3:0] a=4'b1111;//15 wire [3:0] b=4'b0010;//2 wire [3:0] c; assign c = a + b;//17=10001 wire [3:0] a=4'b1111; wire [3:0] b=4'b0010; wire [2:0] c;...
  • verilog中有符号数和无符号数在赋值、运算中的区别赋值有符号数的赋值和无符号数的赋值加减法运算两个无符号数的加减法运算两个有符号数的加减法运算有无符号数的混合加减法乘法运算无符号数/无符号数的乘法运算有无...
  • 写在前面:计算机中数据存储与运算的专业名词听起来晦涩,实际上我们在九年义务教育阶段就已经掌握了,如:整型(integer)——整数,浮点数(float)——小数,无符号数(unsigned)——正数,有符号数(signed)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 544,269
精华内容 217,707
关键字:

有符号数计算