本文目的是记录学习《数字信号处理的FPGA实现》过程中,用verilog语言实现简单的定点数到浮点数转换的经历。

若以f[31:0]表示一个单精度32位浮点数,f[31]是符号位,其为‘0’表示正数、为‘1’表示负数;f[30:23]这8位为指数位,为了能表示负指数,将在实际指数的基础上加上127得到的结果存入f[30:23];f[22:0]表示小数位(尾数),类似科学计数法,不过采用了省略整数位(2进制的科学计数法整数位必定是1)1,将小数位从高到低依次存入f[22:0]的从高到低的位数,不足23位则在末尾补0,例如小数位只有“10011001”则f[22:0]="10011001000000000000000",这样就可以用23位存储空间表示24位的数据,变相增加了精度。另外还有一些特殊编码,如无穷大、0、NAN和非正规数,这里没有考虑,待以后用到再细究吧。

我用verilog语言写的定点数转浮点数模块,实现25位有符号定点整数转化成32位单精度浮点数,并不完全符合标准(例如未考虑特殊编码等),第一步实现补码到原码的转换,第二步计算指数和尾数。

代码如下:

module fix2float(clk,rst_n,ifix,ofloat);

input clk,rst_n;

input  [24:0] ifix;

//reg [24:0] ifix;

output [31:0] ofloat;

reg [24:0] ifix_r;

reg [31:0] ofloat_r;

reg [23:0] ustd_tail;

reg [22:0] std_tail;

reg [7:0] exp;

reg s1,s2;

assign ofloat=ofloat_r;

always@(posedge clk or negedge rst_n)

begin

if(!rst_n)

begin

//ifix<=25'd100;

ofloat_r<=32'd0;

ustd_tail<=23'd0;

exp<=8'd0;

end

else

begin

ustd_tail<=ifix_r[23:0];

s1<=ifix[24];

s2<=s1;

