Vivado2018.2聯合Matlab的FIR濾波器設計與仿真

Introduction

目錄

Introduction

新建工程(Create a New Porject)

輸入正弦波疊加IP覈實現

FIR低通濾波器設計

引出

matlab進行濾波器參數設計

窗函數法設計FIR濾波器

FIR濾波器係數量化

FIR濾波器係數導出

將.coe文件導入FIR IP核

Block Design連線&生成頂層模塊

聯合Modelsim波形仿真


之前用過ISE和Quartus II一段時間,給我感覺二者界面並不是特別的友好,而且最近版(2018.2 Update)的ISE14.7最高支持Virtex-6系列,如圖1:

圖1  ISE14.7支持的芯片型號

Virtex-7系列Xilinx公司推薦使用Vivado,因爲Xilinx公司的高端系列芯片基本都是基於Vivado開發的;另外一點,基於老師那邊的項目用到了Virtex-7系列下的XCKU115, 因此這次就使用Vivado2018.2進行項目學習與開發,而且最近(2018.10)更新的Vivado2018.2安裝之後發現它的界面風格是我比較喜歡的,如圖2和3:

圖2  Vivado2018.2界面1
圖3  Vivado2018.2界面2

不得不說,IP核是一個很神奇的東西,通過它可大大減少我們的開發時間,而且Vivado中有很多IP核可以直接使用,例如數學運算(乘法器、除法器、浮點運算器等)、信號處理(FFT、DFT、DDS等),IP核類似編程中的函數庫(例如C語言中的printf()函數),可以直接調用,非常方便。

本次也是基於FIR的IP核進行低通濾波器設計,濾波器參數由matlab的工具箱FDATool設計給出,輸入波形爲4MHz和5MHz的正弦波疊加,疊加過程由乘法器IP覈實現,正弦波由DDS IP覈實現,系統整體過程見下:

新建工程(Create a New Porject)

打開Vivado2018.2,點擊Create Project選項,如圖4:

圖4  新建工程界面1

點擊Next,如圖5:

圖5  新建工程界面2

命名工程(Project name)以及工程存儲路徑(Project Location),注意路徑不要含空格和中文,空格用下劃線替代,這裏我取名爲FIR_blog,勾選上Create project subdirctory(創建工程子目錄),點擊Next

圖6  工程命名和路徑

選擇工程類型(Project Type),如圖6,一般對於普通的項目我們選擇RTL Project(在設計PCB會用到I/Oplanning這種類型,用在原理圖和封裝兼容性設計),同時不勾選Do not specify sources at this time,後續再添加源文件就行,點擊Next

圖7  選擇工程類型

添加源文件(Add Sources)和物理&時間約束引腳文件(Constraints),如圖7和8,現在先不添加,直接點擊Next就Ok

圖8  添加源文件界面
圖9  添加約束文件

選擇芯片型號,因爲老師的項目用到了Xilinx公司的V7系列XCKU115,我們選擇該芯片型號,直接搜索就可以,

芯片封裝型號:flvf1924   速度等級:3  ,點擊Next

圖10  選擇芯片型號

最後生成Project Summary,這裏可以查看上一步選擇的芯片型號以及添加的源文件,由於我們沒有添加源文件,因此顯示No Source files...,點擊Finish創建New Project成功。

圖10  Porject Summary界面

 

輸入正弦波疊加IP覈實現

首先利用Vivado的DDS IP核生成兩個正弦信號(頻率分別爲4MHz和5MHz)

  • 點擊創建Block Design,命名Design name,這裏命名爲dds_fir,如圖12:
圖11  創建模塊界面1
圖12  創建模塊界面2
  • 點擊Add IP,如圖13,直接搜索dds,雙擊DDS Compiler生成一個dds IP核,如圖14所示
圖13  添加IP核
圖14  DDS IP核
  • 選中DDS IP核雙擊,打開設置界面,對相關參數進行設置(Re-customize IP),如圖15
圖15  DDS IP核參數設置

