在数字信号处理中,复数乘法是很基本很普遍的运算。最常见的算法是四次乘法运算和两次加法运算,如下图所示。这里两个复数分别为a和b,其中ar为a的实部,ai为a的虚部,br为b的实部,bi为b的虚部。
实部 ar·br-ai·bi
虚部 ar·bi+ai·br
完整带图版见一楼
而实际上,我们还可以对该算法做进一步的优化,如下图所示,从而,整个复数乘法需要三次乘法运算和五次加法运算完成。相比于优化前的算法,乘法运算减少了一次,加法运算增加了三次。但从资源利用率角度来讲, 如果采用DSP48, 那么前者需要4个DSP48, 后者需要3个DSP 48。
实部 bi·(ar-ai)+ar·(br-bi)
虚部 bi·(ar-ai) +ai·(br + bi)
在Versal系列芯片中, 计算引擎为DSP 58, 性能更强大, 对于18-bit的复数乘法, 只需要2个DSP58完成,无需其他客外资源。此时,采用的就是上述优化后的算法。
为了确保HDL代码能够完美地映射到DSP 58中, 在代码描述时就要保证代码风格与硬件结构相匹配, 这里我们采用SystemVerilog描述。具体代码如下图所示。注意, 代码第15行使用了综合属性DONT TOUCH, 其值为true, 这使得Viva do会将其作为一个整体对待。
上述代码采用Viva do综合后会直接映射为DSP 58, 而不会消耗其他资源。这里要求数据位宽为18-bit。
在数字信号处理中,复数乘法是很基本很普遍的运算。最常见的算法是四次乘法运算和两次加法运算,如下图所示。这里两个复数分别为a和b,其中ar为a的实部,ai为a的虚部,br为b的实部,bi为b的虚部。
实部 ar·br-ai·bi
虚部 ar·bi+ai·br
而实际上,我们还可以对该算法做进一步的优化,如下图所示,从而,整个复数乘法需要三次乘法运算和五次加法运算完成。相比于优化前的算法,乘法运算减少了一次,加法运算增加了三次。但从资源利用率角度来讲, 如果采用DSP48, 那么前者需要4个DSP48, 后者需要3个DSP 48。
实部 bi·(ar-ai)+ar·(br-bi)
虚部 bi·(ar-ai) +ai·(br + bi)
在Versal系列芯片中, 计算引擎为DSP 58, 性能更强大, 对于18-bit的复数乘法, 只需要2个DSP58完成,无需其他客外资源。此时,采用的就是上述优化后的算法。
为了确保HDL代码能够完美地映射到DSP 58中, 在代码描述时就要保证代码风格与硬件结构相匹配, 这里我们采用SystemVerilog描述。具体代码如下图所示。注意, 代码第15行使用了综合属性DONT TOUCH, 其值为true, 这使得Viva do会将其作为一个整体对待。
上述代码采用Viva do综合后会直接映射为DSP 58, 而不会消耗其他资源。这里要求数据位宽为18-bit。