Vivado HLS是一款強(qiáng)大的高層次綜合工具,可將C/C++代碼轉(zhuǎn)換為硬件描述語言(HDL),顯著提升FPGA開發(fā)效率。
1. FIR參數(shù)確定
FIR濾波器的設(shè)計(jì),首先要明確其技術(shù)指標(biāo),這些指標(biāo)對(duì)濾波器的性能和資源占用起著關(guān)鍵作用。以一個(gè)低通濾波器為例,其具體參數(shù)如下:
濾波器階數(shù)設(shè)定為15。
采樣頻率是100MHz。
通帶截止頻率為20MHz。
阻帶起始頻率為30MHz。
通帶波紋要求在0.1dB以內(nèi)。
阻帶衰減需達(dá)到60dB。
2. FIR系數(shù)計(jì)算
可以借助Python等工具來計(jì)算濾波器系數(shù)。下面是用Python計(jì)算系數(shù)的代碼:
importnumpyasnpfromscipyimportsignalimportmatplotlib.pyplotasplt# 濾波器參數(shù)order =15# 濾波器階數(shù)fs =100e6# 采樣頻率 (Hz)f_pass =20e6# 通帶截止頻率 (Hz)f_stop =30e6# 阻帶起始頻率 (Hz)A_pass =0.1# 通帶波紋 (dB)A_stop =60# 阻帶衰減 (dB)# 歸一化頻率nyquist =0.5* fs wp = f_pass / nyquist ws = f_stop / nyquist# 計(jì)算FIR濾波器系數(shù)(使用 Parks-McClellan 算法)h = signal.remez(order +1, [0, wp, ws,1.0], [1,0], Hz=1.0)# 打印系數(shù)(量化為16位定點(diǎn)數(shù))coeffs_q15 = [int(round(c *32767))forcinh]print("FIR系數(shù) (Q15格式):")fori, cinenumerate(coeffs_q15): print(f"h[{i}] ={c}, 即{c/32768:.10f}")# 繪制頻率響應(yīng)w, h_freq = signal.freqz(h) plt.figure() plt.plot(0.5*fs*w/np.pi,20*np.log10(np.abs(h_freq))) plt.title('FIR濾波器頻率響應(yīng)') plt.xlabel('頻率 (Hz)') plt.ylabel('幅度 (dB)') plt.grid(True) plt.axvline(f_pass, color='green') # 通帶截止頻率plt.axvline(f_stop, color='red') # 阻帶起始頻率plt.show()
3. C/C++代碼實(shí)現(xiàn)
使用Vivado HLS特定的數(shù)據(jù)類型和指令:
#include"fir.h"voidfir(data_t*output,data_tinput){ // 定義FIR系數(shù)(Q15格式)constcoeff_th[NUM_TAPS] = { -10,-22,-32,-37,-26,10,72,133, 171,171,133,72,10,-26,-37,-32,-22,-10 }; // 聲明移位寄存器數(shù)組staticdata_tshift_reg[NUM_TAPS]; // pragma指令,優(yōu)化循環(huán)展開#pragmaHLS ARRAY_PARTITION variable=shift_reg complete dim=1// 數(shù)據(jù)移位操作for(inti = NUM_TAPS -1; i >0; i--) { #pragmaHLS UNROLL shift_reg[i] = shift_reg[i-1]; } shift_reg[0] = input; // 執(zhí)行乘法累加操作acc_tacc =0; for(inti =0; i < NUM_TAPS; i++) { ? ? ? ?#pragma?HLS UNROLL? ? ? ? ?acc += shift_reg[i] * h[i]; ? ? } ? ? ? ??// 輸出結(jié)果? ? ?*output = acc >>15;// Q15格式轉(zhuǎn)換}
定義頭文件:
#ifndef_FIR_H_#define_FIR_H_#include"ap_fixed.h"http:// 定義數(shù)據(jù)類型typedefap_fixed<16,?1>data_t; // 16位定點(diǎn)數(shù),1位整數(shù),15位小數(shù)typedefap_fixed<16,?1>coeff_t; // 系數(shù)類型typedefap_fixed<32,?17>acc_t; // 累加器類型,防止溢出// 定義濾波器抽頭數(shù)#defineNUM_TAPS 19// 函數(shù)原型voidfir(data_t*output,data_tinput);#endif
定義測(cè)試程序:
#include"fir.h"#include#include #include #definePI 3.14159265358979323846intmain(){ // 測(cè)試數(shù)據(jù)data_tinput[100]; data_toutput[100]; // 生成測(cè)試信號(hào)(混合了5MHz和40MHz的正弦波)for(inti =0; i 100; i++) { ? ? ? ?// 5MHz信號(hào)(應(yīng)該通過)float?sig1 =?0.5?*?sin(2.0?* PI *?5e6?* i /?100e6); ? ? ? ?// 40MHz信號(hào)(應(yīng)該被衰減)float?sig2 =?0.5?*?sin(2.0?* PI *?40e6?* i /?100e6); ? ? ? ?// 混合信號(hào)? ? ? ? ?input[i] = sig1 + sig2; ? ? } ? ? ? ??// 應(yīng)用FIR濾波器for(int?i =?0; i 100; i++) { ? ? ? ?fir(&output[i], input[i]); ? ? } ? ? ? ??// 輸出結(jié)果到文件? ? ?FILE *fp_in =?fopen("input_data.txt",?"w"); ? ? FILE *fp_out =?fopen("output_data.txt",?"w"); ? ? ? ??for(int?i =?0; i 100; i++) { ? ? ? ?fprintf(fp_in,?"%f ", (float)input[i]); ? ? ? ?fprintf(fp_out,?"%f ", (float)output[i]); ? ? } ? ? ? ??fclose(fp_in); ? ?fclose(fp_out); ? ? ? ??printf("測(cè)試完成!數(shù)據(jù)已輸出到input_data.txt和output_data.txt "); ? ? ? ??// 簡(jiǎn)單驗(yàn)證(檢查高頻分量是否被衰減)float?sum_input =?0, sum_output =?0; ? ?for(int?i =?80; i 100; i++) { ? ? ? ? sum_input +=?fabs((float)input[i]); ? ? ? ? sum_output +=?fabs((float)output[i]); ? ? } ? ? ? ??if(sum_output < sum_input *?0.1) { ? ? ? ?printf("驗(yàn)證通過:高頻分量被有效衰減 "); ? ? ? ?return0; ? ? }?else?{ ? ? ? ?printf("驗(yàn)證失敗:高頻分量衰減不足 "); ? ? ? ?return1; ? ? } }
4. Vivado HLS項(xiàng)目創(chuàng)建與配置
4.1 在Vivado HLS中創(chuàng)建新項(xiàng)目并配置
1.打開Vivado HLS工具。
2.執(zhí)行 "File > New Project" 命令來創(chuàng)建一個(gè)新的項(xiàng)目。
3.為項(xiàng)目命名,例如 "FIR_Filter",并選擇合適的存儲(chǔ)位置。
4.添加源文件,即前面編寫的fir.c和fir.h。
5.添加測(cè)試平臺(tái)文件tb_fir.c。
6.指定目標(biāo)設(shè)備,比如xc7z020clg400-1。
7.配置解決方案,設(shè)置時(shí)鐘周期(例如 10ns)和復(fù)位類型。
4.2在Vivado HLS中執(zhí)行C仿真
1.點(diǎn)擊 "Project > Run C Simulation"。
2.確保仿真順利完成,并且控制臺(tái)顯示 "Verification successful"。
3.可以使用 gnuplot 或 MATLAB 對(duì)輸出文件進(jìn)行分析。
4.3執(zhí)行C綜合以將C代碼轉(zhuǎn)換為RTL
1.選擇 "Solution > Run C Synthesis > Active Solution"。
2.綜合完成后,查看報(bào)告,重點(diǎn)關(guān)注:
資源利用率(DSP、LUT、FF 等)。
延遲(Latency)和吞吐量(Interval)。
關(guān)鍵路徑分析。
4.4進(jìn)行RTL級(jí)仿真驗(yàn)證
1.選擇 "Solution > Run C/RTL Co-simulation"。
2.選擇仿真工具(如VCS、ModelSim等)。
3.等待仿真完成,檢查結(jié)果是否與C仿真一致。
4.5導(dǎo)出IP
將設(shè)計(jì)導(dǎo)出為IP核供Vivado使用:
1.選擇 "Solution > Export RTL"。
2.保持默認(rèn)設(shè)置,點(diǎn)擊 "OK"。
3.導(dǎo)出完成后,IP 核會(huì)出現(xiàn)在項(xiàng)目目錄的exported_ip文件夾中。
4.6在Vivado中集成IP

