HLS工具使FPGA上的数学更简单

fiz*_*fiz 1 verilog signal-processing fpga vhdl

我有一个问题,使用HLS工具比写下原始VHDL/verilog更容易解决.目前我正在使用Xilinx Virtex-7,因为我认为这已经被其他一些供应商所解决.

我可以使用VHDL 2008.

所以在VHDL中想象你有很多计算,例如:

p1 <= a x b - c;
p2 <= p1 x d - e;
p3 <= p2 x f - g;
p4 <= p2 x p1 - p3;
Run Code Online (Sandbox Code Playgroud)

目前,如果我用IP核编写它,它将是四个DSP IP核,并且由于不同的端口宽度,我必须生成这个IP核4次.每当我对其中一些外部信号进行更改时,所有宽度都会再次改变.跟踪所有这些调整大小是一件痛苦的事情,特别是在调整签名向量的大小时.

我有很多数学因而有很多DSP逻辑.使用HLS工具编写此块会更容易.理想情况下,我希望它能够处理宽度并相应地对数据进行位移.

这样的工具存在吗?你会推荐哪一个?

奖励积分:

这些工具中的任何一个都可以处理浮点数学并让您控制精度吗?

Pla*_*ugh 6

有很多方法可以实现您的目标.但首先要解决你的观点.

目前,如果我用IP核编写它,它将是三个DSP IP核,并且由于不同的端口宽度,我必须生成这个IP核3次.

不必要.如果你输入ag的所有固定点,你可以使用ieee.numeric_std或VHDL-2008就可以使用ieee.fixed_pkg.这些将推断DSP内核(例如Xilinx上的DSP48).例如:

-- Assume a, b, and c are all signed integers (or implicit fixed point)
signal a : signed(7 downto 0);
signal b : signed(7 downto 0);
signal c : signed(7 downto 0);
signal p1 : signed(a'length+b'length downto 0); -- a times b produces a'length + b'length +1 (which also corresponds to (a times b) - c adding one bit).
...
p1 <= a*b - resize(c, p1'length);
Run Code Online (Sandbox Code Playgroud)

这将意味着乘数和加法器.

这可以用UFIXED或类似地完成SFIXED.但是你需要跟踪位宽.

此外,有一个浮点包(ieee.float_pkg),但我不建议硬件.在定时和资源方面,您最好以固定点实现它.

每当我对其中一些外部信号进行更改时,所有宽度都会再次改变.跟踪所有这些调整大小是一种痛苦.

您可以自动执行此操作.看看我上面的例子.您可以根据操作轻松确定宽度.乘法总和位数.添加添加一个位.所以,如果我有:

y <= a * b;
Run Code Online (Sandbox Code Playgroud)

然后我可以y简单地推导出它的长度a'length + b'length.可以办到.然而,问题是有点增长.如果您保持完全精确,您描述的操作链将显着增长.在某些点,您需要截断或舍入以减少位数.这是困难的部分,您可以容忍多少错误取决于算法和预期的数据输入.

我有很多数学因而有很多DSP逻辑.使用HLS工具编写此块会更容易.理想情况下,我希望它能够处理宽度并相应地对数据进行位移.

自动处理是困难的部分.在VHDL中,这不会发生(也不是Verilog).但是你可以很好地跟踪它并根据需要更新位宽.但它不会自动处理诸如舍入,截断和管理错误界限之类的事情.DSP工程师应该处理这些问题并指导RTL开发人员使用适当的宽度以及何时进行舍入或截断.

这样的工具存在吗?你会推荐哪一个?

在更高级别上有多种选择可以做到这一点.在资源方面,这些都不是特别节俭.Matlab有一个代码生成工具,可以将Matlab模型(适当构造)转换为RTL.它甚至可以分析舍入,截断等问题,并确定适当的位宽.您可以控制精度,但它是固定点.我们玩过它,发现它远不能生成高效,高速的代码.

或者,Xilinx确实有一个HLS套件(参见Vivado).我不是那么精通方法论,但据我所知,它允许编写C代码来实现算法.然后,C doe被"合成"到某种执行引擎中执行的东西.您仍然必须将C代码与RTL基础架构接口,这本身就是一个挑战.到目前为止我们没有大力追求它(即使我们做DSP重设计)的原因是将HLS和RTL一起模拟为一个系统是一个巨大的挑战.