FPGA中二进制数的运算

一、B比特的二进制数可以表示的范围

无符号整数:0~2B-1
有符号整数:-2B-1~2B-1-1

二、十进制数与有符号数(补码)之间的转换

  • 二进制数转换为十进制数
    FPGA中二进制数的运算_第1张图片

D:十进制数
B:二进制数aB-1aB-2···a1a0的位数
aB-1:符号位

  • 十进制数转换成二进制数
% ---------------------------------------------
% 注意,以将十进制数量化位12位二进制数为例
% -1~1
% -(2^11-1)~(2^11-1)
% 另需一位符号位,共12% ---------------------------------------------
clear;clc
load receive.mat

N = 12;
y = receive(1:5000);
y = y/max(y);
y = y*(2^(N-1)-1);
y = round(y);


fid=fopen('receive.txt','w');%打开一个.txt文件

for k=1:length(y)
    B_s=dec2bin(y(k)+(y(k)<0)*2^N,N);

    for j=1:N
       if B_s(j)=='1'
           tb=1;
       else
           tb=0;
       end
       fprintf(fid,'%d',tb);  
    end

    fprintf(fid,'\n');
end

fclose(fid);%关闭文件指针



三、计算二进制数的绝对值

对于二进制正数,绝对值是它本身。
对于二进制负数(补码),求其绝对值的方法为:对该二进制数的所有位(包括符号位)取反,然后加1。
举例:1000_1101(补码),对应十进制数:-115
①取反:0111_0010
②加1:0111_0011,对应十进制数:115
注意:B位有符号数表示的最小数是-2B-1,它的绝对值是2B-1,需要用B位无符号二进制数来表示

四、符号位拓展

在使用vivado的ip核时,AXI4接口的tdata端口位宽往往以字节(8 bit)为单位,此时往往需要补符号位即符号位拓展。
正数:整数高位补0,小数低位补0
负数补码:整数高位补1,小数低位补0

五、signed声明

1.有/无符号数的加法器和乘法器的结构相同,signed的真正作用是决定如何对操作数扩位的问题。

2.任何运算中,不能将有符号数和无符号数混用。必须保证全为有符号变量或者是无符号变量,如果至少存在1个无符号变量,那么整个表达式的运算过程会被当作无符号数运算

六、FIR 滤波器输出位宽

  • 全精度输出位宽
    在这里插入图片描述
    Aw:全精度输出位宽
    Dw:输入数据位宽
    B:由于滤波器的乘加运算而增加的位宽
  • 公式中B的计算方法
    FPGA中二进制数的运算_第2张图片
    N:滤波器系数的个数
    an:滤波器的第n个系数
    对滤波器的系数取绝对值之后求和,计算最少用多少位无符号二进制数来表示这个和。
    这样计算可以得到固定系数的滤波器的真实最大位增长

你可能感兴趣的:(Verilog,数字信号处理,fpga开发)