Feb 10

一个基于FSL的“伪”双精度FPU

RickySu , 18:07 , 技术经验 , 评论(6) , 引用(0) , 阅读(882) , Via 本站原创 | |
背景:在Xilinx EDK系统上如果要使用FPU,现在的选择是MicroBlaze自带的单精度FPU,给PPC405用的单精度FPU和给PPC440用的双精度FPU。也就是说,在PPC405和MicroBlaze上暂时还没有双精度FPU。

于是最近做了一个基于MicroBlaze FSL总线的“伪”双精度FPU。

FAQ:

Q1: 为什么这是一个“伪”FPU?
A1: 因为这不是一个集成的FPU,不能直接使用C语言的加减乘除直接来运算,编译器不直接支持,而是使用自带的driver来传递信息。

Q2: 它能跑多快的速度?
A2: 这不是一个最优化的FPU(速度、资源),而仅仅达到“可用”的程度。在Spartan3E上的测试结果是45MHz左右, 在Virtex4上测试结果是90MHz左右。它调用了CoreGen IP - Floating Point。IP Core已经配置为节省面积且重复使用资源。用户可以使用CoreGen自己设定Floating Point IPCore 的参数并将生成的网表替换netlists目录中的相应文件。

Q3: 我该怎样使用它?
A3: Pesudo_FPU_DP_v1_00 有两种工作模式,分别是FSL的同步时钟模式和异步时钟模式。
使用时,首先需要将pcores和drivers目录中的文件copy到工程文件夹的相应目录。
- 在同步时钟模式时,只需要使用Hardware --> Configure Co-processor,在弹出菜单将IP添加到左边空格即可。此时,pesudo_fpu_dp core 工作在sys_clk_s的时钟频率下。
- 在异步时钟模式时,用户需要
   1. 手动创建一个合适的时钟(通过Clock Generator或从外部引入)
   2. 将它连接到pesudo_fpu_dp的async_clk端口和microblaze_0_to_pesudo_fpu_dp_0的FSL_S_CLK 和 pesudo_fpu_dp_0_to_microblaze_0的FSL_S_CLK端口
   3. 连接microblaze_0_to_pesudo_fpu_dp_0的FSL_S_CLK 和 pesudo_fpu_dp_0_to_microblaze_0的FSL_S_CLK端口到系统时钟sys_clk_s
   4. 设置pesudo_fpu_dp_0、microblaze_0_to_pesudo_fpu_dp_0 和 pesudo_fpu_dp_0_to_microblaze_0的属性C_ASYNC_CLKS = 1
   5. 设置microblaze_0_to_pesudo_fpu_dp_0的属性C_READ_CLOCK_PERIOD为ASYNC_CLK的周期(单位:ps) 和 pesudo_fpu_dp_0_to_microblaze_0的属性C_READ_CLOCK_PERIOD为sys_clk_s的周期(单位:ps)

Q4: 软件中该怎样使用它?
A4: pesudo_fpu_dp是一个“伪”FPU,它不提供编译器的支持。因此使用这个IP时,需要使用它自定的driver函数。他们是:
void pesudo_fpu_sqrt(double* source, double* result);
void pesudo_fpu_add(double* source1, double* source2, double* result);
void pesudo_fpu_sub(double* source1, double* source2, double* result);
void pesudo_fpu_mult(double* source1, double* source2, double* result);
void pesudo_fpu_div(double* source1, double* source2, double* result);

所有操作数均使用指针传递数据。
软件例程可以参考drivers\pesudo_fpu_dp_v1_00_a\examples\pesudo_fpu_dp_v2_1_0_app.c

Q5: 我可以免费使用它吗?
是的。这个IP可以免费使用、修改和分发。但是请保留原文件中所有的版权声明。本人将不提供后续技术支持。本人对使用本IP所产生的影响不负任何责任。

Q6: 哪里可以下载?

2009.4.7 zip已更新,加入了xco文件。

Q7: 如果我不想要双精度FPU,它可以用来做啥?
A7: 这个IP还可以用来作为学习写FSL IP的起点和模板,也可以用来学习怎样使用bbd文件。
Tags: , , ,
junxiu6
2009/04/07 10:51
期待上传...
RickySu 回复于 2009/04/07 22:03
已上传带XCO文件的zip包
junxiu6
2009/04/03 14:39
博主,你上传的 pesudo_fpu_dp_v1_00_a.zip没有对应的xco文件啊,请问该如何得到呢?可以上传上来吗?
RickySu 回复于 2009/04/05 09:48
不好意思没注意到,稍后传上
junxiu6
2009/04/03 09:55
博主,你好.我的是v2p的开发板,用mb处理器做了一下,但是会提示"不支持v2p开发板",我想是不是netlists文件夹下缺少v2p的网表文件呢?该如何生成这个网表文件呢?
RickySu 回复于 2009/04/03 10:16
是的,当时生成网表的时候没有生成V2P的。
要生成V2P使用的网表文件,需要用coregen根据xco文件重新生成一次netlist,并将它们复制到netlist目录下相应的目录中,还要再修改一下BBD文件。
junxiu6
2009/04/02 19:37
我用mb做了一下,还是不通的,是不是要一些网表文件?
junxiu6
2009/04/02 11:07
现在无法支持virtex-II pro开发板?该如何加入支持呢?谢谢博主.
RickySu 回复于 2009/04/02 17:46
V2P的PPC不支持APU接口。如果用MB的话是可以的。
Handson Email Homepage
2009/03/19 10:45
博主,你好。看了这篇文章,真是眼前一亮。真是不错的东西。
我这里有两个疑问,第一就是关于driver,如果使用uclinux操作系统,那么这个driver是不是很难书写。第二,和uclinux的浮点运算时间相比是不是很快。(uclinux里可不可以用double类型。应该可以?那么和片系统架构中的双精度FPU是什么关系呢?)

感谢博主的回答
RickySu 回复于 2009/03/19 14:55
关于driver的问题,我没尝试过,不过据朋友说是会者不难,难者不会。我就属于后者。
第二个问题,和ucLinux的运算时间想比较。我没在ucLinux里用过浮点运算,不过相信和普通的GCC编译出来的差不多。因此如果编译器没有发现有支持硬件浮点运算的选项时,就会用软件emulate。这个伪硬件FPU的速度估计是纯软件运算的10倍吧。
如果系统中直接有真正的双精度FPU,编译器能够提供支持,那是最好的了,就不需要用这个pesudo FPU了。
分页: 1/1 第一页 1 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]