tag 标签: 整型转浮点

相关博文
  • 热度 40
    2015-5-18 10:57
    7460 次阅读|
    10 个评论
    近期小梅哥的项 目要使用到整型数据转浮点型数据,将16位的整数转换为单精度浮点数(32bit)。本打算自己写逻辑实现的,不过考虑到本身项目时间紧,能力也有限,就 没有贸然行事。再说了,Quartus II软件中也给我们免费提供了专用的浮点转换IP。因此就直接使用该IP核来进行设计。     通过阅读Altera提供的Floating-Point IP Cores User Guide中相关章节,了解到该浮点IP包含以下功能:          整型转浮点(Integer-to-Float);          浮点转整型(Float-to-Integer);          浮点转浮点(Float-to-Float);          定点转浮点(Fixed-to-Float);          浮点转定点(Float-to-Fixed)。      本次我的项目需要使用到的功能为定点转浮点类型。因此这里只记录定点转浮点功能的测试。     小梅哥使用的是Quartus II13.0的软件,这里先介绍如何在Quartus II工程中调用添加ALTFP_CONVERT的IP核。   1、打开兆功能核向导: 2、在向导中选择新建一个用户兆功能核并点击next:   3、在Arithmetic(1)下选择ALTFP_CONVERT(2)核,并选择生成语言为Verilog(3),给IP核命一个名字(4),然后点击next(5): 4、等待大约20秒左右,打开浮点IP核的参数配置选项卡,在选项卡中,Operationmode选择An integer to a floating point(1),Integer data选择32bits(2),然后点击next: 5、设置output floating point Setting为single precision(32bits)(1),然后点击next:   6、为模块添加一个异步清零信号(1),当然这里如果不添加这个信号一般情况下使用也没有问题,勾选后点击next:   7、仿真模式设置界面,这里不需要勾选生成网表,因此直接点击next即可。 8、点击finish即可完成IP核的生成。 9、在Quartus II工程中,添加此IP核 的qip文件(fpconvert.qip)到工程中来。   10、将fpconvert.v文件设置为工程顶层文件: 11、为该IP核编写testbench文件,这里暂时不进行全面覆盖的仿真测试,只是随机取几个值进行转换,并查看仿真结果,testbench代码如下所示:   01  `timescale 1ns / 1ns 02 03  module tb ; 04 05      reg    aclr ; 06      reg    clock ; 07      wire      dataa ; 08      wire      result ; 09      10      reg data ; 11      12      fpconvert fpconvert ( 13          aclr , 14          clock , 15          dataa , 16          result 17      ); 18      19      initial clock = 1 ; 20      always   # 10 clock = ~ clock ; 21      22      assign dataa = data ?{ 16'hffff , data }:{ 16'h0000 , data }; 23      24      initial begin 25          aclr = 1'b1 ; 26          # 50 ; 27          aclr = 1'b0 ; 28          data = 32'd0 ; 29          # 100 ; 30          begin 31              data = 128 ; 32              # 200 ; 33              data = - 128 ; 34              # 200 ; 35              data = 3456 ; 36              # 200 ; 37              data = - 3456 ; 38              # 200 ;        39          end 40          $stop ; 41      end 42 43  endmodule 44 由于在实际 使用中我们的输入数据为16位的有符号整型数,而该IP核的输入为固定的32位整型数,因此需要进行16位有符号数到32位有符号数之间的转换。转换代码 如第22行所示。16位的有符号整型数,其最高位为符号位即data ,而在32位的有符号整型数中,也是最高位为符号位,即dataa 。 因此,如果直接将16位的有符号数据输入到32位的有符号整型数据端口,则势必会发生错误,因此,这里根据data的符号位data 的值来对 dataa的 高16位进行补全操作,若data 为1,则将dataa 全部填1,若data 为0,则将dataa 全部填0 即可。   使用以上testbench对该IP核的仿真结果如下图所示 :( 点击图片可查看高清原图哦 )   这里,通过仿真, 对Altera提供的浮点数据转换IP核的性能进行了测试验证。同时,Altera还提供了很多其它好用的浮点IP,我们都可以通过仿真方式来对其进行功 能的验证和性能的分析。一转眼,小梅哥已经半年没有在EDNChina上写过博客了。时隔半年,再来发文,希望大家能够给我多多鼓励,让我继续坚持下去。
  • 热度 17
    2015-5-15 17:46
    6204 次阅读|
    1 个评论
        近期小梅哥的项目要使用到整型数据转浮点型数据,将16位的整数转换为单精度浮点数(32bit)。本打算自己写逻辑实现的,不过考虑到本身项目时间紧,能力也有限,就没有贸然行事。再说了,Quartus II软件中也给我们免费提供了专用的浮点转换IP。因此就直接使用该IP核来进行设计。     通过阅读Altera提供的Floating-Point IP Cores User Guide中相关章节,了解到该浮点IP包含以下功能:          整型转浮点(Integer-to-Float);          浮点转整型(Float-to-Integer);          浮点转浮点(Float-to-Float);          定点转浮点(Fixed-to-Float);          浮点转定点(Float-to-Fixed)。      本次我的项目需要使用到的功能为定点转浮点类型。因此这里只记录定点转浮点功能的测试。     小梅哥使用的是Quartus II13.0的软件,这里先介绍如何在Quartus II工程中调用添加ALTFP_CONVERT的IP核。   1、打开兆功能核向导: 2、在向导中选择新建一个用户兆功能核并点击next:   3、在Arithmetic(1)下选择ALTFP_CONVERT(2)核,并选择生成语言为Verilog(3),给IP核命一个名字(4),然后点击next(5): 4、等待大约20秒左右,打开浮点IP核的参数配置选项卡,在选项卡中,Operationmode选择An integer to a floating point(1),Integer data选择32bits(2),然后点击next: 5、设置output floating point Setting为single precision(32bits)(1),然后点击next:   6、为模块添加一个异步清零信号(1),当然这里如果不添加这个信号一般情况下使用也没有问题,勾选后点击next:   7、仿真模式设置界面,这里不需要勾选生成网表,因此直接点击next即可。 8、点击finish即可完成IP核的生成。 9、在Quartus II工程中,添加此IP核 的qip文件(fpconvert.qip)到工程中来。   10、将fpconvert.v文件设置为工程顶层文件: 11、为该IP核编写testbench文件,这里暂时不进行全面覆盖的仿真测试,只是随机取几个值进行转换,并查看仿真结果,testbench代码如下所示:   01  `timescale 1ns / 1ns 02 03  module tb ; 04 05      reg    aclr ; 06      reg    clock ; 07      wire      dataa ; 08      wire      result ; 09      10      reg data ; 11      12      fpconvert fpconvert ( 13          aclr , 14          clock , 15          dataa , 16          result 17      ); 18      19      initial clock = 1 ; 20      always   # 10 clock = ~ clock ; 21      22      assign dataa = data ?{ 16'hffff , data }:{ 16'h0000 , data }; 23      24      initial begin 25          aclr = 1'b1 ; 26          # 50 ; 27          aclr = 1'b0 ; 28          data = 32'd0 ; 29          # 100 ; 30          begin 31              data = 128 ; 32              # 200 ; 33              data = - 128 ; 34              # 200 ; 35              data = 3456 ; 36              # 200 ; 37              data = - 3456 ; 38              # 200 ;        39          end 40          $stop ; 41      end 42 43  endmodule 44 由于在实际使用中我们的输入数据为16位的有符号整型数,而该IP核的输入为固定的32位整型数,因此需要进行16位有符号数到32位有符号数之间的转换。转换代码如第22行所示。16位的有符号整型数,其最高位为符号位即data ,而在32位的有符号整型数中,也是最高位为符号位,即dataa 。因此,如果直接将16位的有符号数据输入到32位的有符号整型数据端口,则势必会发生错误,因此,这里根据data的符号位data 的值来对dataa的 高16位进行补全操作,若data 为1,则将dataa 全部填1,若data 为0,则将dataa 全部填0即可。   使用以上testbench对该IP核的仿真结果如下图所示 :( 点击图片可查看高清原图哦 )   这里,通过仿真,对Altera提供的浮点数据转换IP核的性能进行了测试验证。同时,Altera还提供了很多其它好用的浮点IP,我们都可以通过仿真方式来对其进行功能的验证和性能的分析。一转眼,小梅哥已经半年没有在EDNChina上写过博客了。时隔半年,再来发文,希望大家能够给我多多鼓励,让我继续坚持下去。