背景:在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的时钟频率下。
- 在异步时钟模式时,用户需要 - 手动创建一个合适的时钟(通过Clock Generator或从外部引入)
- 将它连接到 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 端口
- 连接 microblaze_0_to_pesudo_fpu_dp_0 的 FSL_S_CLK 和 pesudo_fpu_dp_0_to_microblaze_0 的 FSL_S_CLK 端口到系统时钟 sys_clk_s
- 设置 pesudo_fpu_dp_0 、 microblaze_0_to_pesudo_fpu_dp_0 和 pesudo_fpu_dp_0_to_microblaze_0 的属性 C_ASYNC_CLKS = 1
- 设置 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: 哪里可以下载?
pseudo_fpu_dp_v1_00_a Q7: 如果我不想要双精度FPU,它可以用来做啥?
A7: 这个IP还可以用来作为学习写FSL IP的起点和模板,也可以用来学习怎样使用bbd文件。
|