【HLS】FIR滤波器实现 | 优化 | 仿真 | HLS教程

某水课课程作业,记录全流程顺便做个教程。作业具体要求如下:
实现要求

FIR滤波器的HLS实现

工程准备

新建工程---------->略
在工程目录下新建一个放代码文件的文件夹,这里命名为src(推荐,方便管理代码),该文件夹下新建三个新文件,命名如下图。前两个文件用于HLS综合,后一个用来写testbench。
在这里插入图片描述
进入HLS软件,添加相对应的文件。
在这里插入图片描述

FIR滤波器设计

使用Matlabfdatool工具进行FIR滤波器设计,设计完成后先对滤波器系数进行定点化后再导出。

在这里插入图片描述
导出得到的就是待会需要使用的滤波器系数。

在这里插入图片描述

FIR滤波器实现

FIR的原理这里就不写了,直接贴HLS实现的代码。
使用常量储存滤波器系数,输入数据缓存则是使用静态变量防止每次执行都被初始化,for循环内实现输入缓存移位与乘项累加。因为乘法与加法都会扩大数据位宽,所以这里函数顶层的输出接口位宽会比输入接口位宽大得多。

#include "fir_low.h"

const int Filter_N = 16;
const ap_int<16> coe[Filter_N] = {
	0xfe39, 0xfd84, 0xfdd4, 0x048d, 0x16a6, 0x3352, 0x51f9, 0x65f1,
	0x65f1, 0x51f9, 0x3352, 0x16a6, 0x048d, 0xfdd4, 0xfd84, 0xfe39
	};

void Fir_Test(ap_int<16> Input, ap_int<32> *LowPass)
{
	static ap_int<16> data_buffer[Filter_N] = {0};
	ap_int<32> result = 0;

	for (ap_uint<5> i = Filter_N - 1; i > 0; i--)
	{
		data_buffer[i] = data_buffer[i - 1];
		result += data_buffer[i] * coe[i];
	}

	data_buffer[0] = Input;
	result += data_buffer[0] * coe[0];

	*LowPass = result;
}
#ifndef __FIR_LOW_H
#define __FIR_LOW_H

#include "ap_int.h"

void Fir_Test(ap_int<16> Input, ap_int<32> *LowPass);

#endif

设置好Top Function后,进行HLS综合。
在这里插入图片描述

目前没有添加任何优化约束,HLS综合结果如下图,Interval还未达到预期,接下来进行优化。

在这里插入图片描述

FIR滤波器优化

因为代码主要执行部分为for循环且循环内不存在数据依赖,可以考虑将该循环做展开。循环外还有部分操作,因此可以直接使用PIPELINE指令进行优化,HLS编译器会将循环自动展开并流水化。

void Fir_Test(ap_int<16> Input, ap_int<32> *LowPass)
{
	static ap_int<16> data_buffer[Filter_N] = {0};
	ap_int<32> result = 0;

	#pragma HLS PIPELINE

	for (ap_uint<5> i = Filter_N - 1; i > 0; i--)
	{
		data_buffer[i] = data_buffer[i - 1];
		result += data_buffer[i] * coe[i];
	}

	data_buffer[0] = Input;
	result += data_buffer[0] * coe[0];

	*LowPass = result;
}

添加以上约束后,HLS综合结果如下图,Interval已优化为1,达到设计目的。
在这里插入图片描述

FIR滤波器仿真

仿真激励代码如下,每一次调用Fir_Test函数即相当于在一个时钟周期输入一个数据并获取一个输出值,这里生成的输入信号为周期等于20个时钟周期的方波。

#include "fir_low.h"
int main(void)
{
	ap_int<32> out;
	for(int k = 0; k < 10; k++)
	{
		for(int i = 0; i < 10; i++)
		{
			Fir_Test(10000, &out);
			printf("%d\r\n", out);
		}
		for(int j = 0; j < 10; j++)
		{
			Fir_Test(-10000, &out);
			printf("%d\r\n", out);
		}
	}
	return 0;
}

在这里插入图片描述
在这里插入图片描述
选择C Simulation开始仿真,操作及结果输出如图。当然这里我没有写正确性检验,只是单纯输出了结果也不好脑补滤波后的信号,接下来进行联合仿真看看实际波形。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

选择Cosimulation进行联合仿真,操作及结果输出如图,然后点击这个小波形图打开Vivado查看仿真波形。找到箭头所指的两个信号:输入与输出,修改一下波形格式就可以观察到明显的滤波器效果了。

在这里插入图片描述
在这里插入图片描述

模块接口优化

考虑到模块使用的便捷性,对其接口再进行一些优化,去掉其握手信号。

	#pragma HLS INTERFACE mode=ap_ctrl_none port=return
	#pragma HLS INTERFACE mode=ap_none port=Input
	#pragma HLS INTERFACE mode=ap_none port=LowPass

其他

