大俠好,歡迎來到FPGA技術(shù)江湖,江湖偌大,相見即是緣分。大俠可以關(guān)注FPGA技術(shù)江湖,在“闖蕩江湖”、"行俠仗義"欄里獲取其他感興趣的資源,或者一起煮酒言歡。
今天給大俠帶來在畢業(yè)設(shè)計(jì)之基于FPGA的FIR數(shù)字濾波器設(shè)計(jì),僅供大俠參考,話不多說,上貨。
本篇介紹基于FPGA的FIR數(shù)字濾波器設(shè)計(jì),針對(duì)畢業(yè)設(shè)計(jì)要做的基本工作有如下幾點(diǎn):
(一)掌握有限沖擊響應(yīng)FIR(Finite Impulse Response, FIR)的基本結(jié)構(gòu),研究現(xiàn)有的實(shí)現(xiàn)方法,對(duì)各種方案和步驟進(jìn)行比較和論證分析,然后針對(duì)目前FIR數(shù)字濾波器需要的特點(diǎn),速度快和硬件規(guī)模小,作為指導(dǎo)思想進(jìn)行設(shè)計(jì)計(jì)算。
(二)基于硬件FPGA的特點(diǎn),利用Matlab軟件以及窗函數(shù)法設(shè)計(jì)濾波器。對(duì)整個(gè)FPGA元件,計(jì)劃采用模塊化、層次化設(shè)計(jì)思想,從而對(duì)各個(gè)部分功能進(jìn)行更為詳細(xì)的理解和分工設(shè)計(jì),最終FIR數(shù)字濾波器的設(shè)計(jì)語言選擇 Verilog HDL硬件編程語言。
(三)設(shè)計(jì)中的軟件仿真使用開發(fā)軟件Quartus II,并且利用Matlab工具進(jìn)行對(duì)比仿真,在仿真的過程中,對(duì)比證明,本設(shè)計(jì)的濾波器的技術(shù)指標(biāo)已經(jīng)全部達(dá)標(biāo)。
1 緒?論
1.1 本課題研究意義
在現(xiàn)代通信信號(hào)處理領(lǐng)域中,隨著各種精密計(jì)算和快速計(jì)算的發(fā)展對(duì)信號(hào)處理的實(shí)時(shí)性、快速性的要求越來越高。以往的模擬濾波器無法克服電壓漂移、溫度漂移和噪聲等問題,從而帶來了許多誤差和不穩(wěn)定因素。而數(shù)字濾波器具有穩(wěn)定性高、精度高、設(shè)計(jì)靈活、實(shí)現(xiàn)方便等突出優(yōu)點(diǎn)。
FPGA元器件在高速并行處理和數(shù)據(jù)傳輸中有獨(dú)特優(yōu)勢(shì),F(xiàn)PGA正在前端信號(hào)處理中越來越多地代替ASIC和DSP。我們需要的就是這種設(shè)計(jì)周期短,功能密度高,重組時(shí)間短的元器件。本文在FPGA元器件的基礎(chǔ)上,實(shí)現(xiàn)現(xiàn)代FIR數(shù)字濾波器功能。并且研究多種快速的FIR數(shù)字濾波器的理論設(shè)計(jì)思想和程序設(shè)計(jì)方法。
1.2 國內(nèi)外研究現(xiàn)狀分析
1985年,Xilinx生產(chǎn)出了第一塊FPGA元器件,由于它有著集成度高、方便易用、開發(fā)和上市周期短的絕對(duì)優(yōu)勢(shì),使得FPGA器件在數(shù)字設(shè)計(jì)和電子生產(chǎn)中得到迅速普及和應(yīng)用,發(fā)展?jié)摿κ志薮蟆,F(xiàn)在FPGA已經(jīng)發(fā)展到可以利用硬件乘加器、片內(nèi)儲(chǔ)存器、邏輯單元、流水處理技術(shù)等特有的硬件結(jié)構(gòu),高速完成FFT 、FIR 、復(fù)數(shù)乘加、卷積、三角函數(shù)以及矩陣運(yùn)算等數(shù)字信號(hào)處理。這樣可以完成信號(hào)處理的主要技術(shù),如中頻采樣、參數(shù)估計(jì)、自適應(yīng)濾波、脈沖壓縮、自適應(yīng)波束形成和旁瓣對(duì)消等。
1.3 研究思路
通過對(duì)目前數(shù)字濾波器的幾種實(shí)現(xiàn)方法的簡單分析,本文認(rèn)為基于FPGA的數(shù)字濾波器具有許多優(yōu)點(diǎn),本文考慮到信息技術(shù)的發(fā)展對(duì)于數(shù)字濾波器的要求越來越高,而目前FIR數(shù)字濾波器的性能還不完善,于是選擇了基于FPGA的數(shù)字濾波器作為主要研究內(nèi)容,通常濾波器在進(jìn)行數(shù)據(jù)處理時(shí)用到了卷積運(yùn)算,在設(shè)計(jì)中的解決這些乘法運(yùn)算的思路是將它們轉(zhuǎn)換成加減法,這是目前解決乘法運(yùn)算的主流思想。設(shè)計(jì)初期在Matlab下對(duì)濾波器原理進(jìn)行證明包括(零極點(diǎn)圖、時(shí)域和頻域分析圖等),分析FIR數(shù)字濾波器的多種理論設(shè)計(jì)思想和窗函數(shù)選擇方法,在設(shè)計(jì)后期對(duì)FIR數(shù)字濾波器的小數(shù)乘法問題進(jìn)行單獨(dú)論證。然后對(duì)分析出來的問題進(jìn)行論證和解決,最后在Quartus Ⅱ中進(jìn)行仿真驗(yàn)證。
1.4 相關(guān)概念說明
數(shù)字濾波器(Digital filter)是由數(shù)字乘法器、加法器和延時(shí)單元組成的一種裝置。其功能是對(duì)輸入離散信號(hào)的數(shù)字代碼進(jìn)行運(yùn)算處理,以達(dá)到改變信號(hào)頻譜的目的。可認(rèn)為是一個(gè)離散時(shí)間系統(tǒng)按預(yù)定的算法,將輸入離散時(shí)間信號(hào)轉(zhuǎn)換為所要求的輸出離散時(shí)間信號(hào)的特定功能裝置FIR(Finite Impulse Response )由線性系統(tǒng)理論可知,在某種適度條件下,輸入到線性系統(tǒng)的一個(gè)沖擊完全可以表征系統(tǒng)。當(dāng)我們處理有限的離散數(shù)據(jù)時(shí),線形系統(tǒng)的響應(yīng)(包括對(duì)沖擊的響應(yīng))也是有限的。若線性系統(tǒng)僅是一個(gè)空間濾波器,則通過簡單地觀察它對(duì)沖擊的響應(yīng),我們就可以完全確定該濾波器。通過這種方式確定的濾波器稱為有限沖擊響應(yīng)(FIR)濾波器。
圖1-1總體設(shè)計(jì)流程圖
2 FIR數(shù)字濾波器的設(shè)計(jì)方法
2.1 理論部分
2.1.1? 引言
數(shù)字濾波器的功能一般是用來變換時(shí)域或者頻域中某些要求信號(hào)的屬性,濾除信號(hào)中某一部分頻率分量。經(jīng)過數(shù)字濾波器的信號(hào)是讓其頻譜與數(shù)字濾波器的頻率響應(yīng)相乘從而得出新的結(jié)果。經(jīng)過一個(gè)線性卷積過程,從時(shí)域上輸入信號(hào)與濾波器的單位沖擊響應(yīng)作一個(gè)卷積和。下面是卷積定義式:
(1)
LTI數(shù)字濾波器在一般情況下分為有限脈沖響應(yīng)(Finite impulse response)和無限脈沖響應(yīng)(Infinite impulse response),F(xiàn)IR數(shù)字濾波器的設(shè)計(jì)方法和IIR濾波器的設(shè)計(jì)方法有很大的差別。因?yàn)槠湓O(shè)計(jì)方向是選擇有限長度的,使頻率響應(yīng)函數(shù)滿足指標(biāo)。數(shù)字濾波器正在用直接的電子計(jì)算機(jī)規(guī)范和算法進(jìn)行分析的方式來逐漸代替?zhèn)鹘y(tǒng)的模擬濾波器的RLC元器件和放大電路。
2.1.2? FIR數(shù)字濾波器的基礎(chǔ)
首先介紹FIR數(shù)字濾波器基本原理,在如下表格中對(duì)FIR和IIR數(shù)字濾波器進(jìn)行了全面的比較:
表2-1兩種濾波器特點(diǎn)比較分析
通常情況下一般數(shù)字濾波器的N階FIR數(shù)字濾波器基于輸入信號(hào)x(n)的表達(dá)式為:
??(2)
這個(gè)公式給我們了一個(gè)非常明了的直接型網(wǎng)絡(luò)結(jié)構(gòu),該結(jié)構(gòu)表現(xiàn)出N個(gè)乘法器,每次采樣y(n)的內(nèi)容是n次乘法和n-1次加法,然后做乘累加之和。如圖2-1所示:
圖2-1 FIR濾波器直接型網(wǎng)絡(luò)結(jié)構(gòu)
從DSP的介紹中,第一類線性相位對(duì)h(n)的約束條件:
?(3)
(4)
由公式(3),(4)我們可以推出:
?(5)
移相并利用三角公式化簡得到:
?(6)
從數(shù)字信號(hào)處理學(xué)科中知道函數(shù)關(guān)于求和區(qū)間的中心(N-1)/2奇對(duì)稱,于是我們要求和h(n)滿足如下條件:
其中對(duì)應(yīng)的有:
(7)
圖2-2 線性相位FIR濾波器結(jié)構(gòu)
若h(n)呈現(xiàn)對(duì)稱特性,即此具有線性相位的濾波器是FIR數(shù)字濾波器。濾波器的基礎(chǔ)網(wǎng)絡(luò)結(jié)構(gòu)可以相互進(jìn)行轉(zhuǎn)換。
在前面本篇已經(jīng)討論過, FPGA的實(shí)現(xiàn)中將對(duì)各種方法進(jìn)行比較,找出最優(yōu)設(shè)計(jì)方式。從而達(dá)到減少資源占有和提高系統(tǒng)作業(yè)速度的目的,更好的體現(xiàn)實(shí)時(shí)性的數(shù)字濾波器優(yōu)勢(shì)。
2.1.3? 數(shù)字濾波器的設(shè)計(jì)原理
在數(shù)字信號(hào)處理技術(shù)的研究中,一般是使用的三種設(shè)計(jì)方法:窗函數(shù)法,F(xiàn)DATool直接設(shè)計(jì)法,程序編譯法。本文首先使用窗函數(shù)和Matlab軟件共同進(jìn)行設(shè)計(jì)。
隨著技術(shù)的不斷發(fā)展,Matlab軟件能給設(shè)計(jì)者帶來的數(shù)字信號(hào)處理工作已經(jīng)非常的完善和多樣了,設(shè)計(jì)者可以利用Matlab軟件進(jìn)行數(shù)字濾波器的設(shè)計(jì)和仿真,而且還可以用這款軟件進(jìn)行設(shè)計(jì)的優(yōu)化。數(shù)字濾波器的一般設(shè)計(jì)步驟如下:
1.指標(biāo)的確定
做任何工程或者設(shè)計(jì),設(shè)計(jì)者都必須要有一個(gè)期望的指標(biāo)用來限制設(shè)計(jì)范圍。在很多的實(shí)際應(yīng)用中,設(shè)計(jì)者常常都是使用數(shù)字濾波器做選頻的工作。因此,指標(biāo)的形式一半在頻域中給出相位響應(yīng)和幅度。相位響應(yīng)的指標(biāo)形式,一半是指系統(tǒng)在通頻帶中藥有線性相位。幅度指標(biāo):絕對(duì)指標(biāo),它給出對(duì)幅度響應(yīng)函數(shù)的要求,一般用于FIR濾波器的設(shè)計(jì)。相對(duì)指標(biāo),以分貝值的形式給出具體限制。
2.逼近目標(biāo)
設(shè)計(jì)者做高頻的時(shí)候大概都有一個(gè)模式,就是首先得到技術(shù)指標(biāo),然后利用我們的技術(shù)和工具讓我們的產(chǎn)品去逼近這個(gè)指標(biāo)。同理我們首先建立以個(gè)目標(biāo)的數(shù)字濾波器模型。一般情況下都是采用理想的數(shù)字濾波器模型,然后去逼近我們想要的目標(biāo)數(shù)字濾波器參數(shù)。
3.計(jì)算機(jī)仿真和性能優(yōu)化分析
在工作中我們發(fā)現(xiàn)通過(1)、(2)之后本文會(huì)得到以差分、系統(tǒng)函數(shù)或者沖擊響應(yīng)這三種方式描述的濾波器。這個(gè)時(shí)候設(shè)計(jì)者可以利用計(jì)算進(jìn)行仿真,在系統(tǒng)中分析技術(shù)指標(biāo)和濾波結(jié)果是否是希望得到的結(jié)果。
圖2-3各種理想數(shù)字濾波器的幅度頻率響應(yīng)
2.1.4? FIR數(shù)字濾波器的理論計(jì)算方式與參數(shù)轉(zhuǎn)換思想
在理論上掌握了FIR數(shù)字濾波器的基本原理之后,本文需要對(duì)設(shè)計(jì)思想進(jìn)行一個(gè)多方位的論證和嘗試。首先設(shè)計(jì)者設(shè)計(jì)濾波器要有一個(gè)硬性的指標(biāo),這個(gè)指標(biāo)可以是直接給出最基本的數(shù)據(jù),也有多重表現(xiàn)形式。于是我例舉兩種特殊的指標(biāo)形式然后加以解決設(shè)計(jì)。然后我們分別用2種方式來設(shè)計(jì)不同指標(biāo)的濾波器。接下來我首先用程序的方式來實(shí)現(xiàn)濾波器:
1.逼近法轉(zhuǎn)換與思想
使用remez函數(shù)設(shè)計(jì)FIR低通濾波器
設(shè)計(jì)濾波器,使逼近低通濾波特性||。
要求通帶波紋?,阻帶衰減,并用最小階數(shù)實(shí)現(xiàn)。
繪出設(shè)計(jì)的FIR數(shù)字濾波幅頻特性曲線,檢驗(yàn)設(shè)計(jì)指標(biāo)。
這個(gè)指標(biāo)我們可以以如下計(jì)算方法來得出詳細(xì)指標(biāo):
從給出的低通濾波特性||。我們可以看出設(shè)計(jì)參數(shù)f=[1/4,5/16],m=[1,0];
dev的計(jì)算根據(jù)公式:
于是有,
所以dev(1),dev(2)可以被表示出來。
2.逼近法程序描述與思想
有了這幾個(gè)參數(shù)我們現(xiàn)在就可以根據(jù)已經(jīng)設(shè)定好的格式來調(diào)用函數(shù)remezord和remez函數(shù)了,于是可得如下程序。
clear;close all
fc=1/4;fs=5/16; %輸入給定指標(biāo)
Rp=3;As=60;Fs=2;
f=[fc,fs];m=[1,0]; %計(jì)算remezord函數(shù)所需參數(shù)f,m,dev
dev=[(10^(Rp/20)-1)/(10^(Rp/20)+1),10^(-As/20)];
[N,fo,mo,W]=remezord(f,m,dev,F(xiàn)s); %確定remez函數(shù)所需參數(shù)
hn=remez(N,fo,mo,W); %調(diào)用remez函數(shù)進(jìn)行設(shè)計(jì)
hw=fft(hn,512); %求設(shè)計(jì)出的濾波器頻率特性
w=[0:511] *2/512;
plot(w,20*log10(abs(hw)));grid; %畫對(duì)數(shù)幅頻特性圖
axis([0,max(w)/2,-90,5]);
xlabel('w/pi');ylabel('Magnitude(dB)')
line([0,0.4],[-3,-3]); %畫線檢驗(yàn)設(shè)計(jì)結(jié)果
line([1/4,1/4],[-90,5]);line([5/16,5/16],[-90,5]);
3.仿真圖像與結(jié)果
用以上的程序我們可以得到在Matlab中的許多參數(shù)和圖像,從而進(jìn)一步分析我們的設(shè)計(jì)。首先引入程序輸出的幅頻特性圖:(如圖2-4)
圖2-4在Matlab中的程序
圖2-5程序輸出的幅頻特性
圖2-6 Impulse Response
圖2-7 Magnitude and Phase Responses
圖2-8 Phase Delay
圖2-9 Pole,Zero plot
結(jié)論:從上面程序運(yùn)行情況分析,觀察程序輸出的幅頻特性圖中橫線為-3dB,兩條豎線分別位于頻率π/4和5π/16。顯然,通帶指標(biāo)有富裕,零極點(diǎn)圖反應(yīng)出大部分零極點(diǎn)在圓內(nèi),過渡帶寬度和阻帶最小衰減剛好滿足指標(biāo)要求。
4.窗函數(shù)選擇法與規(guī)劃思想
表2-2窗函數(shù)選擇指標(biāo)
在設(shè)計(jì)指標(biāo)中沒有直接給出窗函數(shù)的,可以利用下面這個(gè)表格進(jìn)行篩選,具體方法如下:
這個(gè)表格給出了近似過渡帶寬、精確過渡帶寬和最小阻帶衰減,我們可以根據(jù)自己濾波器的參數(shù)來選擇我們的窗函數(shù),因?yàn)檫x擇不同的窗函數(shù)設(shè)計(jì)出來的濾波器生成的過渡帶寬度和阻帶最小衰減是不同的。在這里我以一個(gè)例子來說明函數(shù)的選擇方式:
用窗函數(shù)法設(shè)計(jì)FIR帶通濾波器。指標(biāo)如下:
高端通帶截止頻率:
高端阻帶截止頻率:
低端阻帶截止頻率:
低端通帶截止頻率:
通帶最大衰減??Rp=1dB
阻帶最小衰減??Rs=60dB
在這樣一個(gè)例子中,可以看到它明確的給出了Rs=60dB來設(shè)置窗函數(shù)類型和階次。表格中給出的blackman窗其濾波器阻帶最小衰減是74dB,再利用給出的其他參數(shù)計(jì)算濾波器階數(shù)。表中顯示窗口長度M由過渡帶寬度B=0.8π-0.65π=0.15π決定,而Blackman窗設(shè)計(jì)的濾波器過渡帶寬度為12π/M,則M=12/0.15=80。又因M=N+1,所以濾波器階數(shù)N=79。
在了解了怎么選擇窗函數(shù)和計(jì)算濾波器階數(shù)之后,本論文將針對(duì)實(shí)際FIR數(shù)字濾波器進(jìn)行研究。已經(jīng)給出了設(shè)計(jì)參數(shù),下面開始利用MATLAB程序來設(shè)計(jì)這個(gè)濾波器。
5.窗函數(shù)法程序描述與思想
程序和對(duì)應(yīng)的解釋:
%用窗函數(shù)法設(shè)計(jì)FIR帶通濾波器
clear;close?all;
wls=0.2*pi;wlp=0.35*pi;whp=0.65*pi;
B=wlp-wls;??????????????%這里是在計(jì)算過渡帶寬
N=ceil(12/0.15);????????%計(jì)算窗口長度
wc=[wlp/pi-6/N,whp/pi+6/N];??%設(shè)置理想帶通截止頻率
hn=fir1(N-1,wc,Blackman(N)); %設(shè)計(jì)濾波器參數(shù)
6.理論計(jì)算方法總結(jié)
仿真完成之后,掌握如何去利用已有的指標(biāo)去設(shè)計(jì)一個(gè)濾波器,總的來說就是四項(xiàng):
通過傅里葉逆變換獲得理想濾波器的單位脈沖響應(yīng)hd(n)。
分析給定參數(shù),計(jì)算出濾波器的階數(shù),頻率等等相關(guān)指標(biāo)。
把已經(jīng)有的參數(shù)用程序函數(shù)表達(dá)出來,利用已經(jīng)有的各種內(nèi)置函數(shù)架設(shè)起濾波器。
參看Matlab的輸出圖形和參數(shù)是否滿足要求。
2.1.5? Matlab直接FDAtool設(shè)計(jì)方式解析
FDATool(Filter Design & Analysis Tool)是MATLAB信號(hào)處理工具箱里專用的濾波器設(shè)計(jì)分析工具,MATLAB6.0以上的版本還專門增加了濾波器設(shè)計(jì)工具箱(Filter Design Toolbox)。FDATool可以設(shè)計(jì)幾乎所有的基本的常規(guī)濾波器,包括FIR和IIR的各種設(shè)計(jì)方法。它操作簡單,方便靈活。
FDATool界面總共分兩大部分,一部分是Design Filter,在界面的下半部,用來設(shè)置濾波器的設(shè)計(jì)參數(shù),另一部分則是特性區(qū),在界面的上半部分,用來顯示濾波器的各種特性。Design Filter部分主要分為:
Filter Type(濾波器類型)選項(xiàng),包括Lowpass(低通)、Highpass(高通)、Bandpass(帶通)、Bandstop(帶阻)和特殊的FIR濾波器。
Design Method(設(shè)計(jì)方法)選項(xiàng),包括IIR濾波器的Butterworth(巴特沃思)法、Chebyshev Type I(切比雪夫I型)法、 Chebyshev Type II(切比雪夫II型) 法、Elliptic(橢圓濾波器)法和FIR濾波器的Equiripple法、Least-Squares(最小乘方)法、Window(窗函數(shù))法。
Filter Order(濾波器階數(shù))選項(xiàng),定義濾波器的階數(shù),包括Specify Order(指定階數(shù))和Minimum Order(最小階數(shù))。在Specify Order中填入所要設(shè)計(jì)的濾波器的階數(shù)(N階濾波器,Specify Order=N-1),如果選擇Minimum Order則MATLAB根據(jù)所選擇的濾波器類型自動(dòng)使用最小階數(shù)。
Frenquency Specifications選項(xiàng),可以詳細(xì)定義頻帶的各參數(shù),包括采樣頻率Fs和頻帶的截止頻率。它的具體選項(xiàng)由Filter Type選項(xiàng)和Design Method選項(xiàng)決定,例如Bandpass(帶通)濾波器需要定義Fstop1(下阻帶截止頻率)、Fpass1(通帶下限截止頻率)、Fpass2(通帶上限截止頻率)、Fstop2(上阻帶截止頻率),而Lowpass(低通)濾波器只需要定義Fstop1、Fpass1。采用窗函數(shù)設(shè)計(jì)濾波器時(shí),由于過渡帶是由窗函數(shù)的類型和階數(shù)所決定的,所以只需要定義通帶截止頻率,而不必定義阻帶參數(shù)。
Magnitude Specifications選項(xiàng),可以定義幅值衰減的情況。例如設(shè)計(jì)帶通濾波器時(shí),可以定義Wstop1(頻率Fstop1處的幅值衰減)、Wpass(通帶范圍內(nèi)的幅值衰減)、Wstop2(頻率Fstop2處的幅值衰減)。當(dāng)采用窗函數(shù)設(shè)計(jì)時(shí),通帶截止頻率處的幅值衰減固定為6db,所以不必定義。
參數(shù)要求:采樣頻率fs=100Hz,通帶下限截止頻率fc1=10 Hz,通帶上限截止頻率fc2=20 Hz,過渡帶寬6 Hz,通阻帶波動(dòng)0.01,采用凱塞窗設(shè)計(jì)。
針對(duì)一個(gè)含有5Hz、15Hz和30Hz的混和正弦波信號(hào)已知濾波器的階數(shù)n=38,beta=3.4。本例中,首先在Filter Type中選擇Bandpass;在Design Method選項(xiàng)中選擇FIR Window,接著在Window選項(xiàng)中選取Kaiser,Beta值為3.4;指定Filter Order項(xiàng)中的Specify order為38;采樣頻率Fs=100Hz,截止頻率Fc1=10Hz,F(xiàn)c2=20Hz。設(shè)置完以后點(diǎn)擊窗口下方的Design Filter,在窗口上方就會(huì)看到所設(shè)計(jì)濾波器的幅頻響應(yīng),通過菜單選項(xiàng)Analysis還可以看到濾波器的相頻響應(yīng)、組延遲、脈沖響應(yīng)、階躍響應(yīng)、零極點(diǎn)配置等。設(shè)計(jì)完成后將結(jié)果保存為kaiser15.fda文件。我們可以根據(jù)FDAtool工具得到我們的濾波器相關(guān)增益。
系數(shù)轉(zhuǎn)換成二進(jìn)制碼:
若采用乘法器,用1位整數(shù)位,1位符號(hào)位,共22位定點(diǎn)二進(jìn)制數(shù)進(jìn)行運(yùn)算,負(fù)數(shù)用補(bǔ)碼表示,由此將減法運(yùn)算變成累加求和運(yùn)算。各系數(shù)可用matlab編程轉(zhuǎn)成二進(jìn)制補(bǔ)碼:
/* General type conversion for MATLAB generated C-code */
#include "tmwtypes.h"
/*
* Expected path to tmwtypes.h
* D:MATLAB7externincludetmwtypes.h
*/
const int BL = 39;
const real64_T B[39] = {
-0.0008969942906957,0.001248746631882,0.007070735236406,0.009180571739749,-8.354434235897e-018,-0.01457672567709,-0.01798701306701,-0.005189936475222,0.006300913248271,-5.136773213647e-018,-0.009200436084654,0.01113207796169,0.05739543087552,0.07065284310647,-2.116878167777e-017,-0.1149210109554,-0.1575671556317,-0.05691148173912,0.1151784185022,0.2,0.1151784185022,-0.05691148173912,-0.1575671556317,-0.1149210109554,-2.116878167777e-017,0.07065284310647,0.05739543087552,0.01113207796169,-0.009200436084654,-5.136773213647e-018,0.006300913248271,-0.005189936475222,-0.01798701306701,-0.01457672567709,-8.354434235897e-018,0.009180571739749,0.007070735236406,0.001248746631882,-0.0008969942906957
};
這是一個(gè)非常典型的例子,可以清晰的看到利用Matlab提供的FDAtool設(shè)計(jì)濾波器的方便與快捷。比較以上幾種類型的濾波器參數(shù),在給定的參數(shù)要求下,采用橢圓濾波器可以獲得最佳的幅頻響應(yīng)特性,具有階數(shù)低,過渡帶窄等優(yōu)點(diǎn)。雖然橢圓濾波器在通帶也會(huì)產(chǎn)生波動(dòng),但考慮到波動(dòng)處在可接受的范圍內(nèi),仍然符合設(shè)計(jì)要求。
但由直接型傳輸函數(shù)表達(dá)式來實(shí)現(xiàn)并不實(shí)用。因此如前所說,將其分解為多個(gè)二階傳輸函數(shù)的級(jí)聯(lián)形式。借助Matlab 信號(hào)處理工具箱中函tf2sos(Transfer function to second- order- section)將傳遞函數(shù)轉(zhuǎn)換為二階級(jí)聯(lián)形式。
對(duì)于是數(shù)字信號(hào),需要對(duì)先前分析計(jì)算中分解獲得的二階子系統(tǒng)的濾波器系數(shù)進(jìn)行量化,即用一個(gè)固定的字長加以表示。量化過程中由于存在不同程度的量化誤差,由此會(huì)導(dǎo)致濾波器的頻率響應(yīng)出現(xiàn)偏差,嚴(yán)重時(shí)會(huì)使濾波器的極點(diǎn)移到單位圓之外,使系統(tǒng)不穩(wěn)定。為了獲得最優(yōu)的濾波器系數(shù),量化的精度也相當(dāng)重要。
2.1.6 FDAtool設(shè)計(jì)模板及設(shè)計(jì)結(jié)果圖
這里把上面的濾波器設(shè)計(jì)參數(shù)的總體圖給出,如圖2-10
圖2-10 FIR帶通濾波器總體設(shè)計(jì)參數(shù)
2.2程序分析部分
根據(jù)上述FIR低通數(shù)字濾波器的原理與濾波特性,我們?cè)谏厦娴能浖?shí)踐中已經(jīng)掌握了設(shè)計(jì)數(shù)字濾波器的方法并且成功的使用Matlab/Simulink進(jìn)行了設(shè)計(jì)和仿真。通過以上的過程我們可以導(dǎo)出一定性能的FIR濾波器頻率響應(yīng)與抽頭系數(shù),然后用Verilog HDL語言設(shè)計(jì)和QUARTUSⅡ仿真FIR低通數(shù)字濾波器,實(shí)現(xiàn)用軟件描述硬件的動(dòng)作及功能,應(yīng)用軟件來實(shí)現(xiàn)數(shù)字濾波器的功能和時(shí)序仿真。
2.2.1FPGA 可編程邏輯元件介紹
EDA是Electronic Design Automation的縮寫,意為電子設(shè)計(jì)自動(dòng)化,即利用計(jì)算機(jī)自動(dòng)完成電子系統(tǒng)的設(shè)計(jì)。EDA技術(shù)是以計(jì)算機(jī)和微電子技術(shù)為先導(dǎo),匯集了計(jì)算機(jī)圖形學(xué)、拓?fù)洹⑦壿媽W(xué)、微電子工藝與結(jié)構(gòu)學(xué)和計(jì)算數(shù)學(xué)等多種計(jì)算機(jī)應(yīng)用學(xué)科最新成果的先進(jìn)技術(shù)。
它與電子技術(shù)、微電子技術(shù)的發(fā)展密切相關(guān),吸收了計(jì)算機(jī)領(lǐng)域的大多數(shù)最新研究成果,以高性能的計(jì)算機(jī)作為工作工具,在EDA軟件平臺(tái)土,根據(jù)硬件描述語言HDL完成的設(shè)計(jì)文件,自動(dòng)地完成邏輯編譯、化簡、分割、綜合及優(yōu)化、布線、仿真,直至對(duì)于特定目標(biāo)芯片的適配編譯、邏輯映射和編程下載等工作。
可編程邏輯器PLD(Programmable Logic Devices)是ASIC(Application?Specific Integrated Circuits的一個(gè)重要分支。ASIC按制造方法又可分為全定制(Full Custom)產(chǎn)品、半定制(semi-custom)產(chǎn)品和可編程邏輯器件(PLD)。前兩種ASIC的設(shè)計(jì)和制造都離不開器件生產(chǎn)廠家,用戶主動(dòng)性較差。隨著微電子技術(shù)的發(fā)展,設(shè)計(jì)師們更愿意自己設(shè)計(jì)專用集成電路芯片,并盡可能縮短設(shè)計(jì)周期,最好是在實(shí)驗(yàn)室里就能設(shè)計(jì)出合適的ASIC芯片,并且立即投入實(shí)際應(yīng)用之中,在使用中也能比較方便的對(duì)設(shè)計(jì)進(jìn)行修改??删幊踢壿嬈骷褪菫闈M足用戶的這一需求應(yīng)運(yùn)而生的。
使用FPGA器件設(shè)計(jì)數(shù)字電路,不僅可以簡化設(shè)計(jì)過程,而且可以降低整個(gè)系統(tǒng)的體積和成本,增加系統(tǒng)的可靠性。它們無需花費(fèi)傳統(tǒng)意義下制造集成電路所需大量時(shí)間和精力,避免了投資風(fēng)險(xiǎn),成為電子器件行業(yè)中發(fā)展最快的一族。使用FPGA器件設(shè)計(jì)數(shù)字系統(tǒng)電路的主要優(yōu)點(diǎn)如下:
1.設(shè)計(jì)靈活
使用FPGA器件,可不受標(biāo)準(zhǔn)系列器件在邏輯功能上的限制。而且修改邏輯可在系統(tǒng)設(shè)計(jì)和使用過程的任一階段中進(jìn)行,并且只須通過對(duì)所用的FPGA器件進(jìn)行重新編程即可完成,給系統(tǒng)設(shè)計(jì)提供了很大的靈活性。
2.增大功能密集度
功能密集度是指在給定的空間能集成的邏輯功能數(shù)量??删幊?a class="article-link" target="_blank" href="/baike/1655835.html">邏輯芯片內(nèi)的組件門數(shù)高,一片F(xiàn)PGA可代替幾片、幾十片乃至幾百片中小規(guī)模的數(shù)字集成電路芯片。用FPGA器件實(shí)現(xiàn)數(shù)字系統(tǒng)時(shí)用的芯片數(shù)量少,從而減少芯片的使用數(shù)目,減少印刷線路板面積和印刷線路板數(shù)目,最終導(dǎo)致系統(tǒng)規(guī)模的全面縮減。
3.提高可靠性
減少芯片和印刷板數(shù)目,不僅能縮小系統(tǒng)規(guī)模,而且它還極大的提高了系統(tǒng)的可靠性。具有較高集成度的系統(tǒng)比用許多低集成度的標(biāo)準(zhǔn)組件設(shè)計(jì)的相同系統(tǒng)具有高得多的可靠性。使用FPGA器件減少了實(shí)現(xiàn)系統(tǒng)所需要的芯片數(shù)目,在印刷線路板上的引線以及焊點(diǎn)數(shù)量也隨之減少,所以系統(tǒng)的可靠性得以提高。
4.縮短設(shè)計(jì)周期
基于FPGA器件的可編程性和靈活性,用它來設(shè)計(jì)一個(gè)系統(tǒng)所需時(shí)間比傳統(tǒng)方法大為縮短。FPGA器件集成度高,使用時(shí)印刷線路板電路布局布線簡單。同時(shí),在樣機(jī)設(shè)計(jì)成功后,由于開發(fā)工具先進(jìn),自動(dòng)化程度高,對(duì)其進(jìn)行邏輯修改也十分簡便迅速。因此,使用FPGA器件可大大縮短系統(tǒng)的設(shè)計(jì)周期,加快產(chǎn)品投放市場的速度,提高產(chǎn)品的競爭能力。
5.工作速度快
FPGA/CPLD器件的工作速度快,一般可以達(dá)到幾百兆赫茲,遠(yuǎn)遠(yuǎn)大于DPS器件。同時(shí),使用FPGA器件后實(shí)現(xiàn)系統(tǒng)所需要的電路級(jí)數(shù)又少,因而整個(gè)系統(tǒng)的工作速度會(huì)得到提高。
6.增加系統(tǒng)的保密性能
很多FPGA器件都具有加密功能,在系統(tǒng)中廣泛的使用FPGA器件可以有效防止產(chǎn)品被他人非法仿制。
7.降低成本
使用FPGA器件實(shí)現(xiàn)數(shù)字系統(tǒng)設(shè)計(jì)時(shí),如果僅從器件本身的價(jià)格考慮,有時(shí)還看不出來它的優(yōu)勢(shì),但是影響系統(tǒng)成本的因素是多方面的,綜合考慮,使用FPGA的成本優(yōu)越性是很明顯的。首先,使用FPGA器件修改設(shè)計(jì)方便,設(shè)計(jì)周期縮短,使系統(tǒng)的研制開發(fā)費(fèi)用降低;其次,F(xiàn)PGA器件可使印刷線路板面積和需要的插件減少,從而使系統(tǒng)的制造費(fèi)用降低;再次,使用FPGA器件能使系統(tǒng)的可靠性提高,維修工作量減少,進(jìn)而使系統(tǒng)的維修服務(wù)費(fèi)用降低。總之,使用FPGA器件進(jìn)行系統(tǒng)設(shè)計(jì)能節(jié)約成本。
2.2.2 QuartusⅡ及Verilog HDL介紹
Quartus II 是 Intel 公司的綜合性開發(fā)軟件,支持原理圖、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多種設(shè)計(jì)輸入形式,內(nèi)嵌自有的綜合器以及仿真器,可以完成從設(shè)計(jì)輸入到硬件配置的完整PLD設(shè)計(jì)流程。
Quartus II可以在XP、Linux以及Unix上使用,除了可以使用Tcl腳本完成設(shè)計(jì)流程外,提供了完善的用戶圖形界面設(shè)計(jì)方式。具有運(yùn)行速度快,界面統(tǒng)一,功能集中,易學(xué)易用等特點(diǎn)。
Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模塊庫,使用戶可以充分利用成熟的模塊,簡化了設(shè)計(jì)的復(fù)雜性、加快了設(shè)計(jì)速度。對(duì)第三方EDA工具的良好支持也使用戶可以在設(shè)計(jì)流程的各個(gè)階段使用熟悉的第三方EDA工具。
此外,Quartus II 通過和 DSP Builder工具 與 Matlab/Simulink相結(jié)合,可以方便地實(shí)現(xiàn)各種DSP應(yīng)用系統(tǒng);支持Altera的片上可編程系統(tǒng)(SOPC)開發(fā),集系統(tǒng)級(jí)設(shè)計(jì)、嵌入式軟件開發(fā)、可編程邏輯設(shè)計(jì)于一體,是一種綜合性的開發(fā)平臺(tái)。
Maxplus II 作為Altera的上一代PLD設(shè)計(jì)軟件,由于其出色的易用性而得到了廣泛的應(yīng)用。目前 Altera 已經(jīng)停止了對(duì)Maxplus II 的更新支持,Quartus II 與之相比不僅僅是支持器件類型的豐富和圖形界面的改變。Altera在Quartus II 中包含了許多諸如SignalTap II、Chip Editor和 RTL Viewer 的設(shè)計(jì)輔助工具,集成了SOPC和HardCopy設(shè)計(jì)流程,并且繼承了Maxplus II 友好的圖形界面及簡便的使用方法。
Altera Quartus II 作為一種可編程邏輯的設(shè)計(jì)環(huán)境, 由于其強(qiáng)大的設(shè)計(jì)能力和直觀易用的接口,越來越受到數(shù)字系統(tǒng)設(shè)計(jì)者的歡迎。
Verilog HDL是目前應(yīng)用最為廣泛的硬件描述語言。Verilog HDL可以用來進(jìn)行各種層次的邏輯設(shè)計(jì),也可以進(jìn)行數(shù)字系統(tǒng)的邏輯綜合,仿真驗(yàn)證和時(shí)序分析等。該語言適合算法級(jí),寄存器級(jí),邏輯級(jí),門級(jí)和版圖級(jí)等各個(gè)層次的設(shè)計(jì)和描述。Verilog HDL進(jìn)行設(shè)計(jì)最大的優(yōu)點(diǎn)是其工藝無關(guān)性。這使得我們?cè)诠δ茉O(shè)計(jì),邏輯驗(yàn)證階段可以不必過多考慮門級(jí)及工藝實(shí)現(xiàn)的具體細(xì)節(jié),只需根據(jù)系統(tǒng)設(shè)計(jì)的要求施加不同的約束條件,即可設(shè)計(jì)出實(shí)際電路。VerilogHDL是一種硬件描述語言(hardware description language),為了制作數(shù)字電路而用來描述ASIC和FPGA的設(shè)計(jì)之用。VerilogHDL 的設(shè)計(jì)者想要以 C 編程語言為基礎(chǔ)設(shè)計(jì)一種語言,可以使工程師比較容易學(xué)習(xí)。
2.2.3實(shí)際濾波器程序設(shè)計(jì)(11階FIR數(shù)字濾波器)
FPGA實(shí)現(xiàn)FIR濾波器,首先進(jìn)行指標(biāo)選定和Matlab軟件參數(shù)仿真,然后執(zhí)行基于Verilog方法的硬件實(shí)現(xiàn)中用移位方法代替了乘法運(yùn)算。
表2-3設(shè)計(jì)指標(biāo)要求
根據(jù)以上指標(biāo),利用MATLAB中的FIR濾波器系數(shù)設(shè)計(jì)命令fir1(10,0.85)所設(shè)計(jì)濾波器的系數(shù)。
表2-4 Matlab中導(dǎo)出的濾波器系數(shù)
MATLAB軟件仿真的濾波器的抽頭系數(shù)及其幅度頻響特性如下圖2-11所示。
圖2-11 11階FIR濾波器的抽頭系數(shù)和幅頻特性曲線
可見抽頭系數(shù)是奇對(duì)稱的,即:
,
。
FIR濾波器采用對(duì)稱結(jié)構(gòu),每個(gè)抽頭的輸出分別乘以相應(yīng)加權(quán)的二進(jìn)制值,再將結(jié)果相加。同時(shí),利用濾波器系數(shù)的及對(duì)稱的特性,對(duì)輸入信號(hào)?進(jìn)行如下等效:
,
。
2.2.4.VerilogHDL的實(shí)現(xiàn)
這個(gè)方法的實(shí)現(xiàn)中,使用了移位代替乘法運(yùn)算來實(shí)現(xiàn)濾波器乘加的方法。由于濾波器系數(shù)都是小數(shù),所以我們先左移7位(即放大128倍),再用相應(yīng)的移位來近似這些系數(shù),最后經(jīng)過乘加運(yùn)算得到結(jié)果,對(duì)這個(gè)結(jié)果再右移7位(即縮小128倍)即可得出正確的結(jié)果。各個(gè)系數(shù)的移位情況如下:其中2表示左移1位,1表示不移位,0.5表示右移1位,其他依次類推:
128×h(0)=128×0.036=0.4608=0.5-0.03125
128×h(1)=128×0.0127=1.6256=1+0.5+0.125
128×h(2)=128×0.0417=5.3376=4+1+0.25+0.625+0.03125
128×h(3)=128×0.0878=11.2384=8+4-1+0.25
128×h(4)=128×0.1318=16.8704=16+1-0.125
128×h(5)=128×0.8500=108.800=128-16-4+0.25+0.0625
這樣,我們就可以把這個(gè)11階FIR數(shù)字濾波器的輸出用一下的算式得到
表2-5 Verilog方法設(shè)計(jì)FIR的實(shí)驗(yàn)數(shù)據(jù)
圖 2-12系數(shù)放大后求SUM
計(jì)算得到結(jié)果后再將sum右移7位,即可得到正確結(jié)果。程序的功能仿真結(jié)果如下圖2-12所示。
圖2-13功能仿真
由上圖2-12可以看出,tap0到tap10是輸入x的依次延時(shí)1個(gè)時(shí)鐘周期,結(jié)果sum輸出相對(duì)于輸入x延遲了2個(gè)時(shí)鐘周期,y輸出相對(duì)于sum輸出延遲了1個(gè)時(shí)鐘周期,這和程序設(shè)計(jì)相符合。同時(shí),對(duì)比程序運(yùn)行結(jié)果和MATLAB的計(jì)算結(jié)果(如章節(jié)開頭表格所示),可知,二者結(jié)果是一致的,其中個(gè)別數(shù)據(jù)的小誤差是由于移位取代小數(shù)乘法運(yùn)算帶來的誤差。因此,程序設(shè)計(jì)是正確的。
于是,根據(jù)以上所有思想我們可以得出以下11階FIR數(shù)字濾波器的Verilog程序如下:
module firv2(clk, x, y);
input clk;
?input?[7:0]?x;
?output?[25:0]?y;
reg [26:0] y;
reg[7:0] x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16;
wire[21:0] acc1,acc2,acc3,acc4,acc5,acc6,acc7,acc8,acc9,acc10,acc11,acc12,acc13,acc14,acc15,acc16,acc17;
reg [8:0]sxin[0:32];
reg [5:0]i,k;
reg [8:0]xx[16:0];
parameter c0=-21,
c1=-8,
c2= 22,
c3=34,
c4=6,
c5=-34,
c6=-31,
c7=32,
c8=87,
c9=32,
c10=-154,
c11=-321,
c12=-217,
c13=321,
c14=1185,
c15=1996,
c16=2328;
always @ (posedge clk)
begin
xx[16]<=sxin[16] ;
for(i=0;i<16;i=i+1)
xx[i]<=sxin[i]+sxin[32-i] ;
for(k=32;k>0;k=k-1)
?????sxin[k]<=sxin[k-1];?
?????sxin[0]<={x[7],x};
end
mult13_8 uut0(clk,c0,xx[0],acc1);
mult13_8 uut1(clk,c1,xx[1],acc2);
mult13_8 uut2(clk,c2,xx[2],acc3);
mult13_8 uut3(clk,c3,xx[3],acc4);
mult13_8 uut4(clk,c4,xx[4],acc5);
mult13_8 uut5(clk,c5,xx[5],acc6);
mult13_8 uut6(clk,c6,xx[6],acc7);
mult13_8 uut7(clk,c7,xx[7],acc8);
mult13_8 uut8(clk,c8,xx[8],acc9);
mult13_8 uut9(clk,c9,xx[9],acc10);
mult13_8 uut10(clk,c10,xx[10],acc11);
mult13_8 uut11(clk,c11,xx[11],acc12);
mult13_8 uut12(clk,c12,xx[12],acc13);
mult13_8 uut13(clk,c13,xx[13],acc14);
mult13_8 uut14(clk,c14,xx[14],acc15);
mult13_8 uut15(clk,c15,xx[15],acc16);
mult13_8 uut16(clk,c16,xx[16],acc17);
always @(posedge clk)
begin
y<={acc16[1],acc16[1],acc16[1],acc16[1],acc16[1],acc16}+{acc17[1],acc17[1],acc17[1],acc17[1],acc17[1],acc17}
+{acc15[1],acc15[1],acc15[1],acc15[1],acc15[1],acc15}+{acc14[1],acc14[1],acc14[1],acc14[1],acc14[1],acc14}
+{acc13[1],acc13[1],acc13[1],acc13[1],acc13[1],acc13}+{acc12[1],acc12[1],acc12[1],acc12[1],acc12[1],acc12}
+{acc11[1],acc11[1],acc11[1],acc11[1],acc11[1],acc11}+{acc10[1],acc10[1],acc10[1],acc10[1],acc10[1],acc10}
+{acc9[1],acc9[1],acc9[1],acc9[1],acc9[1],acc9}+{acc8[1],acc8[1],acc8[1],acc8[1],acc8[1],acc8}
+{acc7[1],acc7[1],acc7[1],acc7[1],acc7[1],acc7}+{acc6[1],acc6[1],acc6[1],acc6[1],acc6[1],acc6}
+{acc5[1],acc5[1],acc5[1],acc5[1],acc5[1],acc5}+{acc4[1],acc4[1],acc4[1],acc4[1],acc4[1],acc4}
+{acc3[1],acc3[1],acc3[1],acc3[1],acc3[1],acc3}+{acc2[1],acc2[1],acc2[1],acc2[1],acc2[1],acc2}
+{acc1[1],acc1[1],acc1[1],acc1[1],acc1[1],acc1};
end
endmodule
1.分析程序設(shè)計(jì)
使用MAC單元完成乘加運(yùn)算(包括單MAC和多MAC的情況)這個(gè)方法可以利用FPGA中已有的MAC單元(像Xilinx Spartan 3E-100中有四個(gè)乘加單元),只要設(shè)計(jì)好數(shù)據(jù)運(yùn)算流程,就能方便高效地實(shí)現(xiàn)FIR運(yùn)算。使用MAC單元還有一個(gè)優(yōu)點(diǎn)是系數(shù)可以存成系數(shù)表,可以方便地修改,這是移位方法代替乘法運(yùn)算所不及的。
使用移位代替乘法運(yùn)算這個(gè)方法的優(yōu)點(diǎn)是速度快,例如11階的濾波器,完成一次運(yùn)算需要11次乘法,如果使用單MAC的話,需要11個(gè)時(shí)鐘周期來完成,而使用移位方法可以在一個(gè)時(shí)鐘周期完成11個(gè)乘法運(yùn)算;缺點(diǎn)是需要另外去完成濾波系數(shù)到移位位數(shù)的換算,如果修改濾波系數(shù)的話,程序修改將會(huì)比較麻煩,同時(shí)硬件資源也要使用多一些。
t*0.125={t[7],t[7],t[7],t[7:3]} t*0.125?=?t/8?=?t>>3; t為有符號(hào)數(shù),所以是帶符號(hào)右移,于是t>>3?={t[7],t[7],t[7],t[7:3]} 之所以這么些就是為了節(jié)省資源,提高頻率
以?-4*0.5?為例? -4的原碼:1000?0100B??補(bǔ)碼:1111?1100B -4>>1=0111?1110 而符號(hào)位不能變?應(yīng)用原來的位代替?1111?1110B?的原碼?1000?0010B?=-2
2.?對(duì)程序設(shè)計(jì)中的問題分析與總結(jié)
在最開始的設(shè)計(jì)中,本文初始計(jì)劃使用乘法單元。但是在程序設(shè)計(jì)的過程中我們遇見了實(shí)數(shù)乘法的問題,程序的運(yùn)行遇到了困難,在與指導(dǎo)老師的研究中我們發(fā)現(xiàn)問題出在實(shí)數(shù)乘法的問題上。在Verilog的運(yùn)算中實(shí)數(shù)乘法需要特殊的小數(shù)乘法器來單元來實(shí)現(xiàn)。在原來的38階濾波器的設(shè)計(jì)中出現(xiàn)了這樣子的問題。我們使用過這樣的程序:
reg [63:0] filter_in_force [0:3344];
reg [63:0] filter_out_expected [0:3344];
// Function definitions
function real abs_real;
input real arg;
begin
abs_real = arg > 0 ? arg : -arg;
end
endfunction //function abs_real
// Component Instances
filter u_filter
(
.clk(clk),
.clk_enable(clk_enable),
.reset(reset),
.filter_in(filter_in),
.filter_out(filter_out)
);
initial
begin
// Constants
filter_in_force [0] <= $realtobits(1.0000000000000000E+000);
filter_in_force [1] <= $realtobits(0.0000000000000000E+000);
filter_in_force [2] <= $realtobits(0.0000000000000000E+000);
filter_in_force [3] <= $realtobits(0.0000000000000000E+000);
…
系統(tǒng)無法實(shí)現(xiàn)real值得計(jì)算,于是這里需要我們用小數(shù)乘法器進(jìn)行特殊單元的方案解決。于是我們要進(jìn)行小數(shù)乘法器的設(shè)計(jì)。
3.小數(shù)乘法器介紹及在設(shè)計(jì)中的作用
隨著FPGA 的發(fā)展以及相應(yīng)EDA 軟件工具的成熟,F(xiàn)PGA 在高速數(shù)字信號(hào)處理領(lǐng)域得到了越來越廣泛的應(yīng)用。而乘法,尤其是浮點(diǎn)乘法運(yùn)算是數(shù)值計(jì)算和數(shù)據(jù)分析中最常用的運(yùn)算之一。目前,多數(shù)FPGA 上可以實(shí)現(xiàn)整數(shù)和標(biāo)準(zhǔn)邏輯矢量的乘法,但不支持浮點(diǎn)乘法運(yùn)算, 因此使得FPGA 在數(shù)值計(jì)算、數(shù)據(jù)分析和信號(hào)處理等方面受到了限制。本文采用適合于FPGA 實(shí)現(xiàn)的自定義26 位浮點(diǎn)數(shù)據(jù)格式,利用改進(jìn)的基4Boot h 編碼運(yùn)算方式,以及CSA和4 - 2 壓縮器綜合的Wallace 樹形結(jié)構(gòu),減少了部分積,使系統(tǒng)具有高速度,低功耗的特點(diǎn),并且結(jié)構(gòu)規(guī)則。在尾數(shù)的舍入中采用了基于預(yù)測(cè)和選擇的舍入方法,進(jìn)一步提高了運(yùn)算的速度,優(yōu)化了乘法器的性能。
4.小數(shù)乘法器程序設(shè)計(jì)與仿真
modulefix_mult ( clk,rst_n,in_a,in_b,x1,x2,x3,x4,x5,x6,x7,y_out );
inputclk,rst_n;//時(shí)鐘和復(fù)位信號(hào)
input[31:0] in_a,in_b;//輸入的被乘數(shù)和乘數(shù)
output[31:0] y_out;//輸出的乘積
/*寄存器類型變量 為了能更清楚的了解全處理過程,
特地設(shè)計(jì)為輸出的,不然仿真可能會(huì)被綜合掉*/
output[15:0] x1,x2,x3,x4;
output[0:0] x5;
output[29:0] x6;
output[31:0] x7;
/////////////////////////////////////////////////////
reg[31:0] y_out;
reg[15:0] x1,x2,x3,x4;
reg[0:0] x5;
reg[29:0] x6;
reg[31:0] x7;
always@ (posedgeclk )
begin
if(!rst_n )//復(fù)位時(shí),全部寄存器變量清零
begin
x1<=16'b0;
x2<=16'b0;
x3<=16'b0;
x4<=16'b0;
x5<=1'b0;
x6<=30'b0;
x7<=32'b0;
y_out<=32'b0;
end
else/
begin
x1<=in_a[31:16];//截取16位被乘數(shù),
x2<=in_b[31:16];//截取16位乘數(shù)
x3<=(x1[15]==0)?x1:{x1[15],~x1[14:0]+1'b1}; //據(jù)最高位判斷是否為負(fù)數(shù),
//若負(fù)數(shù)則把補(bǔ)碼轉(zhuǎn)成原碼
x4<=(x2[15]==0)?x2:{x2[15],~x2[14:0]+1'b1};
x5<=x3[15]^x4[15];//兩數(shù)符號(hào)位相異或,得到乘積的符號(hào)位
x6<=x3[14:0]*x4[14:0];//兩數(shù)的數(shù)據(jù)位相乘
x7<={x5,x6,1'b0}; //乘積由1位符號(hào)位和30位數(shù)據(jù)位及1位無關(guān)組成;
//因?yàn)槭切?shù),往低位生長,所以無關(guān)位放置最低位
y_out<=(x7[31]==0)?x7:{x7[31],~x7[30:0]+1'b1};
end
end
endmodule
小數(shù)乘法器的仿真結(jié)果如下圖2-14所示:
圖2-14小數(shù)乘法器仿真結(jié)果
全過程可以看成:把32位的小數(shù)截取高16位左移16位,變?yōu)?6位整數(shù)相乘得到32位整數(shù)乘積后,右移32位調(diào)整無關(guān)位的位置得到32位小數(shù),這樣就可以完成早期程序中的小數(shù)乘法功能,然后來進(jìn)行設(shè)計(jì)中的FPGA數(shù)字濾波器設(shè)計(jì)的優(yōu)化。
在先前的設(shè)計(jì)中我們使用Matlab進(jìn)行綜合仿真設(shè)計(jì),并且借助FDAtool設(shè)計(jì)出濾波器。在Quartus II 的仿真中我們發(fā)現(xiàn)程序無法正常的完成運(yùn)行,究其原因在于小數(shù)乘法器的問題。在原來的濾波器中需要對(duì)每一個(gè)參數(shù)進(jìn)行單獨(dú)設(shè)置,這樣會(huì)使得程序占有巨量的篇幅大大的增加了工作量和容錯(cuò)度。于是,我們需求另外一種方法來解決這個(gè)問題,后來我們研究了移位算法。利用移位來把小數(shù)運(yùn)算轉(zhuǎn)換成整數(shù)運(yùn)算,這樣我們的11階濾波器程序大大減少篇幅同時(shí)也增加了程序的可讀程度和穩(wěn)定程度。
3?濾波器仿真濾波
3.1設(shè)置混合信號(hào)
在Matlab中進(jìn)行我們?cè)O(shè)計(jì)過的FIR數(shù)字濾波器的仿真,首先我們啟動(dòng)Matlab中的Simulink,啟動(dòng)方式是直接在文本窗口中輸入命令Simulink,或者點(diǎn)擊Matlab中的快速啟動(dòng)按鈕。
圖2-15 Simulink工具窗口圖
本論文模擬一個(gè)混合信號(hào)正弦波信號(hào)他包涵了10,30,60(Hz)的信號(hào),在Matlab模擬出來是這樣一個(gè)信號(hào):
Fs=200;
t=(1:200)/Fs;
x1=sin(2*pi*t*10);
x2=sin(2*pi*t*30);
x3=sin(2*pi*t*60);
X= x1+ x2+ x3;
plot(t,X);
title('混合正弦波信號(hào)X(t)-濾波前');
grid;
Module end
//整個(gè)模擬濾波信號(hào)結(jié)束
//使用軟件仿真出待濾波信號(hào)
混合信號(hào)設(shè)定之后利用Matlab工具進(jìn)行模型仿真。
圖2-16 Matlab中模擬的混合信號(hào)
?然后在程序中設(shè)置好仿真模型如下圖(2-17)
圖2-17 Simulink模型仿真
3.2設(shè)置仿真參數(shù)
設(shè)置好仿真參數(shù),對(duì)各個(gè)信號(hào)進(jìn)行單獨(dú)修改和設(shè)置如下圖(2-18):
圖2-18 sin(2*pi*30*t)參數(shù)模塊
在主設(shè)置中,振幅(Amplitude)設(shè)置為1,
頻率(Frequency)設(shè)置為30Hz,
輸出混合為實(shí)常量,樣本時(shí)間為1/1000,
采樣幀數(shù)設(shè)置為1幀,以下不同頻率信號(hào)同理設(shè)置:
圖2-19 sin(2*pi*10*t)參數(shù)模塊
圖2-20 混合參數(shù)模塊
圖2-21 仿真設(shè)計(jì)模塊
最后來設(shè)置仿真參數(shù):在Matlab模型窗口打開菜單[Simulation:Configuration Parameters];找到【SimulationConfiguration Parameters】對(duì)話框,設(shè)置仿真參數(shù)如下Configuration Parameters設(shè)置完成之后運(yùn)行:可以直接點(diǎn)擊模塊窗口中的,開始進(jìn)行仿真。輸出結(jié)果如圖2-22所示:
圖2-22 濾波前信號(hào)波形圖
圖2-23濾波后信號(hào)波形圖
3.3 仿真總結(jié)
由上面的仿真結(jié)果輸出圖可以看出,所設(shè)計(jì)的數(shù)字帶通濾波器使混合輸入信號(hào)中頻率為30Hz的正弦波信號(hào)通過,明顯的出現(xiàn)了帶中信號(hào)。而將頻率為10Hz和60Hz的正弦波信號(hào)大大衰減,從而達(dá)到濾波效果。用Matlab Simulink仿真數(shù)字濾波器設(shè)計(jì)更加直觀,操作便捷,易于分析。
4 總結(jié)與展望
4.1 設(shè)計(jì)成果總結(jié)
在理論積累和重復(fù)實(shí)踐的基礎(chǔ)上,多種濾波器設(shè)計(jì)思路已經(jīng)相當(dāng)成熟,設(shè)計(jì)出來的濾波器通過仿真概率高,仿真結(jié)果符合設(shè)計(jì)要求。FIR數(shù)字濾波器的設(shè)計(jì)方式選擇更具有科學(xué)性和時(shí)效性,可以根據(jù)自己熟悉的軟件,需要的FIR數(shù)字濾波器的精度,F(xiàn)IR數(shù)字濾波器的類型和濾波器階數(shù)來靈活選擇設(shè)計(jì)思路和方法。
4.2 設(shè)計(jì)心得
本次畢業(yè)設(shè)計(jì)主要包含了信號(hào)與系統(tǒng),數(shù)字信號(hào)處理和FPGA方面的相關(guān)知識(shí)。設(shè)計(jì)心得總結(jié)如下:
設(shè)計(jì)路徑優(yōu)化?確定好所需要設(shè)計(jì)的FIR數(shù)字濾波器濾波器后,首先對(duì)其進(jìn)行性能需求分析,明確FIR數(shù)字濾波器系統(tǒng)應(yīng)該達(dá)到的各種性能指標(biāo),其次,擬定多種濾波器類型,對(duì)這些方案采用Matlab進(jìn)行仿真,在這個(gè)過程中我們有許多的窗函數(shù)選擇和設(shè)計(jì)方法選擇,進(jìn)行綜合分析和比較,選擇出最佳的濾波器類型作為本設(shè)計(jì)方案,然后依據(jù)其性能指標(biāo)編寫Matlab程序,確定二階節(jié)系數(shù),或者直接進(jìn)行 Verilog HDL語言的編寫。
系統(tǒng)整體思維細(xì)節(jié)決定整體,整體展現(xiàn)細(xì)節(jié)。我們的設(shè)計(jì)必須有系統(tǒng)的設(shè)計(jì)思維,把每一個(gè)細(xì)節(jié)都融入到整個(gè)系統(tǒng)中考慮,去發(fā)現(xiàn)整個(gè)FIR數(shù)字濾波器系統(tǒng)的主觀性、完整性、穩(wěn)定性和仿真功能的實(shí)現(xiàn),才能讓各個(gè)細(xì)節(jié)完美縫合,才能快速的完成性能優(yōu)越的硬件設(shè)計(jì)。
多做設(shè)計(jì)嘗試和總結(jié),在FIR數(shù)字濾波器的設(shè)計(jì)中遇到過很多困難甚至是障礙。但是必須堅(jiān)持自己的設(shè)計(jì)思路,去尋找其他的解決方法比如本論文中所提到的小數(shù)乘法器。這個(gè)本來是設(shè)計(jì)過程無法逾越的障礙,最后在不懈努力下,一樣做出的小數(shù)乘法器。并且我們要善于積累和總結(jié)讓障礙成為我們的另一種知識(shí)沉淀,這樣我們才能融會(huì)貫通,才能更善于發(fā)現(xiàn)問題和解決問題。無論在什么時(shí)候,科學(xué)的道路上永遠(yuǎn)都是未知。我們應(yīng)該一直堅(jiān)持自己的原則,不拋棄,不放棄,這樣才能在這條充滿荊棘的路上走的更遠(yuǎn)!