if(ifix[24]==1'b1)

begin

ifix_r<=~ifix+24'd1;

end

else

begin

ifix_r<=ifix;

end

if(ustd_tail[23]==1'b1)

begin

exp<=8'd127+8'd23;

std_tail<=ustd_tail[22:0];

end

else if(ustd_tail[22]==1'b1)

begin

exp<=8'd127+8'd22;

std_tail<={ustd_tail[21:0],1'd0};

end

else if(ustd_tail[21]==1'b1)

begin

exp<=8'd127+8'd21;

std_tail<={ustd_tail[20:0],2'd0};

end

else if(ustd_tail[20]==1'b1)

begin

exp<=8'd127+8'd20;

std_tail<={ustd_tail[19:0],3'd0};

end

else if(ustd_tail[19]==1'b1)

begin

exp<=8'd127+8'd19;

std_tail<={ustd_tail[18:0],4'd0};

end

else if(ustd_tail[18]==1'b1)

begin

exp<=8'd127+8'd18;

std_tail<={ustd_tail[17:0],5'd0};

end

else if(ustd_tail[17]==1'b1)

begin

exp<=8'd127+8'd17;

std_tail<={ustd_tail[16:0],6'd0};

end

else if(ustd_tail[16]==1'b1)

begin

exp<=8'd127+8'd16;

std_tail<={ustd_tail[15:0],7'd0};

end

else if(ustd_tail[15]==1'b1)

begin

exp<=8'd127+8'd15;

std_tail<={ustd_tail[14:0],8'd0};

end

else if(ustd_tail[14]==1'b1)

begin

exp<=8'd127+8'd14;

std_tail<={ustd_tail[13:0],9'd0};

end

else if(ustd_tail[13]==1'b1)

begin

exp<=8'd127+8'd13;

std_tail<={ustd_tail[12:0],10'd0};

end

else if(ustd_tail[12]==1'b1)

begin

exp<=8'd127+8'd12;

std_tail<={ustd_tail[11:0],11'd0};

end

else if(ustd_tail[11]==1'b1)

begin

exp<=8'd127+8'd11;

std_tail<={ustd_tail[10:0],12'd0};

end

else if(ustd_tail[10]==1'b1)

begin

exp<=8'd127+8'd10;

std_tail<={ustd_tail[9:0],13'd0};

end

else if(ustd_tail[9]==1'b1)

begin

exp<=8'd127+8'd9;

std_tail<={ustd_tail[8:0],14'd0};

end

else if(ustd_tail[8]==1'b1)

begin

exp<=8'd127+8'd8;

std_tail<={ustd_tail[7:0],15'd0};

end

else if(ustd_tail[7]==1'b1)

begin

exp<=8'd127+8'd7;

std_tail<={ustd_tail[6:0],16'd0};

end

else if(ustd_tail[6]==1'b1)

begin

exp<=8'd127+8'd6;

std_tail<={ustd_tail[5:0],17'd0};

end

else if(ustd_tail[5]==1'b1)

begin

exp<=8'd127+8'd5;

std_tail<={ustd_tail[4:0],18'd0};

end

else if(ustd_tail[4]==1'b1)

begin

exp<=8'd127+8'd4;

std_tail<={ustd_tail[3:0],19'd0};

end

else if(ustd_tail[3]==1'b1)

begin

exp<=8'd127+8'd3;

std_tail<={ustd_tail[2:0],20'd0};

end

else if(ustd_tail[2]==1'b1)

begin

exp<=8'd127+8'd2;

std_tail<={ustd_tail[1:0],21'd0};

end

else if(ustd_tail[1]==1'b1)

begin

exp<=8'd127+8'd1;

std_tail<={ustd_tail[0],22'd0};

end

else

begin

exp<=8'd127+8'd24;

std_tail<=23'd0;

end

ofloat_r<={s2,exp,std_tail};

end

end

endmodule

verilog 浮点数转定点数_定点数转浮点数verilog相关推荐

  1. verilog 浮点转定点_定点数和浮点数

    定点数 定点数是指,数字在小数点之后和之前具有固定的位数. 可以用Qm.n表示法进行表示. m位为整数部分 n位小数部分 有符号数的总位数N = m + n + 1 当n=0时,则定点数用来存储整数. ...

  2. ieee754浮点数转换工具_关于JS浮点数运算不精确的原因和解决方案

    背景 之前在一个项目中,涉及到了金额,协议组定的标准是按照分的单位进行传递的,但是交互上,web页面中为了更友好的体验,是使用的元作为单位的,这个时候就需要转换一下单位 本来是很简单的一个转化的需求, ...

  3. python浮点数怎么运算_为什么说浮点数缺乏精确性? python中浮点数运算问题

    我想从两个角度回答: 一:十进制小数转化成二进制小数的方法.(简单举例,看完就可以自己用笔进行运算.) 二:如何解决python中的浮点数运算问题. 关于一: 拿1.375这个十进制数举例,pytho ...

  4. verilog 浮点转定点_定点数优化:性能成倍提升

    定点数这玩意儿并不是什么新东西,早年 CPU 浮点性能不够,定点数技巧大量活跃于各类图形图像处理的热点路径中.今天 CPU 浮点上来了,但很多情况下整数仍然快于浮点,因此比如:libcario (gn ...

  5. verilog写操作查询表_电子表的设计——verilog

    电子表的设计包括正常计时模块,LED显示模块,定时报警模块,校时模块,秒表模块. (1)正常计时模块clock module clock(clk,rst,clock_en,second,minute, ...

  6. AIIC学习日记-十进制浮点数预处理为二进制定点数

    文章目录 背景 任务 浮点数是什么 这里用的是定点数,咳咳 netron导出的卷积核数据处理为一列数据 预处理浮点数的代码 十进制浮点数预处理为二进制定点数 补码+原码=2^n 十进制浮点数预处理为二 ...

  7. 定点数和浮点数_Simulink模型中定点数的介绍

    本文摘要: 主要介绍Simulink模型中的定点数的概念,使用注意点,以及定点数与浮点数之间的数据转换. 定点数与浮点数的概念 当我们给Simulink的模块输出设置数据类型时,可以看到有如下的选项: ...

  8. mysql 属于定点数的类型_MySQL浮点数和定点数类型

    MySQL中,存储小数使用的浮点数和定点数类型. 浮点数有两种,单精度浮点类型--FLOAT,双精度浮点数类型--DOUBLE. 定点数只有DECIMAL类型. FLOAT 占用:4字节 有符号:-3 ...

  9. python 浮点数精度丢失_浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源...

    浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源 无论在java python javaScript里面都存在 1+ 2!== 3 问题,这个问题的产生根源在于计算存储数字是二进制,对无限循环小 ...

最新文章

  1. 十种工具审核网络安全
  2. 8月份Github上最热门的Python开源项目
  3. 如何在JavaScript中获取时间戳
  4. java 抽象属性 设计_Java 抽象类与模板设计模式详解
  5. 【Xmail】使用Xmail搭建局域网邮件服务器
  6. GAN 优化 Yelp 形象图片广告
  7. 库ppt演示 python_python操作Power Point:PPT幻灯片布局基础
  8. python 生成器迭代器
  9. 拉勾数据岗位和热门编程语言现状分析
  10. 用环状天线测向电压表鉴相器电路定位的无线电测向仪
  11. background 属性介绍
  12. Go:实现Abs绝对值函数 (附完整源码)
  13. ISA-95/B2MML教程 : 从用例到XML消息的整合实践
  14. Crossplane 和 Terraform 的区别
  15. Solr学习之三:Solr各种查询实例
  16. vuex刷新state数据丢失问题
  17. CTS fail 问题总结
  18. stm32 pwm播放wav格式音乐移植遇到的问题
  19. 调用阿里云发送短信验证码的工具类
  20. CCF201812-1 小明上学 (python语言)

热门文章

  1. 点到平面的距离公式推导
  2. disabled属性
  3. Java实现微信、QQ等群主发红包实例(普通红包)
  4. 在VUE项目中使用SCSS ,对SCSS的理解和使用(简单明了)
  5. rust的矿坑_rust的词汇系统依旧不够良好
  6. 17.5.8 韦伯局部描述符(Weber's Local Descriptor)
  7. 跑步课程导入能力,助力科学训练
  8. 什么是Tor?Tor浏览器更新有什么用?
  9. Mysql之数据库备份与恢复
  10. Java读取txt文件:TSP问题测试算例att48.txt