Vivado HLS實現FIR濾波器(1)——使用官方C程式碼實現FIR
阿新 • • 發佈:2018-11-11
使用官方C程式碼實現FIR
參考資料:
- 教程——基於HLS實現FIR濾波器https://blog.csdn.net/LZY272942518/article/details/46730303
- Vivado HLS之濾波器實現https://blog.csdn.net/smilencezq/article/details/39054975Vivado HLS之濾波器實現https://blog.csdn.net/smilencezq/article/details/39054975
- VIVADO FIR濾波器設計與模擬(一)https://blog.csdn.net/chinkwoyu/article/details/80262273
- VIVADO FIR濾波器設計與模擬(二)
- 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語言程式碼
- 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濾波器。