微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > FPGA 解决方案和标准控制器内核比较

FPGA 解决方案和标准控制器内核比较

时间:01-07 来源:互联网 点击:

,协处理器IP应存储输入,并以寄存方式提供结果。请注意在执行此操作时没有使用带FIFO的FSL总线。

此外,以不同时钟速率运行 MicroBlaze和FSL硬件加速器IP 容易发生问题。为避免发生冲突,设计人员最好将MicroBlaze和 FSL硬件加速器IP的运行速率设为一致。

不过,如何在不使用FSL总线的情况下将MicroBlaze和FSL硬件加速器IP直接连接起来呢?这很简单,只需将MicroBlaze和硬件加速器的数据线连接起来即可。如果需要,可再添加握手信号。

例如,使用位反转IP,只需一个写入信号即可。IP会一直很快运行,足以对MicroBlaze的任何请求做出及时响应。

IP本身非常简单。以下是摘录 VHDL 代码中的一段:

architecture behavioral of
  fsl_bitrev is
  -- data value sent by microblaze:
  signal data_value :
std_logic_vector(0 to 31) := (others=>'0');
begin
  -- bitreversed value to write back:
FSL_M_Data = data_value;
process(FSL_Clk)
begin
  if rising_edge(FSL_CLK) then
if (FSL_S_Exists = '1') then
-- create the bitreversed data:
data_value(0) = FSL_S_Data(31);
data_value(1) = FSL_S_Data(30);
data_value(2) = FSL_S_Data(29);
...
 data_value(30) = FSL_S_Data(1);
 data_value(31) = FSL_S_Data(0);
end if;
end if;
end process;
end architecture behavioral;
如果在两者之间没有使用 FSL总线的情况下添加这个IP,您必须对项目的MHS文件进行如下修改:
BEGIN microblaze
...
PARAMETER C_FSL_LINKS = 1
...
PORT FSL0_S_EXISTS = net_vcc
PORT FSL0_S_DATA = FSL0_S_DATA
PORT FSL0_M_DATA = FSL0_M_DATA
PORT FSL0_M_WRITE = FSL0_M_EXISTS
PORT FSL0_M_Full = net_gnd
END
BEGIN fsl_bitrev
PARAMETER INSTANCE = fsl_bitrev_0
PARAMETER HW_VER = 1.00.a
PORT FSL_S_DATA = FSL0_M_DATA
PORT FSL_S_EXISTS = FSL0_M_EXISTS
PORT FSL_M_Data = FSL0_S_DATA
PORT FSL_M_Full = net_gnd
PORT FSL_Clk = clk_50_0000MHz
END

现在效率显著提高。硬核仅在两个周期内可完成位反转操作:一个周期用于把数据写入IP,另一个周期则负责读回结果。处理2万个位反转操作现在只需0.8ms。

与最初采用的算法相比,效率提升了110倍。与效率最高的最新软件算法相比,此算法仍使系统性能提升了11倍。

当然,本例只有在您的CPU不提供位反转寻址功能的情况下才有效。大多数 DSP都有此功能,但大多数微控制器都不具备这个功能。具备增加这个功能的特性可大幅度提升这种算法的处理速度。

虽然修改不大,但收效十分明显。我们甚至将代码压缩到两个字大小。当然,现在硬件要求增加一些芯片。不过以此为代价获得比任何标准微控制器更高的速度,是值得的。

 案例2:高速浮点性能

现在我们给出另一个 MicroBlaze算法加速示例。一个客户声称他的浮点处理在MicroBlaze系统上运行非常慢。他使用的算法可采用简单的环路同时得出几个结果。

for (i=0;i512;i++) {
f_sum += farr[i];
   f_sum_prod += farr[i] * farr[i];
f_sum_tprod += farr[i] *
farr[i] * farr[i];
  f_sqrt + =
sqrt(farr[i]);
  if (min_f > farr[i]) { min_f =
farr[i]; }
  if (max_f farr[i]) { max_f =
farr[i]; }
}

所有数值均是单精度浮点值。我们首先想到的是最基础的一个问题:浮点单元 (FPU) 激活了吗?检查项目设置后,我们发现FPU仍然处于未启用状态。这就是为什么永远无法计算出这几个数的原因。FPU可在 MicroBlaze属性设置中加以激活。

FPU支持共有两种。我们也选择扩展FPU (Extended FPU)来支持求平方根运算。现在,在50MHz 的MicroBlaze上需要 1,108,685个周期才能完成 512个值的全部循环。查看生成的汇编程序代码后,可以了解到创建平方根是仍然在使用数学库(Math-lib)功能。其在数学功能中的定义为:

double sqrt(double);

不过客户使用平方根函数仅为处理浮点数值。因此,MicroBlaze FPU定义了一个新的函数来取代原来的函数,解决这个问题:

float sqrtf(float);

把表达式f_sqrt += sqrt(farr[i])变为f_sqrt += sqrtf(farr[i]),就会调用MicroBlaze内部的FPU内部平方根功能。现在执行代码只需要35,336个周期。特别是与第一个根本没有使用FPU的方案相比,我们再次通过小小的调整就实现了31倍的提升。在相同的执行时间内,可能需要大约1.5GHz的CPU才能给出上述这些结果。

不过客户仍不满意,客户要求更高的速度。在这种情况下,把算法从浮点运算变为固点运算并不适合。因此,我们开发了一款新型专用硬件加速器(新型FSL IP)来加快对循环

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top