tag 标签: 浮点转定点

相关博文
  • 热度 28
    2016-4-15 09:01
    2970 次阅读|
    2 个评论
    由于笔者马上就要毕业了,想到公司里面锻炼一下,最近的一个多月都在公司实习。而公司也没有跟我客气,上来就叫我做算法,当然是一些已经成熟的技术,可查找的资料比较多。比如:矩阵求逆。由于公司的保密性质,我以下写的内容都是可以公开,可以查到的,而我的工作是将这些资料做一些整合,加上我的理解,让大家更容易读懂。 刚接到老大说要做矩阵求逆,内心是没什么波澜的,因为没接触过,不懂而无畏(O(∩_∩)O哈哈~) 。接下来上网查一些资料,弄清楚矩阵求逆的整体架构,包括哪些部分(包括矩阵分解、三角矩阵求逆、矩阵乘法三个部分),心中有个整体的把握之后,开始着手矩阵乘法(选它是因为矩阵乘法的资料最多,觉得是个比较好的突破口)。看了一天资料,第二天开始设计结构(结构设计是最难的,这个是论文里面设计好的,好在矩阵运算的大部分的结构设计都可以找的到),编程加仿真,ok。元旦三天假期回来开始矩阵分解,并不像矩阵乘法那样顺利,两三天过去了,仍然没有进展,内心是有点着急,开始求助于各个FPGA群,希望能从经验丰富的大牛们那里得到些灵感,而只得到了“你还太年轻了”的回答(原因是对方觉得一个月的时间绝对做不出,想当年他工作的时候还做了一个多月,而基于保密性,不能提供给我帮助)。不知道大家是不是这种,你越是说不可能,我就越要证明给你看。周末跑去学校借了几本书,从头开始研究脉动阵列(脉动阵列是矩阵运算的关键,以后会讲到),论文看了十几篇,终于把矩阵分解做了出来。由于这段时间的研究打下的基础,没多久,整个矩阵求逆也顺利的得到了。。内心还是有些小兴奋的。 总结一下,我想说的是1.“基础一个要打牢,做事要踏踏实实的准没错”2.“不逼自己一把,你不会知道你有多大的潜力”。上面那些讲的是我的学习经历,大家可以看看,也可以当废话略过。 接下来进入正题,浮点转定点是个比较基础的知识点吧,所以作为开篇,简单的举几个小例子,通过例子,相信大家都能掌握它。 简单说明一下,浮点包括 符号位| 指数位|小数位 。浮点的类型包括 单精度浮点数|双精度浮点数 。这里用到的是单精度浮点数。单精度浮点数: 1 位符号位, 8 位指数位, 23 位尾数位。也有说是24位尾数位,这里笔者认为这样划分,更便于说明(我的地盘听我的,嘿嘿)。 浮点转定点的步骤如下:a)将浮点数划分 符号位| 指数位|小数位; b)计算指数位与偏差位的值;单精度浮点数的偏差值固定为127. c)计算并得到定点数。 看例子 : 例1: A =01000000.010000000000000000000000 划分如下: 01000000010000000000000000000000 符号位 =0 ,即为正 指数位 =128 ,偏差值 =127 ,指数位 - 偏差位 =1 尾数位为 1 意味着实际尾数为 1.1 ,包括小数点前面隐藏的 1 所以实际的实数为 +1.1*2^1=(2^1+2^-1*2^1)=3 再举个例子,例子 2 : B =01000000.101000000000000000000000 划分如下: 01000000101000000000000000000000 符号位 =0 ,即为正 指数位 =129 ,偏差值 =127 ,指数位 - 偏差位 =2 尾数位为 01 意味着实际尾数为 1.01 ,包括小数点前面隐藏的 1 所以实际的实数为 +1.01*2^2=(2^2+2^-2*2^2)=5 到了这里,相信大家基本掌握了单精度浮点转定点的方法,接下来的两篇计划介绍矩阵乘法以及LU矩阵分解。由于保密性,里面的内容都是可以公开的。 连接到下一篇《 矩阵系列之矩阵乘法 》 下载视频
  • 热度 19
    2016-1-26 10:52
    4253 次阅读|
    0 个评论
    1 矩阵 LU 分解模块 1.1 LU 分解数学表达 首先要明确的是,矩阵的 LU 分解是有局限性的,即 LU 分解只针对非奇异矩阵。那么什么是非奇异矩阵呢?即各阶顺序主子式不为零。 (1) 高斯消去法 LU 分解的思想来源于高斯消去法,拿方阵为例(因为本项目中要处理的就是方阵)。将一个 n*n 的方阵 A ,通过左乘一系列消去矩阵(笔者自己起的名字,便于理解)。使得 (((( n 个 L1*(((L2*((....*(Ln*A)=UU 为上三角矩阵。 之所以这样化简是因为上三角矩阵便于求解方程组(当然这不是本文的主题,只是为了说明 LU 分解的来历)。将所有的消去矩阵按顺序相乘,得到 L ’ *A=U 这样就把 Ax=b 的方程组,变换为求解 Ux=b 三角方程的形式。之所以说 LU 与高斯消去法有紧密的联系,是因为 LU 分解在分解的过程中同样用到了高斯消去法。 (2) LU 分解 LU 分解是将一个 n 阶的非奇异矩阵 A 分解成一个单位下三角矩阵 L 和上三角矩阵 U 的乘积,称作矩阵 A 的 LU 分解。如下图所示: L 和 U 的计算公式如下: 1.2 LU 分解脉动阵列的设计 为了提高 PE 的利用率,让 A 、 L 、 U 三个矩阵的元素中选取 L 矩阵的元素存于 PE 之中,使另外两个矩阵的元素沿不同的方向流动,即 A 、 U 中的元素分别沿水平向右与垂直向下的方向流动,构成如下图所示的三角状阵列。阵列中的正方形 PE 为内积步 PE 。当 A 的主对角线元素到达 PE ( i,j )( i 不等于 j )时,产生 L 矩阵的元素 L ij ,且从此保存与 PE 中。阵列中的圆形 PE 仅起到改变方向的作用。 (1) 数据流向说明 A 的元素沿水平方向流经各正方形 PE 并被处理后,其下三角元素在 PE 中被除以 a jj 后变为 L ij 而存于 PE ( i,j )中; A 的上三角元素到达圆形 PE 时,变为 u ij 而改为垂直向下流动,参加后面 L 、 U 值得计算。最后 U 的元素由阵列底部输出。 LU 分解脉动设计图 注: 1 上述阵列需要 n ( n+1 ) /2 个 PE ,所需时间为 3N-2 个时钟周期。 1.3 结果验证 (1) matlab 分解结果 矩阵A 矩阵 U 矩阵 L (2)Modelsim 分解结果: 矩阵 U 矩阵 L 大家应该注意到,矩阵L的结果是使用单精度的浮点数表示的,大家可以参照《 矩阵开篇之浮点转定点 》,练习练习,然后跟matlab的结果做对比,看看自己是否掌握了该转换方法。
  • 热度 43
    2015-10-23 01:32
    4087 次阅读|
    37 个评论
    首先在这里要感谢至芯科技(上海)的老师,在笔者校招期间,他们给了我很大的鼓励和帮助。从上海回长沙的开始一段时间并不是那么的顺利,一度怀疑自己学习的方向是不是错了,也开始怀疑自己能力,降低要求,找个单位签了算了。我给尤老师打电话,把自己的疑惑跟他谈了谈,马上纠正我的错误想法并且坚定我的信心。现在,比起之前的情况好了很多,手里也有了offer。真的很感谢至芯。也告诉所有喜欢FPGA的人,喜欢,就坚持,不要因为一点点阻碍就放弃自己的梦想。 大家看到我这篇文章的题目之前加了“系列”两个字,那就是说关于“波 ”,我们不会只有这一篇,而是包括正弦波、混合波以及各种滤波器实现。这里面涉及到的一些理论,我尽量用简单、通俗易懂的语言来讲给大家。 一.目标波形 正弦波想必大家都不陌生,在高中的时候就有接触过,什么正余弦定理,积化和差、和差化积、半角/全角公式等等。当然大家完全不需要回去重新复习这些,只看博客的内容就够了。大家先想一想正弦波的函数图象,它的波形是什么样子的,什么?这个也想不到,没关系,就是下面这个样子^_^。 博主不要闹,这哪里是什么正弦波,不要欺负我读书少!!! 别急,且听我慢慢说来,咳咳。。。上图给出的就是我们今天要实现的波形,先在视觉上面给大家一个直观的感受。该波形是由标准的正弦波通过变频、移相得到的。所谓万变不离其宗,根源还是正弦波。 二.相关概念 大家对下面的公式一定不陌生 y=f(x)=Asin(wx+k)=Asin(2*pi*f*x+k); A :振幅 f:频率 k:相位 知道了这三个参数就能确定唯一一组波形。下面看看生成正弦波的步骤,并在步骤里面穿插讲解。 1.离散化 将连续的正弦波信号进行离散化;应用matlab软件进行实现; a)频率控制字M =2*该波形频率,即采样点数要大于等于2。我们可以将一个周期分成2、4、8、16........2^N的份数,可以连续选取采样点,也可以隔1、2、。。。M个点采样。这里的M就是频率控制字。它的作用是控制目标波形的频率。这里先这么记住,往后面看。 b)目标波形的频率fs 既然我要生成一个正弦波,我当然要知道我生成的正弦波的频率,目标波形的频率fs=M*fclk/2^N; fs怎么来的? 将一个周期分成2^N份,每M个点采样,那么一个周期要采多少个点?2^N/M; 每个时钟采一个点,采集2^N/M个点需要2^N/M个Tclk,转换成频率,乘变成除,就得到目标公式了。 c)相位控制字 相位的控制也比较简单,以相位为0作为标准: 90度——2^N/4; 180度——2^N/2; 270度——2^N*3/4; 相信大家也看出规律了,教大家一个快速的方法,将份数类比成角度360,对份数做运算相应的就是对角度做运算,得到期望的相位。 注:如果你对于这些参数如何用代码控制还不是很清楚控制,那么具体看代码就一目了然了。 2.将离散化后的正弦波一个整周期存储到Ram中 (1).将离散后的数据进行定点化,Ram的规格是256*8,数据规格:1bit符号位+7bit小数位 d)幅值 以8bit位宽的RAM为例。8bit数据能表示的有符号数的范围是-128——127,幅值即为127。 将浮点数定点化:这里8bit全部表示整数位宽,所以讲正弦值*127然后取整,再去掉符号,将数据生成mif文件(matlab实现) (2).创建一个Ram 用于存储离散数据 创建一个单口RAM,深度256,位宽为8,将mif文件导入即可。 三.仿真步骤 该工程相应的仿真步骤如下: 1.打开Modelsim,改变当前路径 Change Directory 将路径切换到sim文件夹下面 2.在命令行中敲入do run.do,自动执行仿真 3.输出格式设置 Analog(custom),打开设置选项 Height改成120,Max改成127,Min改成-128,点击ok。 4.效果图 四. 总结 确定一个唯一的正弦波需要知道三个参数,幅值、频率、相位。结合了采样定理,说明了采样过程与这三个参数的对应关系,明确这些就可以用代码实现。由于篇幅原因,需要代码的同学,留言写下自己的邮箱,我会把代码打包好发给各位,包括(功能文件,测试文件,仿真文件、工程等)。
  • 热度 20
    2013-12-4 16:48
    1635 次阅读|
    0 个评论
      AccelDSP其实是一种综合工具,所以也叫AccelDSP综合工具。它可以将特定的Matlab程序进行浮点到定点的转换,生成定点的Matlab程序或者C++程序,并综合成HDL代码和testbench代码。     在用FPGA实现DSP算法时遇到的一个主要问题就是如何实现算法浮点到定点的转换。当然我们可以使用Matlab的强大功能,进行浮点和定点的仿真。而AccelDSP综合工具是将Matlab和Xilinx的开发环境很好的结合在起来。当你使用AccelDSP进行开发时,你只需要编写Matlab的浮点程序,并进行功能验证。然后就可以利用AccelDSP综合工具将浮点的Matlab算法转换为定点,并综合为硬件可实现的结构,最终生成FPGA的下载文件。     AccelDSP得到的硬件模块一般都是作为一个大型设计的子模块。     上面说的这么好,可能大家都觉得以后都不用写HDL代码了,直接用写Matlab代码就行了。当然现在的软件还没有这么智能,AccelDSP虽然能够综合Matlab程序,但是这对Matlab程序也是有要求的。并不是所有的Matlab浮点程序都能够通过AccelDSP验证并转换成硬件。就像并不是所有的HDL语言都是可综合的。它对Matlab程序有以下要求: (1)、特定的数据类型 (2)、特定的运算符 (3)、特定的函数 (4)、特定的Matlab编码风格     也就是说AccelDSP所支持的数据类此能够,运算符,函数都是Matlab的一个子集,并且还要求Matlab遵循特定的编码风格,这样才能保证Matlab的浮点程序是可以被AccelDSP综合的。并且综合后的硬件结构与M文件的编写方式有很大的区别。 1、Matlab的程序结构     一个可综合的Matlab设计至少包括两个M文件:script M文件和function M文件 (1)、Script M文件     Script M文件分三部分:数据流控制、function函数调用、验证程序。其中数据流控制一般可以用for或者while语句,验证程序一般是完成波形显示和数据统计的功能。 (2)、function M文件     function M文件最终要映射为硬件模块。function M文件的参数被映射为硬件模块的输入,function M文件的输出被映射为硬件模块的输出。浮点到定点的转换主要就是指的将function M文件的参数和输出由浮点转换为定点。 2、浮点到定点的转换     虽然AccelDSP能够将Matlab浮点程序转换为定点,但实质上它还是利用了Matlab的浮点到定点的转换功能。所以我们就需要了解一下Matlab中是如何实现浮点到定点的转换的。这对于不使用AccelDSP而是直接使用Matlab进行浮点到定点转换的工程师也是很有帮助的。     浮点转换为定点的过程在Matlab中称为量化,使用quantizer和quantize两个函数完成。 (1)、quantizer用于定义数据的量化属性 (2)、quantize则按照quantizer定义的量化属性量化浮点数据。     下面举一个例子: x = ; qpath = quantizer('fixed','round','saturate', ); fix_x = quantize(qpath,x);     运行后fix_x结果为: fix_x =     3.5000    1.5000    6.0000   20.7500 -128.0000  127.7500     其中-128.25溢出了,这里设置溢出后为饱和输出,所以为-128。     具体关于quantizer和quantize函数的使用说明请参考Matlab的help文件。     在AccelDSP中也是使用内嵌的quantize函数对浮点程序进行量化。它可以自动统计所有变量的变化范围,并完成对数据的量化。当然也可以人为指定量化属性。推荐先使用AccelDSP的自动量化功能,然后再对其中一些进行人为修改。     假如一个浮点数为10.765,我们用一个总位宽为8bit,小数位宽为3bit的有符号数进行表示那么对应的最接近的二进制数为01010.110,对应的十进制数为10.75,量化误差为0.015。当然小数位宽越宽,对应的小数部分精度就越高。     对于一个数据总位宽为10bit,小数位为2bit。则量化的范围为:-128.0 ~ 128.75,量化的最小精度为0.25。     小数部分位数的选取时通过对比定点仿真与浮点仿真的结果得出的,一般最大设置为12bit即可,精度可以达到0.000244140625。 3、accel_probe的使用     在Matlab中,一般观察函数内部的信号比较困难。这时可以将accel_probe函数插入到函数体内,它会自动统计和分析数据,并且画出曲线图。具体使用方法可参看AccelDSP相关文档。 4、优化硬件架构     相同的Matlab浮点程序,可以通过AccelDSP的不同属性设置得到不同的硬件实现形式。AccelDSP中的.add文件描述了硬件结构的实现形式,可以通过手工修改.add文件或者AccelDSP中的GUI界面改变其属性设置,达到优化硬件架构的目的。下面举两个例子说明不同的属性设置对于生成硬件架构的影响。 (1)、循环语句映射     可以通过修改属性使循环语句利用串行实现(节约资源)、并行实现(增强性能)或者在性能和资源之间进行折中实现。分别对应的属性为:Fully Rolled,Fully unRolled,Partial Unrolled。 (2)、变量的映射     Matlab程序中的变量在硬件实现时可以采用基本的逻辑单元实现,也可以映射到FPGA内部的RAM或者ROM。 5、AccelWare     AccelWare是AccelDSP综合工具提供的参考IP设计,包含了大量可配置函数,设计者通过调用这些函数可以省去大量的编程时间。     AccelWare工具箱分为4大类:高级数学工具箱、通信工具箱、信号处理工具箱以及功能组件工具箱。 (1)、高级数学工具箱中提供了在数学运算中常用的矩阵和多项式操作。 (2)、通信工具箱提供了通信应用中的基本模块,包括数学频率合成器、编解码器、脉冲成形滤波器、加解扰、特定滤波器5类。 (3)、数字信号处理工具箱提供了DSP处理中常见的算法,包括多速率滤波器、FFT变换和一般滤波器三类。 (4)、功能组件工具箱提供了很多基本的功能组件,包括复数操作、三角函数、幂次、开放、除法、统计、矩阵运算等。     总上所述,AccelDSP为FPGA进行DSP开发,特别是将Matlab浮点算法转换为定点提供了一套解决方案,随着综合器技术的发展,也许不久的将来我们就不用再写HDL语言了,直接用高级语言对硬件结构进行描述。     另外,即使不使用AccelDSP综合工具,也可以参考这种将Matlab浮点算法转换为定点的方法,应用的我们的设计中。     注:本文参考了《Xilinx ISE Design Suite 10.X FPGA开发指南——DSP、嵌入式与高速传输篇》,对相关内容进行了总结 以上内容原文链接: http://hsanyi.blog.163.com/blog/static/5502232520111194658521/