大大头徐的技术笔记与心得

FPGA,嵌入式,SDR,数字信号处理,无线通信理论,业界动态……

DSP的FPGA实现学习笔记之一(算数运算) 2009-04-24 23:58


      
Xilinx
的大学计划真是个好东西,不但让我在研一时就有机会接触XilinxFPGA开发板,还能让我在学校里就参加相关的FPGA培训。去年年底,Bob Stewart教授来到了我们学校,进行了为期两天的名为FPGA培训。Bob教授所讲授的内容和我的研究方向几乎完全一致,让我受益匪浅。课程结束后,我仔细复习了一遍课程讲义,并做了一些简要的笔记。从今起,我就不定期的把我的这些笔记敲进电脑发上来,希望在分享的同时也能从大家那里学习更多的东西,呵呵~

       由于定位是“Primer”,所以这套讲义的起点还是很低的,从很多最基础的东西讲起。那对于我来说,有些东西早已知道(比如说FPGA的结构,并行处理的优势等),所以我的这些笔记过滤掉了一些最基本的内容,提炼出了我觉得对我比较有帮助的东西。这次发出来的都是一些很基本的内容,我总结的不多。在后续笔记中,会涉及诸如下变频等一些较为深入的主题,到那时,我的笔记会自然会比较详细。

  

一、DSPFPGA实现简介(DSP on FPGAs Introduction)

1.       FPGA适合应用在低级的DSP算法的数据流场合,不适合应用在if-then-else判断型编程需求的场合;

2.       DSP 的基础是乘法和加法,并且是大量的乘法和加法

[1]      两个N位数字相加将产生最大为N+1位的数值

[2]      两个N位数字相乘可产生最大为2N位的数

3.       FPGA实现DSP的一些优化方法(基本思想)

[1]      串并转换,即速度与面积互换

[2]      将乘法转换成“移位+加减”运算

[3]      逻辑单元复用(如FIR的抽头可复用)

 

二、复习数字逻辑(Digital Logic Review)

1.       有符号二进制数值

[1]      有符号二进制数的补码表示范围:-2^(n-1)~2^(n-1)-1   (“^”表示乘方)

[2]      用补码时,加减法直接运算,不考虑符号位

[3]      溢出:正数+负数:不溢出

正数+正数:若结果最高位为1,则结果溢出

负数+负数:若结果最高位为0,则结果溢出

2.       逻辑单元

使用“与非门”可以产生其它所有门电路(具体图形略)

 

三、DSP算数运算(Arithmetic for DSP)

1.       定点二进制数:二进制小数点在固定位置的数

小数处理,归一化:小数在相乘时要跟踪其小数点的位置,若进行归一化,那么二进制定点数只有一位整数且整数位是零,这种情况下进行乘法运算时结果也为一个在正负1之间的数,直接截断即可,不用移位

2.       截断(Truncating)和舍入(Rounding)

[1]      截断(直接将低位舍去)通常会带来精度的降低

[2]      舍入相对截断能更准确一些,但也更复杂,要多执行一次加法

二进制时,将要舍去的最高位加1,然后再截断(相当于实现了四舍五入)

eg:1001111的低两位舍去,可在右起第二位上加11010001)再截断(10100

[3]      一种新的方法:Trounding(截断和舍入的折中)

二进制时,将要舍去的最高位和未舍去的最低位进行“或”运算后,将结果赋给舍去后新数的最低位

a)         只有当两个或门输入都为1时,Trounding才和Rounding不同

b)        Trounding节省了硬件成本,平均量化误差介于TruncatingRounding之间

eg:100100低两位舍去,可将右起第二第三位进行或运算,再赋给新数最低位,得到10011

3.       浮点数

[1]      表示方法

单精度:SEE……EEFF……FFF(1个“S”,8个“E”,23个“F”共32)

双精度:SEE……EEFF……FFF(1个“S”,8个“E”,55个“F”共64)

       这些数被编码为:f(S)*2^(E+B)*(1.F)

在上式中,f(S)是符号位,E表示小数点移动位数,B在单精度中为127,在双精度中为1023F为一个不含整数位的无符号定点数。

由此可见,浮点数其实是由“符号位”,“指数位”和“尾数位”三部分组成的,相比于定点数,浮点数能用有限的位数表示更大范围内的数,精度相对于定点数提高了很多。

              eg:10=>+2^(3+127)*1.01                           以位形式书写:0 10000010 0100000……

                   10.34=>+2^(3+127)*1.0100101……     以位形式书写:0 10000010 0100101……

    -0.078125=>-2^(-4+127)*1.01               以位形式书写:1 01111011 01000……

[2]      短指数:单精度:SEE……EEFF……FFF(1个“S”,4个“E”,11个“F”共16)

[3]      FPGA中实现浮点运算,速度慢且将占用大量的硬件空间

[4]      浮点数乘法:尾数相乘,指数相加

[5]      浮点数加法:先做移位操作使其具有相同的指数,再相加

4.       加法中的溢出和饱和

[1]      溢出:同符号数相加,有可能出现溢出

[2]      饱和:先进行溢出检测,若出现溢出则将结果设定为最接近的可能值

5.       一些基本运算的速度

[1]      加法>乘法>除法

[2]      平方根>除法

[3]      复数加减法:两个加减法

[4]      复数乘法:四个乘法和两个加法(或三个乘法和五个加法)

[5]      复数除法:六个乘法,两个除法和三个加法

类别:FPGA技术 |
上一篇:第二届“Actel”杯FPGA大赛闯入决赛,发帖纪念~ | 下一篇:好书推荐(中文版《C/C++嵌入式系统编程》)
以下网友评论只代表其个人观点,不代表本网站的观点或立场
关于OpenHW | OpenHW使用说明 | FAQ | 相关法律 | 版权声明 | 网站地图
联系邮件:xiaoquan@eefocus.com  联系电话: 010-58859035-8012
Powered by eefocus.com