总体来说,使用HLS设计算法模块还是很简单快捷的,而且Xilinx推出了许多算法函数库,直接调库就可以实现大部分算法(例如上文的FIR滤波器)。
Vitis_Libraries库:https://docs.xilinx.com/r/en-US/Vitis_Libraries/index.html

### 回答1: HLS(High-Level Synthesis)和PYNQ(Python Productivity for Zynq)在FIR滤波器设计中都有重要的应用。 首先,HLS是一种高级综合工具,可以将高级语言(如C/C++)代码转换为硬件描述语言(如VHDL或Verilog),从而实现对程序的高层次综合。在FIR滤波器设计中,HLS可以极大地简化设计流程。设计者只需使用C/C++编写FIR滤波器的算法实现,然后使用HLS工具将其转换为硬件描述语言。这样可以大幅缩短开发时间,同时减少设计错误的风险。HLS还可以优化生成的硬件代码,以提高性能和减少资源消耗。 PYNQ是一个基于Python的开发环境,用于Zynq系列FPGA的快速原型开发。在FIR滤波器设计中,PYNQ提供了一个易用的Python编程界面,使设计者可以通过编写Python脚本来实现滤波器算法。PYNQ还提供了丰富的库和工具,以便进行硬件加速。通过利用PYNQ的高级API和硬件加速功能,可以使FIR滤波器FPGA上运行更快且更高效。 综上所述,HLS和PYNQ在FIR滤波器设计中发挥着重要作用。HLS可以将高级语言代码转换为硬件描述语言,从而简化设计流程并提高设计效率。而PYNQ则提供了具有高级API和硬件加速功能的Python开发环境,使FIR滤波器设计更加灵活和高效。两者结合使用,可以在滤波器设计中获得更好的性能和更快的开发速度。 ### 回答2: HLS(High-Level Synthesis)和PYNQ(Python productivity for Zynq)在fir滤波器设计中有着重要的应用。 HLS是一种高级综合工具,它允许使用高级语言(例如C、C++或SystemC)来描述硬件设计,并自动生成硬件描述语言(HDL)代码,如Verilog或VHDL。HLS可以大大减少编写和调试HDL代码的工作量,提高硬件设计的开发效率。 在fir滤波器设计中,可以使用HLS快速生成滤波器的硬件描述代码。通过将滤波器的算法实现为C或C++代码,然后使用HLS工具进行综合,可以将其转化为效率高且对资源利用率优化的硬件描述代码。使用HLS工具可以方便地对滤波器进行功能验证和性能评估,同时也能够快速优化设计,使其满足滤波器设计的需求。 PYNQ是一个基于Python的开发环境,它为Zynq系列的FPGA提供了更高的生产力和易用性。PYNQ结合了Python的简洁和可读性,以及FPGA强大的并行计算能力,能够使用Python编程语言轻松地进行FPGA开发。在fir滤波器设计中,可以使用PYNQ构建滤波器的控制逻辑和数据流控制。通过调用PYNQ提供的库函数和API,可以使用Python语言轻松地控制Zynq的FPGA进行滤波器数据的输入、处理和输出。 使用PYNQ进行fir滤波器设计,可以实现高度灵活的开发流程。Python的高级编程语言特性使得fir滤波器的调试、测试和性能优化更加易于理解和操作。此外,PYNQ还提供了丰富的示例代码和开发工具,加速滤波器设计的开发过程。 综上所述,HLS和PYNQ在fir滤波器设计中的应用可以显著提高硬件设计的效率和可读性,简化了设计过程,并为开发人员提供了更多的工具和资源进行优化和测试。 ### 回答3: HLS和Pynq在FIR滤波器设计中有着重要的应用。 HLS(High-Level Synthesis)是一种用于高级语言(如C/C++)描述硬件功能并自动生成硬件电路的技术。在FIR滤波器设计中,HLS可以将滤波器算法的高级描述转化为硬件电路。它可以将复杂的计算任务分解为并行任务,并通过合理的调度和资源分配生成高效的硬件。与传统的手动硬件设计相比,HLS可以大大缩短设计周期并提高设计的可重用性。 Pynq是一种基于Python的可编程逻辑(PL)和处理系统(PS)的开发平台。在FIR滤波器设计中,Pynq可以用于快速原型开发和系统集成。通过使用Python和Pynq,可以实现对硬件功能的快速控制和配置,而无需深入了解硬件设计的细节。Pynq还提供了各种可编程逻辑的高级库和示例代码,使得滤波器开发更加方便和高效。 结合HLS和Pynq可以实现高效的FIR滤波器设计。首先,使用HLSFIR滤波器算法转化为硬件电路,通过并行化和资源分配使得硬件电路性能更佳。其次,通过Pynq进行快速原型开发,借助Python轻松控制和配置硬件功能,便于系统集成和功能验证。这种组合使用可以提高滤波器设计的效率和效果,同时降低设计的复杂性和风险。 总之,HLS和Pynq在FIR滤波器设计中的应用使得滤波器的设计更加高效和灵活,提高了开发者的生产效率和设计质量。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值