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 [31:0] float_in,input enable,input clk,input rst,output reg [31:0] fixed_out,output reg valid);reg [30:0] M_copy;reg [4:0] shift_value;reg shift_direction;        //0, shift left; 1, shift rightreg sign;                   //符号位reg valid_count;// Pipeline level 1always @ (posedge clk or posedge rst) begin //synchronous enable and asynchronous resetif(rst) beginshift_value <= 5'd0;shift_direction <= 1'b0;sign <= 1'b0;M_copy <= 31'd0;endelse if(enable) beginsign <= float_in[31];M_copy <= {8'd1,float_in[22:0]};if(float_in[30:23] <= 8'd127) begin    //E <= 127,shfit {1'b1,M} right to get I(指数) and F(小数)shift_direction <= 1'b1;shift_value <= 8'd127 - float_in[30:23];endelse begin                            //E > 127,shfit {1'b1,M} left to get I and Fshift_direction <= 1'b0;shift_value <= float_in[30:23] - 8'd127;//2^7-1end         endelse begin        //enable = 0, Maintain the previous valueshift_value <= shift_value;shift_direction <= shift_direction;sign <= sign;M_copy <= M_copy;endend// Output logicalways @ (posedge clk or posedge rst) begin //synchronous enable and asynchronous resetif(rst) beginfixed_out <= 32'd0;endelse if(enable) begin if(shift_direction) begin        //E <= 127,shfit {1'b1,M} right to get I and Ffixed_out <= {sign,M_copy >> shift_value};endelse begin                        //E > 127,shfit {1'b1,M} left to get I and Ffixed_out <= {sign,M_copy << shift_value};endendelse begin        //enable = 0, Maintain the previous valuefixed_out <= fixed_out;endend// The valid output logicalways @ (posedge clk or posedge rst) begin    //asynchronous resetif(rst) beginvalid <= 1'b0;valid_count <= 1'd0;endelse if(enable) beginif(valid_count == 1'd1) begin    //Maintain valid as ture unless resetvalid <= 1'b1;valid_count <= valid_count;endelse beginvalid_count <= 1'b1;valid <= 1'b0;endendelse begin        //enable = 0, Maintain the previous valuevalid <= valid;valid_count <= valid_count;endend    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 logicalways @ (posedge clk or posedge rst) begin //synchronous enable and asynchronous resetif(rst) beginfloat_out <= 32'd0;endelse if(enable) beginif(fixed_shift_reg3[22] == 1'b1) beginfloat_out <= {fixed_shift_reg3[23],8'd127 - shift_count3 - 8'd1 + ((shift_direction3) ? 8'd8 : 8'd0),fixed_shift_reg3[21:0],1'd0};endelse if(fixed_shift_reg3[21] == 1'b1) beginfloat_out <= {fixed_shift_reg3[23],8'd127 - shift_count3 - 8'd2 + ((shift_direction3) ? 8'd8 : 8'd0),fixed_shift_reg3[20:0],2'd0};endelse if(fixed_shift_reg3[20] == 1'b1) beginfloat_out <= {fixed_shift_reg3[23],8'd127 - shift_count3 - 8'd3 + ((shift_direction3) ? 8'd8 : 8'd0),fixed_shift_reg3[19:0],3'd0};endelse begin    //The fixed-point input is zero, -0 will be cast to 0 too.float_out <= {1'b0,8'd127,23'd0};end        endelse begin        //enable = 0, Maintain the previous valuefloat_out <= float_out;endend

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

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

转载于:https://www.cnblogs.com/Dinging006/p/9450577.html