Configuration界面設置如下圖16:

圖16  Configuration界面

Implementation設置如圖17:

圖17  Implementation界面

Detailed Implementation界面如圖18所示:

圖18  Detailed Implementation界面

Output Frequencies設置,如圖19,這裏我們僅用到一個通道,輸出信號頻率設置爲4MHz,其他默認爲0就行。

圖19  Output Frequencies設置

按上述步驟設置完後的Summary如圖20,點擊OK

圖20  Summary界面
  • 選中DDS IP核點擊鼠標右鍵copy,或者再次點擊界面中的加號“+”添加一個新的DDS IP核,如圖21,我們使用Ctrl+V複製粘貼原來的DDS IP核,將輸出頻率Output Frequencies設置中的通道1頻率改爲5MHz,點擊OK
圖21  再次添加一個DDS IP核
  • 調用乘法器IP核將兩路正弦信號進行混頻,如圖22

按上述方法添加一個乘法器IP核,搜索multiplier,雙擊Multiplier添加進去。

圖22  添加乘法器IP
圖23  乘法器IP

雙擊乘法器IP,進入Re-customize IP界面對IP核進行參數設置,輸入位寬(A和B)選擇8,其他參數默認即可。

圖24  乘法器Ip核基本參數設置

 

FIR低通濾波器設計

引出

兩路正弦信號(4MHz和5MHz)經混頻後積化和差得到1MHz和MHz的混合信號,我們再設計一個FIR低通濾波器將高頻的9MHz信號濾除掉,按上述添加IP核操作添加一個FIR IP核(搜索fir即可),如圖25:

圖25  添加FIR IP核

添加完FIR IP核後,那麼我們如何對FIR低通濾波器的參數進行設計呢??

matlab進行濾波器參數設計

窗函數法設計FIR濾波器

窗函數法設計濾波器的基本思想是:選擇一種合適的理想頻率選擇性濾波器,然後將它的衝激響應截短以獲得一個具有線性相位和因果的FIR濾波器,因此這種方法的關鍵是選區某種較好的窗函數,在濾波器性能給定的情況下,儘量選擇主瓣窄,旁瓣峯值小的窗函數。

這裏我們利用matlab的工具箱FDATool(當然也可以利用其他工具進行Filter設計,比如Filter Solutions等軟件),打開matlab,在Command窗口輸入fdatool打開濾波器設計界面,如圖26所示:

圖26  fdatool界面

在彈出的窗口中,在Response Type(濾波器響應類型)一欄中選擇Lowpass(低通),Desgned Method(實現方法)選擇Window(窗函數實現),即基於窗函數法設計FIR濾波器,我們在Options中選擇Hamming窗,Filter Order中選擇Special Order,濾波器階數選擇128(階數越高,濾波效果越好,佔用的芯片資源會更多些),Frequency  Specializations中單位Units選擇MHz,採樣頻率Fs選擇100MHz(根據奈奎斯特低通信號採樣定理,採樣頻率至少高於信號的2倍,實際工程上一般得高於低通信號頻率的5-10倍,如果信號頻率過高的話,實際的AD採樣頻率核精度無法達到,所以工程上一般把低通信號經調製後搬到頻率很高的載波上,再下變頻到中頻上用帶通採樣定理進行AD採樣),之前提到採樣頻率高於信號頻率的5-10倍就可以,因爲我們這裏FIR濾波器時鐘是和板卡時鐘連接在一起的,沒有編寫時鐘分頻模塊,所以這裏採樣頻率直接設置爲100MHz(一個週期點數爲100MHz/2MHz=50,板卡資源會浪費一些,但是不影響),截止頻率Fc設爲2MHz(1MHz的正弦波通過,9MHz的被濾除),點擊View和Design Filter按鈕,設計的濾波器時域和頻域波形(Time Domain and Frequency domain)以及幅相響應(Magnitude and Phase Response)如圖27所示:

圖27  濾波器時域、頻域波形和幅相響應

FIR濾波器係數量化

