1. 程式人生 > >Vivado HLS實現FIR濾波器(1)——使用官方C程式碼實現FIR

Vivado HLS實現FIR濾波器(1)——使用官方C程式碼實現FIR

使用官方C程式碼實現FIR

參考資料:

  1. 教程——基於HLS實現FIR濾波器https://blog.csdn.net/LZY272942518/article/details/46730303
  2. Vivado HLS之濾波器實現https://blog.csdn.net/smilencezq/article/details/39054975Vivado HLS之濾波器實現https://blog.csdn.net/smilencezq/article/details/39054975
  3. VIVADO FIR濾波器設計與模擬(一)https://blog.csdn.net/chinkwoyu/article/details/80262273
  4. VIVADO FIR濾波器設計與模擬(二)
  5. ZED Board從入門到精通系列(八)——Vivado HLS實現矩陣相乘 https://blog.csdn.net/kkk584520/article/details/18812321

不同點說明

使用Vivado HLS的FIR濾波器例程,程式碼在後面給出了,上面的參考資料裡也有,網上的資料已經有很多類似的了,下面分享一些不一樣的地方:
(1)網上資料和Xilinx出版的一些書籍都沒有詳細說到測試檔案fir_test中out.gold.dat檔案,會導致程式出現一些小問題,在本部落格中刪掉了資料的測試對比,只保留了測試步驟,這樣有了C測試檔案之後可以進行C/RTL協同模擬;
(2)在編寫C程式碼生成FIR IP後,沒有後續的再Vivado中呼叫的過程,下一篇部落格將會給出HLS生成的IP如何在Vivado中呼叫並且設計時序和驅動訊號。

程式結構

C語言程式碼

  1. fir.c檔案
    包含<ap_cint>標頭檔案,引入任意精度資料型別,可以定義為任意精度的整數,如uint5 x;指定義一個無符號的位寬為5位的數x。
#include "fir.h"
#include <ap_cint.h>

void fir ( data_t *y, coef_t c[N], data_t x)
{
#pragma HLS INTERFACE ap_ovld port=y
#pragma HLS RESOURCE variable=c core=RAM_1P_BRAM
	//將c口設定成與外部ram相連的介面,使得c口可以直接從外部ram中讀資料
static data_t shift_reg[N]; acc_t acc; data_t data; int i; acc=0; Shift_Accum_Loop: for (i=N-1;i>=0;i--) { #pragma HLS UNROLL if (i==0) { shift_reg[0]=x; data = x; } else { shift_reg[i]=shift_reg[i-1]; data= shift_reg[i]; } acc += data*c[i];; } *y = acc; }

2.fir.h檔案
定義FIR濾波器的階數為11階。

#ifndef FIR_H_
#define FIR_H_
#define N   11

typedef int coef_t;
typedef int data_t;
typedef int acc_t;

void fir (
 data_t *y,
 coef_t c[N+1],
 data_t x
 );

#endif

3.fir.test檔案

#include <stdio.h>
#include <math.h>
#include "fir.h"

int main ()
{
	const int SAMPLES=600;
	FILE *fp;

	data_t signal, output;
	coef_t taps[N] ={0,-10,-9,23,56,63,56,23,-9,-10,0,};//濾波器係數

	int i, ramp_up;
	signal = 0;
	ramp_up = 1;

//	fp = fopen("out.dat","w");	//取消了開啟out.dat
	for(i=0; i<=SAMPLES; i++)
	{
		if (ramp_up == 1)
			signal = signal + 1;
		else
			signal = signal - 1;

		// Execute the function with latest input
		fir(&output,taps,signal);

		if((ramp_up == 1) && (signal >= 75))
			ramp_up = 0;
		else if((ramp_up == 0) && (signal <= -75))
			ramp_up = 1;

		// Save the results.
	//	fprintf(fp,"%i %d %d\n",i,signal,output);
	}

	printf("Comparing against output data\n");

	return 0;
}

模擬綜合

(1)點選 Run C Simulation,進行C模擬
(2)點選Run C Synthesis,進行C的綜合分析,獲得分析報告,看到資源使用情況,可以草考資料連結的第五篇進行約束。
在這裡插入圖片描述

(3)點選Run C/RTL Cosimulation,進行C和RTL協同模擬,進行了這一步之後可以看到模擬波形,打包成IP後在VIVADO中才能進行模擬。 在這裡插入圖片描述

(4)協同模擬成功後,下圖紅框中的圖示才會點亮,能夠進行點選,點選該圖示會開啟VIVADO的檢視模擬波形,HLS會綜合處一些原本沒有的引腳,要根據模擬波形的引腳時序在VIVADO中給出高低電平。在這裡插入圖片描述

(5)打包IP
在這裡插入圖片描述
生成IP成功後會在solution下的impl -> ip 資料夾下生成一個.zip壓縮包,將此壓縮包匯入VIVADO即可使用生成的FIR濾波器。
在這裡插入圖片描述