精华内容
下载资源
问答
  • 可能不同的CPU内部的运算原理和机制略有差异,我们也无法完全去把这些运算方式搞清楚,这个例程我们就老老实实的用移位累加的方式完成两个8位无符号数的乘法运算。这里先随便举个例子来说明我们的运算原理,例如8位...
  • 本文件为基础的汇编入门8位除法算法 适用于51 avr等8位汇编编程的单片机
  • 无符号除法器的整体设计思路是,通过被除数移位后的结果与除数做减法运算实现的除法过程,具体设计思路是对于输入八位无符号被除数divisor1,先对八位divisor1进行转换为十六位的divisor1_tmp,高八位补零,第八位是...
  • 我做的是一个无线鼠标,stm32用nRF24L01无线传输模块发送数据时,是传输无符号8位 uchar。三个数据是角度值,有正负。直接使用无符号数据的话负数会出错,在接收端要把数据恢复为整数。l 是要转换数组的长度,*table...

    我做的是一个无线鼠标,stm32用nRF24L01无线传输模块发送数据时,是传输无符号8位 uchar。三个数据是角度值,有正负。直接使用无符号数据的话负数会出错,在接收端要把数据恢复为整数。

    l 是要转换数组的长度,*table_u 是要转换的无符号数组的指针 *table_i是要转换成int数组的指针

    直接转换为 char 类型的话是会出错的,结果不对,所以转换为 int。

    /******** 无符号8位转换为int类型**********/
    //  u8  无符号8位 即 unsigned char  
    void u8_int(char l,u8 *table_u,int *table_i)
    {
        u8 t;// unsigned char
        char i;
        for(i=0;i<l;i++)
        {
            if(table_u[i]>127){
                t = ~table_u[i]+1;
                table_i[i]=-(int)t;
            }else
            {
                table_i[i]=table_u[i];
            }        
        }
    }


    展开全文
  • 本文件为基础的汇编入门8位乘法算法 试用于51 avr等8位汇编编程的单片机
  • 无符号整数除法器:168位 备注:在写testbench时发现reg型变量是有符号的补码形式。使用{$random}%b产生无符号随机数,除数被除数依旧可能取值为负数;然后手动输入大于2^7=128的数作为除数,发现发生溢出,除数...

    无符号整数除法器:16位除8位

    备注:在写testbench时发现reg型变量是有符号的补码形式。使用{$random}%b产生无符号随机数,除数被除数依旧可能取值为负数;然后手动输入大于2^7=128的数作为除数,发现发生溢出,除数被当作负数,这才发现此时reg型变量应该是被当作了有符号数的补码形式。一般认为reg型变量为无符号型变量,有出入,特此记录。

    源代码

    //unsigned 16bit/8bit
    module unsignediv(divee,divor,result,odd);
    input [15:0] divee;
    input [7:0] divor;
    output [15:0]result;
    output [15:0]odd;
    
    reg [15:0] result,odd;
    reg [15:0] tempa;
    reg [7:0] tempb;
    reg [31:0] temp_a,temp_b;
    integer i;
    
    always @ (divee or divor)
    begin
     tempa=divee;
     tempb=divor;
     temp_a={16'h0000,tempa};
     temp_b={tempb,16'h0000};
     for(i=0;i<16;i=i+1)
      begin
       temp_a={temp_a[30:0],1'b0};
       if(temp_a[31:16]>=tempb)
         temp_a=temp_a-temp_b+1'b1;
       else temp_a=temp_a;
      end
     result=temp_a[15:0];
     odd=temp_a[31:16];
    end
    
    endmodule
    

    测试代码

    module unsigned_tb;
    reg [15:0] divee;
    reg [7:0] divor;
    wire [15:0] result,odd;
    
    initial
    begin
    	#10 divee = 12345;
    		divor = 106; 
    
    	#100 divee = 2383;
    		divor = 12;
    		
    	#100 divee = {$random}%100;
    		divor = {$random}%10;	
    		
    	#1000 $stop;
    end
    
    unsignediv U1(divee,divor,result,odd);
    endmodule
    
    仿真结果

    在这里插入图片描述

    仿真过程中发现的reg疑问

    (1)当使用随机数
    module unsigned_tb;
    reg [15:0] divee;
    reg [7:0] divor;
    wire [15:0] result,odd;
    
    initial
    begin
    	#10 divee = {$random}%10000;
    		divor = {$random}%256;  //{$random}%b表示产生一个0~b-1的随机整数
    		
    	#100 divee = {$random}%1000;
    		divor = {$random}%100;
    		
    	#100 divee = {$random}%100;
    		divor = {$random}%10;	
    		
    	#1000 $stop;
    end
    
    unsignediv U2(divee,divor,result,odd);
    endmodule
    
    仿真结果

    使用random产生随机数办法

    可以看到,-127这一组计算错误,原因是:即使利用{$random}%b产生正随机数,但当最高位为1时,即数值大小超过128时,按照有符号整数补码的读数规则,为相应负数。而源代码只适用于无符号整数即正整数的除法运算,因此计算错误是在所难免的。通过手动输入具体数值,验证确实是这个原因。

    (2)当手动输入
    module unsigned_tb;
    reg [15:0] divee;
    reg [7:0] divor;
    wire [15:0] result,odd;
    
    initial
    begin
    	#10 divee = 12345;
    		divor = 106;  //divor=8'b01101010
    		
            #100 divee = 12345;
    		divor = 106+128;  //divor=8'd234=8'b11101010
    
    	#100 divee = 2383;
    		divor = 12;
    		
    	#100 divee = {$random}%100;
    		divor = {$random}%10;	
    		
    	#1000 $stop;
    end
    
    unsignediv U3(divee,divor,result,odd);
    endmodule
    

    为了具有对比性,把除数的最高位分别设置为0和1,可以看到结果如下图所示:

    仿真结果

    234=8‘b11101010,如果当作是有符号补码形式,就是-22
    8’b11101010 = 8’d234 = -8’d22,计算发生错误。其他例子都是正确的。

    结论:

    verilog中reg型变量是无符号整数类型,发生此类错误原因暂时不明。不过得到的教训是以后在仿真过程中注意最好让数据最高位为0,避免发生溢出为负这样的错误

    Ps:如果有看到我这篇小记录且知道原因的小伙伴还请指教指教!!

    展开全文
  • 最近做了一个项目,需要高八位和低八位的数据颠倒一下,需要转换的数据是有符号的16数据。
  • verilog 实现8位无符号乘法器

    千次阅读 2020-09-29 21:51:26
    设二进制加法器第i为Ai,Bi,输出为Si,进位输入为Ci,进位输出为Ci+1,则有: Si=Ai⊕Bi⊕Ci(1-1) Ci+1 =Ai * Bi+ Ai Ci+ BiCi =Ai * Bi+(Ai+Bi)* Ci(1-2) 令Gi = Ai * Bi, Pi = Ai+Bi,则Ci+1= Gi

    一、移位相加乘法器—串行形式

    1、RTL代码

    module unsigned_mul_1 #(
                parameter DATAWIDTH=8
    )(clk, x, y, result);
        
        parameter s0 = 0, s1 = 1, s2 = 2;
        
        input clk;
        input    [DATAWIDTH-1:0] x, y;
        output   [DATAWIDTH*2-1:0] result;
    
        reg      [DATAWIDTH*2-1:0] result;
    
        
        reg  [DATAWIDTH-1:0] count = 0;
        reg  [1:0] state = 0;
        reg  [DATAWIDTH*2-1:0] P, T;
        reg  [DATAWIDTH-1:0] y_reg;
    
        always @(posedge clk) begin
            case (state)
                s0: begin
                    count <= 0;
                    P <= 0;
                    y_reg <= y;
                    T <= {{DATAWIDTH{1'b0}}, x};
                    state <= s1;
                end
                s1: begin
                    if(count == DATAWIDTH)
                        state <= s2;
                    else begin
                        if(y_reg[0] == 1'b1)
                            P <= P + T;
                        else
                            P <= P;
                        y_reg <= y_reg >> 1;
                        T <= T << 1;
                        count <= count + 1;
                        state <= s1;
                    end
                end
                s2: begin
                    result <= P;
                    state <= s0;
                end
                default: ;
            endcase
        end
      
    endmodule
    

    2、仿真程序

    `timescale 1ns / 1ps
    
    module tb_unsigned_mul1();
    
    parameter DATAWIDTH=8;
    reg clk;
    
    reg   [DATAWIDTH-1:0] Ain,Bin;
    
    wire   [DATAWIDTH*2-1:0] result;
    initial
    	begin
    		Ain = 5;
    		Bin = 3;
    		clk = 0;
    	end
    always #5 clk = ~clk;
    always @(posedge clk)
    	begin
    		#110
    		Ain = Ain+2;
    		Bin = Bin+1;
    	end
    unsigned_mul_1 #(.DATAWIDTH( DATAWIDTH)) u1(clk,Ain,Bin,result);
    endmodule
    

    3、仿真结果
    在这里插入图片描述
    可以看出,输出延迟输入10个时钟周期,这和程序是对应的。

    二、移位相加乘法器—流水线形式

    1、RTL代码

    module unsigned_mul_2(
                 mul_a,
                 mul_b,
                 mul_out,
                 clk,
                 rst_n
                 );
                            
       parameter   MUL_WIDTH  = 8;
       parameter   MUL_RESULT = 16;
      
       input [MUL_WIDTH-1:0]   mul_a;
       input [MUL_WIDTH-1:0]   mul_b;
       input                   clk;
       input                   rst_n;
      
       output [MUL_RESULT-1:0]   mul_out;
      
       reg [MUL_RESULT-1:0]   mul_out;
    
       reg [MUL_RESULT-1:0]   stored0;
       reg [MUL_RESULT-1:0]   stored1;
       reg [MUL_RESULT-1:0]   stored2;
       reg [MUL_RESULT-1:0]   stored3;
       reg [MUL_RESULT-1:0]   stored4;
       reg [MUL_RESULT-1:0]   stored5;
       reg [MUL_RESULT-1:0]   stored6;
       reg [MUL_RESULT-1:0]   stored7;
       reg [MUL_RESULT-1:0]   out1,out2;
       reg [MUL_RESULT-1:0]   add1,add2,add3,add4;
     
     always @ ( posedge clk or negedge rst_n )
     begin
        if ( !rst_n )
           begin
    
              stored0 <= 14'b0;
              stored1 <= 14'b0;
              stored2 <= 14'b0;
              stored3 <= 14'b0;
              stored4 <= 14'b0;
              stored5 <= 14'b0;
              stored6 <= 14'b0;
              out1<= 14'b0;
              out2<= 14'b0;
    
              add1 <= 14'b0;
    		  add2 <= 14'b0;
    		  add3 <= 14'b0;
    		  add4 <= 14'b0;
              
           
           end
        else
           begin           
             //注意,下面两句是没有延迟的,因为他们的右侧的mul_a,mul_b是输入信号
    
              stored0 <= mul_b[0] ? {8'b0,mul_a}       : 16'b0;
              stored1 <= mul_b[1] ? {7'b0,mul_a,1'b0}  : 16'b0;
              stored2 <= mul_b[2] ? {6'b0,mul_a,2'b0}  : 16'b0;
              stored3 <= mul_b[3] ? {5'b0,mul_a,3'b0}  : 16'b0;
              stored4 <= mul_b[4] ? {4'b0,mul_a,4'b0}  : 16'b0;
              stored5 <= mul_b[5] ? {3'b0,mul_a,5'b0}  : 16'b0;
              stored6 <= mul_b[6] ? {2'b0,mul_a,6'b0}  : 16'b0;
              stored7 <= mul_b[7] ? {1'b0,mul_a,7'b0}  : 16'b0;
              add1 <= stored1 + stored0;
              add2 <= stored3 + stored2;
              add3 <= stored5 + stored4;
              add4 <= stored6 + stored7;
              out1 <= add1 + add2;
              out2 <= add3 + add4;
              mul_out <= out1 + out2;
    
         end
    
     end
    
     endmodule
    

    2、仿真程序

    `timescale 1ns / 1ps
    
    module tb_unsigned_mul2();
    reg   clk,rst_n;
    reg   [7:0] Ain,Bin;
    wire  [15:0] result;
    initial
    	begin
    		#1
    		Ain = 5;
    		Bin = 2;
    		clk = 0;
    		rst_n=0;
    		#3
    		rst_n=1;
    	end
    always #5 clk = ~clk;
    always @(posedge clk)
    	begin
    		#1
    		Ain = Ain + 2;
    		Bin = Bin + 1;
    	end
    unsigned_mul_2 u2(Ain,Bin,result,clk,rst_n);
    endmodule
    

    3、仿真结果

    在这里插入图片描述
    可以看出,由于采用了三级流水线,因此输出延迟输入3个时钟周期。

    展开全文
  • 参考别人的代码,自己修改了一下。
  • C/C++中32有符号整数(int32_t)转为4个无符号8位整数 1.位数转换的基本原理就是利用计算机中原码,反码,补码的关系, 其原理可以参考下面这篇博客:https://blog.csdn.net/qq_26392163/article/details/84872165...

    C/C++中32位有符号整数(int32_t)转为4个无符号8位整数

    1.位数转换的基本原理就是利用计算机中原码,反码,补码的关系,
    其原理可以参考下面这篇博客:https://blog.csdn.net/qq_26392163/article/details/84872165。该博客详细的介绍了其原理。
    下面将介绍两种实用的方法:
    方法一:char buf1, buf2, buf3, buf4
    buf1 = x>>24;
    buf2 = x>>16;
    buf3 = x>>8;
    buf4 = x;

    // An highlighted block
    int x = -2122350722;
    char buf1, buf2, buf3, buf4
    buf1 = x>>24;
    buf2 = x>>16;
    buf3 = x>>8;
    buf4 = x;
    //若转为int可直接赋值即可
    int b1, b2, b3, b4
    b1 = x>>24;
    b2 = x>>16;
    b3 = x>>8;
    b4 = x;
    

    结果:129 127 127 126
    注意:该方法转换的过程是由低位到高位的进行的。

    方法二:利用SSE指令集:

    int32_t test[4] = {-2122350722, -2122350722, -2122350722,
    -2122350722} ;
    __mm128i xmm1 = _mm_load_si128(test);
    int xmt0 = (int)_mm_extract_epi8(xmm1,0);
    int xmt1 = (int)_mm_extract_epi8(xmm1,1);
    int xmt2 = (int)_mm_extract_epi8(xmm1,2);
    int xmt3 = (int)_mm_extract_epi8(xmm1,3);
    

    结果:126 127 127 129
    注意:该方法转换的过程是由高位到低位的进行的。

    展开全文
  • 比如说8位的单片机无符号数最大值为255,有符号最大数为127;16单片机无符号数最大值为65535,有符号数最大值为32767.对于32的单片机来说,因为我们一般所处理的值很少能超过有符号数的最大取值,所以比较少遇到下面...
  • verilog 实现8位无符号除法器

    千次阅读 2020-10-03 13:51:05
    而二进制因为只有两种可能所以不需要那么麻烦(但其实两者的本质是一样的,算法的时间复杂度相同) 流程图: 根据以上所述的32除法器的算法原理,下面来实现一下8位除法器。 二、代码实现 1、组合逻辑方式实现 RTL...
  • 今天在做公司大数据分析时遇到个坑,某些数据莫名其妙变得特别大: 最终定位出原因在这个强转这里当8位有符号数扩展为64位无符号数时,底层汇编实际上使用的是movsx带符号扩展指令,意思就是扩展的那些都用符来...
  • 计算机中的符号位 1.数据类型的最高用于标识数据的符号 最高为1,表明这个数为负数 最高为0,表明这个数为正数 验证计算机用最高表示符号位 结果为 : 2. 有符号数的表示法 在计算机内部用 补码 表示...
  • 我们发现,无符号数的最小值就为向量[000...0],就是0,而无符号数的最大值用[111...1]来表示,因此 , 例如 。 另外,还有一个特性,介于 之间的每一个数都会对应唯一的一个w值。 补码编码 在许多...
  • 这是个16进制字符串转无符号8位整数后再转成有符号的8整数的过程, 之所以这么转是因为直接ParseInt(s, 16, 8)会抛出异常, 因为默认的strconv的ParseInt貌似不支持负数和浮点数的解析, 所以先将其转成uint64, ...
  • 一个简单的二进制转为十进制,包括有符号无符号位的两种转换方式。
  • Java –将字节转换为无符号字节

    千次阅读 2020-06-03 22:42:04
    在Java中, byte是8位带符号(正和负)数据类型,其值从-128 (-2... 要创建一个无符号字节,我们可以将该byte转换为一个int并使用0xff屏蔽(按和)新的int以获取最后8位或防止符号扩展。 byte aByte = -1; int...
  • 三星9454实现两个无符号的八位二进制数相乘
  • 因为无符号的计算嘛就不管位宽,直接相加,不存在问题。主要是有符号的相加得严格对齐,不然结果会出错,然后是二进制乘法,利用拼接符,像乘以64就是{d1[7],d1,6’d0}。d1[7]是防止d1为有符号数并且是负数时计算...
  • 题目大意:给你两个带符号的16进制数A和B,输出A+B 思路:A和B比较大,用64整数来存储,输入的时候用...o 以进制形式输出无符号整数(不输出前缀O) x 以十六进制形式输出无符号整数(不输出前缀OX) u 以十进制形式...
  • 问题:以无符号八进制形式输出负数-128: 2. 解释-从结果出发 得到进制的结果: 37777777600 进制转换为二进制: 011 111 111 111 111 111 111 111 110 000 000 二进制以8位为一组: 11111111 11111111 ...
  • 1字节最大值为什么是2的8次方-1,范围0-255
  • js实现无符号整数按取反

    千次阅读 2021-09-13 22:37:30
    前言 最近有一段时间没写文章了,工作上比较忙,刚好今天有人问到我这个问题,我就去补了一下功课。然后在js上实现了一下。...unsigned char 是无符号字符型也是8位,它没有符号,最高是数据,比如1=0b00000.
  • 浮点数和无符号整型互转

    千次阅读 2020-03-14 11:55:16
    #include <stdio.h> union my_union // 共用体 { unsigned int i; float f; }; unsigned int float_to_uint(float f); float uint_to_float(unsigned int i); int main(void) { ... ...
  • //32位无符号类型取其8位 #define BREAN_UINT32(var, byteNum) \ (uint8_t)((uint32_t)((var) >> ((byteNum) * 8) & 0x00FF)) // #define BUILD_UINT32(byte0, byte1, byte2, byte3) \ ((uint32_t...
  • C++ 64位无符号整型的输出格式

    千次阅读 2019-03-28 11:06:13
    xnLogWarning(XN_MASK_SENSOR_READ, "Rotation coast %llu miliSeconds", nEnd - nBegin); %llu 是64位无符号整数的输出格式。
  • 2.汇编求无符号数的平均数

    千次阅读 2021-01-22 16:50:05
    试求内部RAM30H~37H单元中8无符号数的算术平均值,结果存入38H。 问题分析以及求解思路 待完善(请耐心等待) 程序代码 ORG 0000H MOV 30H,#0FFH MOV 31H,#0FFH MOV 32H,#0FFH MOV 33H,#0FFH MOV 34H,#0FFH MOV...
  • 无符号数 0 ( 0 -1 == -1 ?)

    千次阅读 2017-04-09 09:38:04
    无符号数(unsigned number) 是相对于有符号数而言的,指的是整个机器字长的全部二进制均表示数值,相当于数的绝对值。 有符号数(signed number) 和无符号数基本相同,不同的是:一般用最高有效...
  • 有符号数和无符号数详解

    千次阅读 2020-05-10 13:47:41
    有符号 无符号 -1 和 0xFFFFFFFF 问题1. 通过例子看问题2. 有符号数和无符号数2.1 什么是无符号数 ?2.2 什么是有符号数 ?3. 原码、反码、补码3.1 背景3.2 原码、反码、补码3.2.1 什么是机器数?3.2.2 什么是真值?...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 275,849
精华内容 110,339
关键字:

无符号8位