點擊如下圖所示的Set quantization parameters按鈕後,界面變爲圖29所示,選擇Fixed Point(定點)

因爲FPGA只能進行定點操作,而matlab可以進行浮點計算也可定點計算

圖28  設置FIR量化參數
圖29  固定點量化

按如圖30所示進行設置,分子字長(Numerator word length)量化爲16,這裏涉及到FIR濾波器的知識,濾波器可以看出一個有輸入有輸出的黑盒子,其系統函數可表示爲:

                                                                                          H(z)=\sum_{n=0}^{N-1} h(n)z^{-n}

實際中常用的基本是在有用頻率內(本設計中即0-2MHz爲有用頻率,我們希望得到1MHz的正弦波)具有線性相位的FIR濾波器,因爲如果不是線性相位,濾波器對有用信號的不同頻率響應產生的相移不一致,便會造成輸出信號失真的現象。

圖30    濾波器量化參數說明

FIR濾波器係數導出

點擊Filter Design菜單欄的Targets選項下拉菜單的Generate C Header和XILINX Coefficient(.COE) File,分別導出的是C的頭文件和.coe文件(濾波器係數文件),C的頭文件源碼如圖31所示,.coe文件如圖32所示(因爲濾波器階數爲128,所以係數個數爲:階數+1=129,這裏參見濾波器知識,N階濾波器係數爲a0,a1,...,an,有N+1個係數)。

圖31  C header源碼
圖32  .coe文件(1)
圖32  .coe文件(2)

將.coe文件導入FIR IP核

Vivado中的FIR IP核支持.coe文件導入,C文件暫時無法導入,雙擊FIR IP核,打開Re-customize IP界面,如圖33所示,左邊是濾波器的頻率響應。

圖33   Re-customize IP界面
  • Filter Options選項卡

Filter Coefficient中Select Source選中COE File,點擊Browse按鈕,添加.coe文件路徑後Vivado自動將濾波器係數導入IP核中,Filter Specialization中Filter Type選擇單速率型(Single Rate),抽取型(Decimation)和插值型(Interpolation)常用於特殊場合,抽取型一般多用於數字前端下變頻抽取樣值降低AD採樣速率,插值型用於常用於提高採樣速率,,這裏我們選擇Single Rate即可,如圖34:

圖34  Filter Options選項卡
  • Channel Specialization選項卡