1.打開 Vivado,創(chuàng)建新工程或打開已有工程。
2.點(diǎn)擊 "Settings > IP > Repository",添加HLS導(dǎo)出的IP路徑。
3.在Block Design中添加FIR濾波器IP核。
4.完成系統(tǒng)集成(添加時(shí)鐘、復(fù)位等)。
5.生成比特流并下載到FPGA進(jìn)行硬件驗(yàn)證。
-
FPGA
+關(guān)注
關(guān)注
1660文章
22406瀏覽量
636077 -
濾波器
+關(guān)注
關(guān)注
162文章
8409瀏覽量
185662 -
低通濾波器
+關(guān)注
關(guān)注
15文章
553瀏覽量
49004 -
Vivado
+關(guān)注
關(guān)注
19文章
857瀏覽量
71094
原文標(biāo)題:通過vivado HLS設(shè)計(jì)一個(gè)FIR低通濾波器
文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
使用DDS生成三個(gè)信號(hào)并在Vivado中實(shí)現(xiàn)低通濾波器
Vivado 使用Simulink設(shè)計(jì)FIR濾波器
信號(hào)的譜分析、做一個(gè)FIR數(shù)字低通濾波器
如何設(shè)計(jì)低通FIR濾波器
并行FIR濾波器Verilog設(shè)計(jì)
基于DSP的FIR數(shù)字濾波器設(shè)計(jì)與實(shí)現(xiàn)
基于MATLAB及FPGA的FIR低通濾波器的設(shè)計(jì)
HLS系列 – High Level Synthesis(HLS) 從一個(gè)最簡(jiǎn)單的fir濾波器開始2
HLS系列 – High Level Synthesis(HLS) 從一個(gè)最簡(jiǎn)單的fir濾波器開始3
HLS系列 – High Level Synthesis(HLS) 從一個(gè)最簡(jiǎn)單的fir濾波器開始4
HLS系列 – High LevelSynthesis(HLS) 從一個(gè)最簡(jiǎn)單的fir濾波器開始5
詳解FIR濾波器和IIR濾波器的區(qū)別
數(shù)字低通濾波器的設(shè)計(jì)
Matlab低通濾波器設(shè)定與實(shí)踐
如何使用HLS加速FPGA上的FIR濾波器
通過vivado HLS設(shè)計(jì)一個(gè)FIR低通濾波器
評(píng)論