严淑芹,郑先成
(西北工业大学自动化学院,西安710129)
使用QuartusII这个开发工具进行FPGA设计时,若要在FPGA上实现某个数的开方运算,QuartusII提供了开方模块altfp_sqrt,但是这个模块有严格的使用要求,要求用户输入的被开方数是IEEE754标准浮点数,altfp_sqrt模块的输出结果也是IEEE754标准浮点数。
例如对整数9进行开方运算,用户必须先将整数9转化为IEEE754标准浮点数(41100000)H,将该十六进制数41100000作为模块altfp_sqrt的输入数据,得到模块altfp_sqrt的输出数据(40400000)H,用户必须自己将此IEEE754标准浮点数(40400000)H转化为3,才能最终得知对9进行开方的结果是3。这对于用户来说就有诸多不便。
本文就是在解决用户不便的目标指引下,用VHDL语言将被开方数转化成IEEE754标准浮点数,作为模块altfp_sqrt的输入,再将altfp_sqrt模块的输出IEEE754标准浮点数转化成整数[2]。
对于用户来说,新的开方模块能进行整数的开方运算,如给新的开方模块输入数据9,直接就能得出所需要的结果数据3。这大大方便了用户。
浮点数的表示遵循IEEE754标准[1],它由3部分组成:符号位、尾数以及指数。IEEE754标准规定了单/双精度、扩展单/双精度4种浮点数格式。本设计支持单精度格式。
IEEE754单精度浮点数格式占用32位,包含3个部分:1位符号位、8位带偏移量的指数和23位尾数,如图1所示。
图1 单精度浮点数的表示
其中偏移值(bias)为127,尾数有1位隐藏位。即IEEE754标准定义的单精度浮点数A=(-1)s×1.f×2e-127,s表示有效数的符号,f表示有效数的小数部分,e是加偏移值的指数,1是一个隐藏位。
整数转换为IEEE754标准浮点数的直接方法包括以下步骤:
(2)前零检测:A对应的32位二进制数第一个1前的零的个数i。把小数点前后两部分连起来再去掉头前的1,就是尾数,对于整数而言,小数点后全是0,0的个数要保证尾数是23位,MMM MMMM MMMM MMMM MMMM MMMM
(3)阶码生成。对于单精度数,阶码为:exp=127+(31-i)=158-i。exp对应的8位二进制为EEE EEEE E。
(4)被开方数为正数,符号位s为0。
(5)a对应的IEEE754标准浮点数为SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM
时序仿真波形如图2所示。
图2 整数转化为IEEE754标准浮点数的时序仿真波形
IEEE754标准浮点数转化为整数的流程图如图3 所示[4]:
时序仿真波形图如图4所示。
将运算前标准化模块、altfp_sqrt、浮点数转化成整数模块级联,就得到顶层模块。顶层模块进行整数开方运算的时序仿真波形图如图5所示。
在本研究课题中,需要对发电机进行控制研究。将从发电机采样过来的a相电压数据Va和b相电压数据Vb进行计算,得到有效值,将此有效值输入到PID控制算法模块,得到PWM波去驱动MOSFET。发电机控制系统框图如图6所示。
图3 IEEE754标准浮点数转化为整数
图4 IEEE754标准浮点数转化为整数时序仿真波形图
图5 基于FPGA的整数开方运算时序仿真波形图
图6 发电机控制系统框图
可知,在FPGA内部应用整数开方模块比应用浮点开方模块altfp_sqrt要方便得多。
实验中,以Cyclone II系列的EP2C8Q208C8为硬件平台,已成功采用整数开方模块进行发电机三相电压有效值计算。
[1] Charles Farnum.Compiler Support for Floating-Point Computation[J].Software Practices and Experience,1988,7(18):9-21.
[2] 应丽娅,张 .基础浮点运算单元VHDL实现的新方法[J].杭州电子科技大学学报,2007,12(6):27.
[3] 何晶,韩月秋.一种新的整数转换为浮点数的方法[J].计算机工程,2003,11(19),29-38.
[4] 姜雪松,刘东升.硬件描述语言VHDL教程(基础篇·提高篇)[M].西安:西安交通大学出版社,2004.