由於只使用一個通道,因此交織通道序列(Channel Sequence)選擇Basic,通道數(Number of Channels)爲1;板卡硬件過採樣初始化(Hardware Oversampling Specialization中,輸入該濾波器數據的採樣速率(Input Sampling Frequency)爲100MHz,IP核的工作時鐘頻率(Clock Frequency)爲100MHz(即板卡時鐘)

圖35  Channel Specialization選項卡
  • Implementation選項卡

導入係數後Vivado會根據導入的係數自動識別是何種類型的濾波器,根據濾波器的特點對FIR濾波器結構做性能優化,比如導入的是HalfBand Filter,Coefficient Structure中會出現Half Band一欄,在Coefficient Structure選項卡中會出現軟件識別出的濾波器類型,這裏軟件識別爲Inferred,我們也可設置爲其他類型,如圖36(1)所示

爲使輸出數據位寬位32,Output Rounding Modes(輸出舍入模式)選擇Truncate LSBs(截斷最低有效位),這裏我們保留了高32位,捨棄了低四位,若選擇Full Precision(全精度輸出),則輸出數據位寬位36位,如圖36(2)所示

圖36(1)   Implementation選項卡
圖36(2)   Implementation選項卡
  • Detailed Implementation和Interface選項卡

Detailed Implementation和Interface選項按默認設置就可以,如圖37(1)和(2)所示

圖37(1)Detailed Implementation選項卡
圖37(2)  Interface選項卡
  • Summary選項卡

在Summary欄中對之前設置的濾波器參數進行總覽,如圖38,這裏我們可以看到,輸出位寬位32位,而非全精度輸出Full Precision(36位),因爲之前我們對它進行了截斷(Truncate LSBs),把最低有效位LSB截斷,保留了高32位。

圖38  Summary選項卡

Block Design連線&生成頂層模塊

  • 按上述步驟對FIR濾波器參數設置完成後,將所有的IP核模塊連接起來

選中aclk時鐘端口,如圖39,點擊鼠標右鍵,選擇Make external命令引出時鐘端口線,再將所有IP核模塊的時鐘線連接起來,如圖40

圖39  引出CLK時鐘端口
圖40  連接時鐘線

將所有的模塊按下圖41所示進行物理連接,並引出輸出端口(Make external),Ctrl+S保存

圖41  連線完成後的Block Design
  • 生成top模塊

如圖42所示,選中左側Sources欄中的bd文件(Block Design File)dds_fir,即圖41所示的模塊化框圖,點擊鼠標右鍵選擇Create HDL Wrapper進入如圖43所示的Create HDL Wrapper界面,選擇Let Vivado manage wrapper and auto-update(讓軟件自動完成Top Module and IP核包裝和更新)

圖42   CreateHDL Wrapper操作界面
圖43  Create HDL Wrapper界面

完成該操作後生成如圖44所示的.v頂層文件(dds_fir_wrapper.v)和IP核接口例化文件(dds_fir.v),雙擊文件打開,如圖45和圖46所示,且IP核接口文件屬性爲只讀(Read-Only),頂層文件可以修改,

圖44  文件包含關係圖
圖45  頂層文件.v
圖46  IP核接口例化文件.v

聯合Modelsim波形仿真

  • 編寫testbench測試文件

我們編寫一個仿真測試文件對上述Block Design進行功能/行爲仿真,如圖47所示,點擊左側Flow Navigator欄中的Add Sources添加源文件,

圖47  添加仿真文件

選擇Add or create simulation sources(添加或者創建仿真源文件),點擊Next

圖48  添加或創建仿真文件

添加源文件(Add Sources),這裏我們創建一個新的file(Create File),如圖49

圖49  新建仿真文件

仿真文件命名:這裏命名爲fir_tb,如圖50所示

圖50  仿真文件命名

添加完成後,我們雙擊fir_tb打開,編寫如下代碼:

圖51  測試文件代碼
  • 設置Modelsim仿真環境

完成上述操作後,我們可以選擇第三方仿真工具Modelsim進行功能仿真,關於Vivado2018.2如何設置與Modelsim10.5的聯合仿真參見我的下一篇博客。

  • Run Simulation

點擊左側的Simulation->Run Simulation,如圖52

圖52  Run Behavioral Simulation
  • Modelsim仿真結果

我們可以在Modelsim中添加想要觀察的信號波形,操作方法見下圖52所示,在左側欄中爲我們使用到的模塊,選中該模塊即可在Object窗口欄下看到該模塊的輸入和輸出以及有效位,鼠標右鍵Add Wave即可添加,注意:由於這裏採用的是Vivado自帶DDS模塊,輸出正弦波,需要將Format更改爲Analog(Automatic),如圖54;同時,點擊Modelsim工具欄中的Run All圖標可以看到如下所示的完整波形。

圖53  Modelsim仿真結果
圖54  更改數據Format

由上圖可知,4MHz和5MHz的正弦混頻信號經過FIR低通濾波器後將9MHz的高頻正弦信號濾除掉了,輸出爲我們需要的1MHz低頻信號。

 

 

參考博客:https://blog.csdn.net/chinkwoyu/article/details/80262273

                  https://blog.csdn.net/weiweiliulu/article/details/40151053

                 https://blog.csdn.net/shichaog/article/details/50677386?tdsourcetag=s_pctim_aiomsg

 

歡迎一起學習交流,我的E-mail:[email protected]

爲方面大家學習交流,現把我的工程文件放至Google雲盤,鏈接如下:

https://drive.google.com/open?id=1k6wJdU0KU36cdTvAdeM6qWVWsu7csPIG

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章