FPGA浮点数定点数的处理相关推荐

  1. 直播视频回放 | FPGA中定点数和浮点数

    直播视频 | FPGA中定点数和浮点数 昨天临时发了个直播通知,FPGA公开直播课临时通知! 晚上7:00直播,探讨FPGA中定点数和浮点数相关知识点. 有近2000人全程跟下来了,发言提问也比较积极 ...

  2. verilog 浮点数转定点数_FPGA浮点数定点数的处理

    http://blog.chinaaet.com/justlxy/p/5100053166大佬博客,讲的非常有条理的 1,基础知识 (1)定点数的基础认知: 首先例如一个16位的数表示的定点数的范围是 ...

  3. (82)FPGA面试题-FPGA浮点数的定点化(二)

    1.1 FPGA面试题-FPGA浮点数的定点化(二) 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-FPGA浮点数的定点化(二): 5)结束语. 1.1 ...

  4. FPGA对定点数的处理 作业

    作业1 • 使用二进制表示数字,是计算机科学中最基本的问题之一. • 使用FPGA进行数学运算,本质上就是要把数学模型.公式,映射成数字电路. • 用FPGA实现定点数运算,对于设计运算单元电路很重要 ...

  5. FPGA浮点数定点化

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

  6. 【FPGA】定点数 数据位宽 运算 位宽截取

    在FPGA中,经常使用定点数表示小数,在进行各种运算时,定点数的位宽会发生变化,并且需要在适当地时候对数据的位宽进行截取. 运算要求和引起的位宽变化 假设存在两个数A.B,假定A位宽为m,小数位宽为a ...

  7. fpga——浮点数加减法

    算法: 公式:表示的浮点数大小是:X=(-1)^sign * 1.fraction * 2^(exponent - bias). sign=正负(0为正,1为负) fraction=X转成二进制后除去 ...

  8. verilog 定点数、浮点数是什么?怎么表示?怎么做运算?

    目录 1. 定点数 1)定点数概念 2)FPGA中定点数的表示 2. 浮点数 1)浮点数概念 3. VERILOG计算 1)加减法 2)乘法运算 3)其他运算 对于计算机如何表示二进制的定点数的理论, ...

  9. 基于FPGA的浮点数运算

    一.FPGA有两种方法表示浮点数 1.自己定义 最高位为符号位 ,中间n位为整数部分 ,最后m位为小数部分 在计算浮点数的运算时候需要转换为定点数 3.14转换为二级制为:11.00100011 自己 ...

  10. 计组之数据运算:3、定点数、浮点数

    3.定点数.浮点数 定点数: 无符号数: 有符号数: 浮点数: 原码.反码.补码.移码: 应用: 补码的应用 移码的应用 定点数: 无符号数: 有符号数: 浮点数: 原码.反码.补码.移码: 应用: ...

最新文章

  1. 一个简单的blog系统(九) 增加标签和标签页面
  2. [UOJ #167]【UR #11】元旦老人与汉诺塔
  3. linux安装mysql8依赖的环境_CentOS Linux release 8 安装mysql8.
  4. 《JQuery 能干点啥~》第四讲 html() 与 text()的赋值比较
  5. Java生成CSV文件的方法
  6. MySQL的主从复制
  7. python 爬取地址的经度和纬度,并在地图画出散点图/热力图
  8. detecting android sdk, Select Android SDK directory
  9. php 实现 pacs 系统,知名PACS系统VC源码
  10. 手持PDA功能及优势
  11. jekenis+maven(nodejs)+svn自动化部署(前后端)
  12. 蓝牙耳机南卡和JBL哪款好用?半入耳耳机南卡和JBL详细对比评测
  13. 股票交易c接口的开发原理分析
  14. WPF使用转换器(Converter)
  15. 【秋招计划】 15日~18日重邮秋季校园招聘宣讲会计划
  16. 码住收藏 ▏软件测试报告应该包含哪些内容?
  17. Jsoup+JavaMail实现自动投票,验证邮箱功能
  18. QT小项目--头脑风暴
  19. 信息安全的主要威胁有什么?
  20. 大数据模型研究报告pdf_高速公路大数据模型研究.PDF

热门文章

  1. WePhone开发者被逼自杀案续,在翟欣欣身上的各种消费清单明细及细节曝光
  2. 如果赚钱很容易,为什么轮到你?
  3. Google 又有新动作了
  4. Studio系列教程来啦
  5. easypoi中excel注解开关_easypoi: 入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法...
  6. Object-c 协议@protocol(@required、@optional)
  7. 《cut命令》-linux命令五分钟系列之十九
  8. windows进程间通信
  9. C# aspx 数据绑定集中(待修改)
  10. DotNetNuke 中文乱码问题的解决