http://blog.chinaaet.com/justlxy/p/5100053166大佬博客,讲的非常有条理的

1,基础知识

(1)定点数的基础认知:

首先例如一个16位的数表示的定点数的范围是:(MAX:16‘d32767 MIN: -32767#2^15-1#’)最高位符号位,三位整数位,其余的12位是小数位的话,那么

它的精度有小数部分决定:1/4096=0.0244140625

可表示数的范围为:(0.0244140625*4095)=0.999755859375,然后加上整数的最大表示值7,即极限最大值为7.999755859375。

(2)浮点数的认知

浮点数就是指整数和小数位数不确定的数字的表达,实际上采用的就是咱们常用的科学计数法。如1.23*10^2采用的是基数(10),指数(2),尾数(1.23)以及一个符号位来表示。这里实际上是采用指数方法实现了小数点的浮动。

在 IEEE 标准中,浮点数是将特定长度的连续字节的所有二进制位分割为特定宽度的符号域,指数域和尾数域三个域,其中保存的值分别用于表示给定二进制浮点数中的符号,指数和尾数。这样,通过尾数和可以调节的指数(所以称为"浮点")就可以表达给定的数值了。具体的格式参见下面的图例:

上图中可以看出S表示符号位,EXponent表示指数位,也就是“浮动”的指数位,指数的范围在32位的系统中(0-2^8 -1)/2 也就是0-127,在double型位2^11位浮动指数。

2.FPGA浮点数的定点化

首先明确输入的浮点数是什么格式的:其次明白要输出的定点数又是怎样的,最后两者之间的转换也就明了了:

输入的浮点数是::f[31:0]表示一个单精度32位浮点数,f[31]是符号位,其为‘0’表示正数、为‘1’表示负数;f[30:23]这8位为指数位,为了能表示负指数,将在实际指数的基础上加上127得到的结果存入f[30:23];f[22:0]表示小数位(尾数),类似科学计数法,不过采用了省略整数位(2进制的科学计数法整数位必定是1)1。那么这个浮点数要转换成定点数,就需要先判断指数位与127的关系,小于127,则说明该指数位是正数,那么转化成定点数的话就需要将{8'd1,float_in[22:0]}右移127-float_in[30:23]位,否则左移float_in[30:23]-127位。

代码稍微贴一下

module float2fixed_pipeline
(
input [:] float_in,
input enable,
input clk,
input rst,
output reg [:] fixed_out,
output reg valid
); reg [:] M_copy;
reg [:] shift_value;
reg shift_direction; //0, shift left; 1, shift right
reg sign; //符号位
reg valid_count; // Pipeline level 1
always @ (posedge clk or posedge rst) begin //synchronous enable and asynchronous reset
if(rst) begin
shift_value <= 'd0;
shift_direction <= 'b0;
sign <= 'b0;
M_copy <= 'd0;
end
else if(enable) begin
sign <= float_in[];
M_copy <= {'d1,float_in[22:0]}; if(float_in[:] <= 'd127) begin //E <= 127,shfit {1'b1,M} right to get I(指数) and F(小数)
shift_direction <= 'b1;
shift_value <= 'd127 - float_in[30:23];
end
else begin //E > 127,shfit {1'b1,M} left to get I and F
shift_direction <= 'b0;
shift_value <= float_in[:] - 'd127;//2^7-1
end
end
else begin //enable = 0, Maintain the previous value
shift_value <= shift_value;
shift_direction <= shift_direction;
sign <= sign;
M_copy <= M_copy;
end
end // Output logic
always @ (posedge clk or posedge rst) begin //synchronous enable and asynchronous reset
if(rst) begin
fixed_out <= 'd0;
end
else if(enable) begin
if(shift_direction) begin //E <= 127,shfit {1'b1,M} right to get I and F
fixed_out <= {sign,M_copy >> shift_value};
end
else begin //E > 127,shfit {1'b1,M} left to get I and F
fixed_out <= {sign,M_copy << shift_value};
end
end
else begin //enable = 0, Maintain the previous value
fixed_out <= fixed_out;
end
end // The valid output logic
always @ (posedge clk or posedge rst) begin //asynchronous reset
if(rst) begin
valid <= 'b0;
valid_count <= 'd0;
end
else if(enable) begin
if(valid_count == 'd1) begin //Maintain valid as ture unless reset
valid <= 'b1;
valid_count <= valid_count;
end
else begin
valid_count <= 'b1;
valid <= 'b0;
end
end
else begin //enable = 0, Maintain the previous value
valid <= valid;
valid_count <= valid_count;
end
end endmodule

3.FPGA定点数的浮点化

也是想明白输入的定点数格式为最高位是符号位,然后紧接着8位整数位,最后是23位小数位。我们需要注意的是转换后的输出的浮点数最高位符号位,然后是8位的指数位,最后是23位小数位,其表达的浮点数的大小为

,将小数位从高到低依次存入f[22:0]的从高到低的位数,不足23位则在末尾补0,例如小数位只有“10011001”则f[22:0]="10011001000000000000000",这样就可以用23位存储空间表示24位的数据,变相增加了精度。另外还有一些特殊编码,如无穷大、0、NAN和非正规数,这里没有考虑,待以后用到再细究吧。

手算整理思路:

首先是浮点数的指数位的确定:看定点数整数部分的最高非零位的位置N,那么exp=N-1,

然后是浮点数的小数位的确定:这里用到了127这个所谓的偏置数以及流水线的设计方法:

// Output logic
always @ (posedge clk or posedge rst) begin //synchronous enable and asynchronous reset
if(rst) begin
float_out <= 'd0;
end
else if(enable) begin
if(fixed_shift_reg3[] == 'b1) begin
float_out <= {fixed_shift_reg3[],8'd127 - shift_count3 - 8'd1 + ((shift_direction3) ? 'd8 : 8'd0),fixed_shift_reg3[:],'d0};
end
else if(fixed_shift_reg3[] == 'b1) begin
float_out <= {fixed_shift_reg3[],8'd127 - shift_count3 - 8'd2 + ((shift_direction3) ? 'd8 : 8'd0),fixed_shift_reg3[:],'d0};
end
else if(fixed_shift_reg3[] == 'b1) begin
float_out <= {fixed_shift_reg3[],8'd127 - shift_count3 - 8'd3 + ((shift_direction3) ? 'd8 : 8'd0),fixed_shift_reg3[:],'d0};
end
else begin //The fixed-point input is zero, -0 will be cast to 0 too.
float_out <= {'b0,8'd127,'d0};
end
end
else begin //enable = 0, Maintain the previous value
float_out <= float_out;
end
end

小数位的移动在三级流水线中分别根据的是fixed_in[22:11],fixed_shift_reg1[22:17],fixed_shift_reg1[22:20].不等于0的时候不移位,直接拼接,等于0的时候分别移位12,6,3位,将每级流水线中的移位次数记录下来为shift_count3.。。。。。。

关于流水线的verilog基础还是不扎实,所以下一篇接上流水线的解剖~

FPGA浮点数定点数的处理的更多相关文章

  1. FPGA浮点数定点化

    因为在普通的fpga芯片里面,寄存器只可以表示无符号型,不可以表示小数,所以在计算比较精确的数值时,就需要做一些处理,不过在altera在Arria 10 中增加了硬核浮点DSP模块,这样更加适合硬件 ...

  2. FPGA 浮点定点数的处理

    大纲: 1浮点数的格式指定 2浮点数的运算(加法) 3浮点数加减法器的实现(难于乘除法器的实现)  1. 在FPGA的设计中,浮点数的概念不同于C语言中的定义,这里的浮点数指的是小数点位置会发生变化的 ...

  3. FPGA大疆考试准备内容

    1.寄存器与锁存器 锁存器:电平触发的存储单元,在有效电平时间里可以多次改变数据. 优点:    占触发器资源少,缺点是容易产生毛刺.(附上去毛刺的方法:格雷码计数器(*https://blog.cs ...

  4. IP核引发的关于定,浮点数的认识

    上面是一段关于CORDIC_IP测试文件,用于计算给定角度的sin值和cos值,关于数值表示规则在此不再重复,仅仅说明以下3点: 1  数采用原码,反码,补码,本身并没有正确与否之分(这一点很重要,我 ...

  5. MySQL用户管理及SQL语句详解

    1.1 MySQL用户管理 1.1.1 用户的定义 用户名+主机域 mysql> select user,host,password from mysql.user; +--------+--- ...

  6. 【重学计算机】计组D2章:数据表示

    1.基本概念 真值:+0101,-0100:机器数: [x]原=0101 2.几种机器数 原码:x = -0101,[x]原 = 1101 反码:x = -0101,[x]反 = 1010 补码:x ...

  7. MySQL数据类型1

    1.float.double.decimal类型用法详解 三者的区别介绍 float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位) double:双精度实型, ...

  8. 【转】MySQL用户管理及SQL语句详解

    [转]MySQL用户管理及SQL语句详解 1.1 MySQL用户管理 1.1.1 用户的定义 用户名+主机域 mysql> select user,host,password from mysq ...

  9. NOIP2018 No regrets youth

    NOIP2018在即,20181009总结一些易错的知识点和解题方法 ——by ljc20020730 HGOI NOIP2018 No regrets youth ! NOIP2018 No reg ...

随机推荐

  1. CodeForces-1100C NN and the Optical Illusion 简单数学

    题目链接:https://vjudge.net/problem/CodeForces-1100C 题意: 题目给出外部圆的数目n和内部圆的半径r,要求求出外部圆的半径以满足图片要求. 显然这是一道数学 ...

  2. Thread--lock,lockInterruptibly,tryLock,tryLock(long timeout, TimeUnit unit)

    参考:http://www.dewen.net.cn/q/9077 http://coolxing.iteye.com/blog/1236909 lock,tryLock,lockInterrupti ...

  3. App的布局管理

    今天学习了布局管理器,格局自己的学习内容和课程,我主要学习了两种管理布局方式 一:LinearLayout线性布局 线性布局是指布局里面的内容成线性排列,有两种排列方式,横向排列和纵向排列,而排列方式 ...

  4. [CF百场计划]#2 Codeforces Round #618 (Div. 2)

    A. Non-zero Description: Guy-Manuel and Thomas have an array \(a\) of \(n\) integers [\(a_1, a_2, \d ...

  5. MySQL--事务,隔离性和隔离级别

    事务 事务就是一组数据库操作,要么全部执行成功,要么全部执行失败,在MySQL中,事务是依靠存储引擎层实现的. ACID(Atomicity,Consistency,Isolation,Durabil ...

  6. 109.大型的csv文件的处理方式

    HttpResponse对象将会将响应的数据作为一个整体返回,此时如果数据量非常大的话,长时间浏览器没有得到服务器的响应,就会超过默认的超时时间,返回超时.而StreamingHttpResponse ...

  7. goweb-模板引擎

    模板引擎 Go 为我们提供了 text/template 库和 html/template 库这两个模板引擎,模板引 擎通过将数据和模板组合在一起生成最终的 HTML,而处理器负责调用模板引擎并将引 ...

  8. 微服务项目开发学成在线_day03 CMS页面管理开发

    springboot引入mangodb依赖坐标:在spring-boot集成条件下,使用mongodb的DAO层开发. swagger查看接口文档,请求地址:http://localhost:3100 ...

  9. ORBSLAM2的资源

    ORBSLAM2代码总结 https://blog.csdn.net/hzwwpgmwy/article/details/82462988 ORBSLAM2局部地图更新实现 https://blog. ...

  10. 利用 wave 库 对音频进行格式处理

    import wave r = r"D:\沫沫酱 - 旧伤口.wav" # 一个.wav格式文件 with wave.open(r, "rb") as f: # ...