目錄
之前用過ISE和Quartus II一段時間,給我感覺二者界面並不是特別的友好,而且最近版(2018.2 Update)的ISE14.7最高支持Virtex-6系列,如圖1:
Virtex-7系列Xilinx公司推薦使用Vivado,因爲Xilinx公司的高端系列芯片基本都是基於Vivado開發的;另外一點,基於老師那邊的項目用到了Virtex-7系列下的XCKU115, 因此這次就使用Vivado2018.2進行項目學習與開發,而且最近(2018.10)更新的Vivado2018.2安裝之後發現它的界面風格是我比較喜歡的,如圖2和3:
不得不說,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:
點擊Next,如圖5:
命名工程(Project name)以及工程存儲路徑(Project Location),注意路徑不要含空格和中文,空格用下劃線替代,這裏我取名爲FIR_blog,勾選上Create project subdirctory(創建工程子目錄),點擊Next
選擇工程類型(Project Type),如圖6,一般對於普通的項目我們選擇RTL Project(在設計PCB會用到I/Oplanning這種類型,用在原理圖和封裝兼容性設計),同時不勾選Do not specify sources at this time,後續再添加源文件就行,點擊Next
添加源文件(Add Sources)和物理&時間約束引腳文件(Constraints),如圖7和8,現在先不添加,直接點擊Next就Ok
選擇芯片型號,因爲老師的項目用到了Xilinx公司的V7系列XCKU115,我們選擇該芯片型號,直接搜索就可以,
芯片封裝型號:flvf1924 速度等級:3 ,點擊Next
最後生成Project Summary,這裏可以查看上一步選擇的芯片型號以及添加的源文件,由於我們沒有添加源文件,因此顯示No Source files...,點擊Finish創建New Project成功。
輸入正弦波疊加IP覈實現
首先利用Vivado的DDS IP核生成兩個正弦信號(頻率分別爲4MHz和5MHz)
- 點擊創建Block Design,命名Design name,這裏命名爲dds_fir,如圖12:
- 點擊Add IP,如圖13,直接搜索dds,雙擊DDS Compiler生成一個dds IP核,如圖14所示
- 選中DDS IP核雙擊,打開設置界面,對相關參數進行設置(Re-customize IP),如圖15
Configuration界面設置如下圖16:
Implementation設置如圖17:
Detailed Implementation界面如圖18所示:
Output Frequencies設置,如圖19,這裏我們僅用到一個通道,輸出信號頻率設置爲4MHz,其他默認爲0就行。
按上述步驟設置完後的Summary如圖20,點擊OK
- 選中DDS IP核點擊鼠標右鍵copy,或者再次點擊界面中的加號“+”添加一個新的DDS IP核,如圖21,我們使用Ctrl+V複製粘貼原來的DDS IP核,將輸出頻率Output Frequencies設置中的通道1頻率改爲5MHz,點擊OK
- 調用乘法器IP核將兩路正弦信號進行混頻,如圖22
按上述方法添加一個乘法器IP核,搜索multiplier,雙擊Multiplier添加進去。
雙擊乘法器IP,進入Re-customize IP界面對IP核進行參數設置,輸入位寬(A和B)選擇8,其他參數默認即可。
FIR低通濾波器設計
引出
兩路正弦信號(4MHz和5MHz)經混頻後積化和差得到1MHz和MHz的混合信號,我們再設計一個FIR低通濾波器將高頻的9MHz信號濾除掉,按上述添加IP核操作添加一個FIR IP核(搜索fir即可),如圖25:
添加完FIR IP核後,那麼我們如何對FIR低通濾波器的參數進行設計呢??
matlab進行濾波器參數設計
窗函數法設計FIR濾波器
窗函數法設計濾波器的基本思想是:選擇一種合適的理想頻率選擇性濾波器,然後將它的衝激響應截短以獲得一個具有線性相位和因果的FIR濾波器,因此這種方法的關鍵是選區某種較好的窗函數,在濾波器性能給定的情況下,儘量選擇主瓣窄,旁瓣峯值小的窗函數。
這裏我們利用matlab的工具箱FDATool(當然也可以利用其他工具進行Filter設計,比如Filter Solutions等軟件),打開matlab,在Command窗口輸入fdatool打開濾波器設計界面,如圖26所示:
在彈出的窗口中,在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所示:
FIR濾波器係數量化
點擊如下圖所示的Set quantization parameters按鈕後,界面變爲圖29所示,選擇Fixed Point(定點)
因爲FPGA只能進行定點操作,而matlab可以進行浮點計算也可定點計算
按如圖30所示進行設置,分子字長(Numerator word length)量化爲16,這裏涉及到FIR濾波器的知識,濾波器可以看出一個有輸入有輸出的黑盒子,其系統函數可表示爲:
實際中常用的基本是在有用頻率內(本設計中即0-2MHz爲有用頻率,我們希望得到1MHz的正弦波)具有線性相位的FIR濾波器,因爲如果不是線性相位,濾波器對有用信號的不同頻率響應產生的相移不一致,便會造成輸出信號失真的現象。
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個係數)。
將.coe文件導入FIR IP核
Vivado中的FIR IP核支持.coe文件導入,C文件暫時無法導入,雙擊FIR IP核,打開Re-customize IP界面,如圖33所示,左邊是濾波器的頻率響應。
- Filter Options選項卡
Filter Coefficient中Select Source選中COE File,點擊Browse按鈕,添加.coe文件路徑後Vivado自動將濾波器係數導入IP核中,Filter Specialization中Filter Type選擇單速率型(Single Rate),抽取型(Decimation)和插值型(Interpolation)常用於特殊場合,抽取型一般多用於數字前端下變頻抽取樣值降低AD採樣速率,插值型用於常用於提高採樣速率,,這裏我們選擇Single Rate即可,如圖34:
- Channel Specialization選項卡
由於只使用一個通道,因此交織通道序列(Channel Sequence)選擇Basic,通道數(Number of Channels)爲1;板卡硬件過採樣初始化(Hardware Oversampling Specialization中,輸入該濾波器數據的採樣速率(Input Sampling Frequency)爲100MHz,IP核的工作時鐘頻率(Clock Frequency)爲100MHz(即板卡時鐘)
- 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)所示
- Detailed Implementation和Interface選項卡
Detailed Implementation和Interface選項按默認設置就可以,如圖37(1)和(2)所示
- Summary選項卡
在Summary欄中對之前設置的濾波器參數進行總覽,如圖38,這裏我們可以看到,輸出位寬位32位,而非全精度輸出Full Precision(36位),因爲之前我們對它進行了截斷(Truncate LSBs),把最低有效位LSB截斷,保留了高32位。
Block Design連線&生成頂層模塊
- 按上述步驟對FIR濾波器參數設置完成後,將所有的IP核模塊連接起來
選中aclk時鐘端口,如圖39,點擊鼠標右鍵,選擇Make external命令引出時鐘端口線,再將所有IP核模塊的時鐘線連接起來,如圖40
將所有的模塊按下圖41所示進行物理連接,並引出輸出端口(Make external),Ctrl+S保存
- 生成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核包裝和更新)
完成該操作後生成如圖44所示的.v頂層文件(dds_fir_wrapper.v)和IP核接口例化文件(dds_fir.v),雙擊文件打開,如圖45和圖46所示,且IP核接口文件屬性爲只讀(Read-Only),頂層文件可以修改,
聯合Modelsim波形仿真
- 編寫testbench測試文件
我們編寫一個仿真測試文件對上述Block Design進行功能/行爲仿真,如圖47所示,點擊左側Flow Navigator欄中的Add Sources添加源文件,
選擇Add or create simulation sources(添加或者創建仿真源文件),點擊Next
添加源文件(Add Sources),這裏我們創建一個新的file(Create File),如圖49
仿真文件命名:這裏命名爲fir_tb,如圖50所示
添加完成後,我們雙擊fir_tb打開,編寫如下代碼:
- 設置Modelsim仿真環境
完成上述操作後,我們可以選擇第三方仿真工具Modelsim進行功能仿真,關於Vivado2018.2如何設置與Modelsim10.5的聯合仿真參見我的下一篇博客。
- Run Simulation
點擊左側的Simulation->Run Simulation,如圖52
- Modelsim仿真結果
我們可以在Modelsim中添加想要觀察的信號波形,操作方法見下圖52所示,在左側欄中爲我們使用到的模塊,選中該模塊即可在Object窗口欄下看到該模塊的輸入和輸出以及有效位,鼠標右鍵Add Wave即可添加,注意:由於這裏採用的是Vivado自帶DDS模塊,輸出正弦波,需要將Format更改爲Analog(Automatic),如圖54;同時,點擊Modelsim工具欄中的Run All圖標可以看到如下所示的完整波形。
由上圖可知,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