基于fpga的单精度浮点除法器的设计内容摘要:

块可以使设计的可靠性提高 ,但其资源占用较大 ,综合后的浮点数除法器占用 299 个逻辑单元。 通过分析我们发现 ,由于浮点数尾数的特殊性 ,可以大大简化尾数除法模块。 改进的除法模块将输入的两数据进行比较 ,数据 A 大于数据 B 则输出‘ 1’ ,反之则输出‘ 0’。 将输出的‘ 1’或‘ 0’按位存储在 storage 模块中 ,组合得到除法运算结果。 在对输入数据比较后选择性的进行减法运算 ,得出的结果作为余数移位并存储到 storage1 模块中。 然后 storage1 将余数输 出 ,再与被除数同时为除法模块提供数据输入做循环运算。 经过改进后 ,顶层浮点数除法运算模块的资源占用减 8 少到 125 个逻辑单元 ,节省了 58%的资源。 图 除法器仿真波形图 ( 1) 符号位相减只需取 Sa 和 Sb 的异或,因为同号,则相除输出为正,异号相除输出为负,故输出数据的符号位为 Sa 和 Sb 的异或关系 ( 2) 指数位相减。 即输出的单精度浮点数的指数为,为 dataa和 datab 的指数位之差。 由于单精度浮点数采用的是偏移码,故, eaeb时应先对 Ea 和 Eb 先减去 127,再相减;相减 完成由于要变成规范的单精度浮点进行 输出,故需要再加一个 127 变成偏移码; ( 3) 尾数相乘即 ma/mb。 由于 am 1. aM , am 1. bM ,其中 aM 和bM 为 23 位的二进制数,而最高位 1 为隐藏位,因此两者相除后的应该为 24 位 ( 23 DOWNTO 0) 的二进制数 .所以先把 ma 和 mb 的最高位拼接上‘ 1’得到 24 位的数据,再调用 QuartusII 库里面的 24 位除法器 ,得 到 24 位的商和 24 位的余数,把商截位并按位存储,把余数反馈循环移位做为被除数。 最后取商的高 23 位为结果的 M 位即可。 ( 4) 尾数规格化,需要把尾数相乘的 48 位结果数据变成 24 位的数据,分 3 步进行: ① 两者相乘后的应该为 48 位( 47 DOWNTO 0)的二进制数, 9 且最高两位只有三种情况,即为 01, 10, 11,这可以从十进制来理解, … X 与 … Y 相乘,结果最大也就是 … Z,即整数位为 3 均有可能。 由于最终输出要规范成单精度浮点数,故,当输出的 48 位二进制最高两位为 01 时,显然结果 已经是一个规范的单精度浮点数的形式了,只需用要取 48 位数据的( 45 DOWNTO 23)作为输出即可;当输出的 48 位二进制最高两位为 10 或 11 时,显然由于整数位已经超过 1,故应向阶码进 1,进 1 以后,尾数部分相应应除以 2,即应取 48 位数据的( 46 DOWNTO 24)作为尾数的输出结果。 ② 对尾数进行舍入操作,使尾数为 24 位,包括整数的隐藏位。 ③ 把结果数据处理为 32 位符合 IEEE 浮点数标准的,包括 1位符号位, 8 位结果阶码位,结果 23 尾数位。 5 总体设计 编译与 仿真 清楚了单精度浮点数的乘法 、除法 运算规 则以后,下面将利用VHDL 语言给予描述和仿真。 并最终通过下载到 FPGA 芯片上进行实现。 根据其运算规则可知,应该将输入的 dataa 和 datab 进行分段,分解成符号位,阶码和尾数三段。 并对它们分别进行各自的运算处理。 其实现电路 总体设计数据流程图如下: 其中包括几个部分, 10 被 除 数 D A T A _ A除 数 D A T A _ B数 据 分 解做 除 法 异 或做 减 法DATA_A_MDATA_B_MDATA_A_EDATA_B_EDATA_A_SDATA_B_S数 据 整 合输 出 结 果 图 总体流程图 数据分解部分: 模块 其主要作用为,对输入的 32位单精度浮点数进行分 解成 1 位符号位, 8 位阶码位及 23 位的尾数位进行输出。 由于有两路数据输入,因此,要用到两片数据分离模块。 图 数据分解模块 设计文件如下: LIBRARY IEEE。 USE。 USE。 11 USE。 ENTITY spf32_data_div IS PORT(spfin : IN STD_LOGIC_VECTOR(31 DOWNTO 0)。 s :OUT STD_LOGIC。 e :OUT STD_LOGIC_VECTOR(7 DOWNTO 0)。 m :OUT STD_LOGIC_VECTOR(22 DOWNTO 0) )。 END spf32_data_div。 ARCHITECTURE behav OF spf32_data_div IS BEGIN PROCESS(spfin) BEGIN s=spfin(31)。 e=spfin(30 DOWNTO 23)。 m=spfin(22 DOWNTO 0)。 END PROCESS。 END behav。 阶码相减模块( ) 其主要作用为:对输入的两个 8 位二进制阶码进行求差运算。 在此模块中,采用 VHDL 硬件描述语言编写。 根据 IEEE754 标准,先对输入的阶码 Ea 和 Eb 进行减 127 的运算,其结果再进行求差运算,再进行最后加 127 的运算。 12 图 阶码想减模块 程序源代码如下: library ieee。 use。 use。 use。 entity E_SUB is port( ea:IN STD_LOGIC_VECTOR(7 DOWNTO 0)。 eb:IN STD_LOGIC_VECTOR(7 DOWNTO 0)。 ea_b:OUT STD_LOGIC_VECTOR(7 DOWNTO 0) )。 END E_SUB。 ARCHITECTURE behav of E_SUB is begin ea_b=(ea01111111)(eb01111111)+01111111。 end behav。 end behav。 尾数相除部分 : 模块 其主要作用为:对输入的两个 23 位的尾数进行规范化,即在其前面均加一个‚ 1‛变成 24 位的二进制数。 然后元件例化一个现成的 13 除法器模块进行运算。 其设置为两路输出数据宽度为 24,结果输出宽度为 24。 图 尾数相处模块 程序源代码如下: LIBRARY IEEE。 USE。 USE。 USE。 LIBRARY lpm。 USE。 ENTITY m_divider IS PORT(ma : IN STD_LOGIC_VECTOR(22 DOWNTO 0)。 mb : IN STD_LOGIC_VECTOR(22 DOWNTO 0)。 m。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。