第一部分 設計概述 /Design Introduction
1.1 設計目的
本次設計包括基于FPGA的任意波形發生器設計實現和基于FPGA的低通濾波器設計實現。
波形發生器是一種常見的信號源,能夠產生多種標準信號和用戶定義信號,并保證較高精度和較高穩定性,廣泛地應用于電子電路、自動控制系統和數字實驗等,諸如電話、電視、收音機、高校通信系統實驗等領域都需要用到波形發生器。本次設計基于Verilog HDL語言使用Artix-7系列芯片在EGO1開發板上實現一個簡易的任意波形發生器。該波形發生器能夠產生正弦波、方波、三角波與鋸齒波四種波形,可輸出頻率有:1MHz、100KHz、10KHz、1KHz、100Hz、10Hz、1Hz。波形類型選擇控制字與頻率設置控制字通過串口輸入。
低通濾波可以簡單的認為:設定一個頻率點,當信號頻率高于這個頻率時不能通過,在數字信號中,這個頻率點也就是截止頻率,當頻域高于這個截止頻率時,則全部賦值為0。因為在這一處理過程中,讓低頻信號全部通過,所以稱為低通濾波。低通過濾的概念存在于各種不同的領域,諸如電子電路,數據平滑,聲學阻擋,圖像模糊等領域經常會用到。在數字圖像處理領域,從頻域看,低通濾波可以對圖像進行平滑去噪處理。
本次設計將用兩種方式實現低通濾波器。
方法一:利用Vivado自身具備的DDS和FIR的IP核實現;
方法二:通過Verilog編程實現FIR的功能。
1.2 作品展示
圖1 UART串口實現
圖2 波形發生器仿真
圖3 低通濾波器仿真
第二部分 系統組成及功能說明 /System Construction & Function Description
2.1 系統概述
任意波形發生器:計劃產生正弦波、方波、三角波與鋸齒波四種波形,可輸出頻率有:1MHz、100KHz、10KHz、1KHz、100Hz、10Hz、1Hz,利用URAT串口與串口調試助手相連進行控制字數據傳輸。已經完成全部功能,由于沒有示波器,實物調試部分不完整。
低通濾波器:本次設計將用兩種方式實現低通濾波器。
方法一:利用Vivado自身具備的DDS和FIR的IP核實現;
方法二:通過Verilog編程實現FIR的功能。
方法一使用Vivado的DDS IP核生成兩個正弦信號,頻率分別為4MHz和5MHz。同時調用乘法器IP將兩個信號進行混頻處理,乘法器將混頻信號交給FIR IP核進行過濾處理。使用Matlab進行濾波器的參數設計,這里使用窗函數法設計FIR濾波器。窗函數法設計濾波器的基本思想是:選擇一種合適的理想頻率選擇性濾波器,然后將它的沖激響應截短以獲得一個具有線性相位和因果的FIR濾波器,因此這種方法的關鍵是選區某種較好的窗函數,在濾波器性能給定的情況下,盡量選擇主瓣窄,旁瓣峰值小的窗函數。設置好以后將FIR濾波器系數導出,將生成好coe文件導入Vivado中FIR IP核中。撰寫TestBench文件進行波形仿真。
方法二利用DDS 生成一個由三個正弦波疊加的待濾波信號,兩個正弦波的頻率分別是200Hz、800Hz。用MATLAB產生頻率為500Hz的低通濾波器抽頭系數,然后將待濾波信號送入Vivado,用Verilog編寫的FIR濾波器進行仿真,觀察濾波后的波形。
2.2 項目系統框圖
任意波形發生器:
圖4 任意波形發生器系統框圖
圖5 串口模塊設計框圖
圖6 DDS原理框圖
低通濾波器:
圖7 低通濾波器設計框圖
圖8 低通濾波器原理框圖
2.3 技術說明
(1)任意波形發生器
本次設計使用到的是UART串口通信,主要用來接收串口數據發送的數據,字節傳輸形式:1-0-x-x-x-x-x-x-x-x-0-1,檢測到下降沿即-1-0-(起始標志)后開始進行接收字節,將接收到的一一存入寄存器中,8個bit后結束接收,就是簡單的1個字節的接收。其協議發送原理:
圖9 UART數據幀格式
根據URAT串口的數據幀格式,起始位為0,所以我們需要用一個下降沿檢測模塊,來判斷起始位,然后開始準備接收串口數據。
然后使用一個計數器模塊,在1Bit數據傳輸的時間找到最佳時間來輸出讀取串口數據。在串口通信中波特率表示每秒能傳輸的數據位,9600就是每秒能傳輸9600位,1word=2byte、1byte=8bit,這里的9600位指的是9600bit。每個開發板上都有它的系統時鐘,本次設計用的是EGO1開發板,系統時鐘是100MHZ,我們假定波特率是9600bit/s傳輸,那么傳輸1bit就需要100M/9600個時鐘周期。那么在本次設計中傳輸1bit所需的計數值為10416,將采集數據的時刻放在波特率計數器每次循環技術的中間位置,即5208。
利用一個控制器模塊,在下降沿檢驗通過后的信號與計數器模塊輸出的讀數據時間信號控制下,依次將8位數據放入寄存器之中,然后利用case語句,經過停止位數據后停止數據接收。
最后在串口的總模塊中對上述三個模塊進行例化,將對應輸入輸出相連。
下面根據下圖所示的DDS技術原理框圖,當一個參考時鐘過來 傳輸一個頻率控制字進入累加器在累加器中加入上一個參考時鐘的數據,相加后進去寄存器,然后寄存器的輸出便是正弦查表的地址,通過這個數據在波形存儲區查表,再通過D/A轉換器和低通濾波器輸出。結合項目功能要求實際分模塊實現任意波形發生器。
波形類型控制字與頻率設置控制字是分別拿串口助手輸入的有效數據位的[7:6]與[5:2]位,我們注意到,串口傳輸過程是從低字節開始傳輸的,也就是說我們在串口助手中發送的有效數據為11010011,接收到的數據為11001011,所以需要將接收到的數據倒序然后給到兩個控制字的寄存器。
圖10 DDS直接數字頻率合成技術原理
首先我們利用MATLAB新建腳本(。m文件),鍵入相應的程序,產生了存放有位寬為8,位深為256的四種波形數據的COE文件。然后在Vivado中利用IP catalog中的Block Memory Generator核。分別新建四個Block Memory Generator核,設置Basic欄中的Memory Type為Single Port ROM,Port A Options 欄中的位寬為8,位深為256,最后在Other Options中,選擇加載本地文件選中MATLAB已經生成的正弦波、方波、鋸齒波、三角波的COE數據文件,分別將它們放入了不同的Rom中,我們就可以通過Vivado進行編程,在時鐘的驅動下,根據地址去讀取Rom中的數據然后輸出,即可產生波形數據。
我們拿到URAT串口接收的頻率控制字后,利用case語句,根據不同的輸入,輸出不同的頻率控制字,關于頻率控制字的計算,首先系統的時鐘為100MHz,相位累加器為32位,232等于4294967296,想要輸出頻率為1kHz的信號為例,通過以下的計算公式,得到K約等于42950。
然后在相位累加器中以頻率控制字為步長進行周期的加法運算,再將相位累加器的每個值的高位作為地址去讀Rom的數據。這里輸出的為8位的DAC數據,所以用相位累加器的高八位作為Rom的地址輸入。
(2)低通濾波器
低通濾波器實現:
方法一:利用Vivado自身具備的DDS和FIR的IP核實現
在Vivado中新建工程,創建Block Design,用DDS IP核生成兩個正弦波信號,如圖11所示。
圖11 DDS IP核
將DDS的參數設置為圖12所示。
圖12 DDS參數設置
(2)調用乘法器,將兩個正弦波信號進行混頻處理,乘法器設置如下圖13
圖13 乘法器IP核參數設置
(3)調用FIR IP核,對其參數進行設置。利用Matlab對濾波器的參數進行設置。在matlab窗口輸入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),最后生成coe文件,加載到FIR IP核中。具體設置如下圖。
圖14 濾波器參數設置
(4)將各IP核之間進行連線,生成頂層模塊。如圖15。
圖15 各IP核連線圖
方法二:通過Verilog編程實現FIR的功能。具體設計流程如圖16。
圖16 設計流程圖
(1)利用DDS 生成一個由三個正弦波疊加的待濾波信號,兩個正弦波的頻率分別是200Hz、800Hz。
(2)用MATLAB產生頻率為500Hz的低通濾波器抽頭系數,
(3)Vivado進行FIR的verilog設計。FIR的代碼實現流程如下圖7所示。
圖17 FIR verilog設計框圖
第一級流水線的功能是將輸入信號進行延時,每到來一個時鐘信號,便將輸入信號保存到delay_pipelin1中,然后將剩下的依次移動一位。
第二級流水線的功能是將輸入經過延時的信號和濾波器系數相乘,每到來一個時鐘便將一個新的乘積結果更新到multi_data中。
累加積乘的主要功能是將乘積累加,累加的結果就是濾波后的信號。
(4)仿真測試,創建TestBench文件進行仿真測試。
第三部分 完成情況及性能參數 /Final Design & Performance Parameters
任意波形發生器
已實現功能:產生正弦波、方波、三角波與鋸齒波四種波形,可輸出頻率有:1MHz、100KHz、10KHz、1KHz、100Hz、10Hz、1Hz;利用URAT串口與串口調試助手相連進行控制字數據傳輸。由于沒有示波器,實物調試部分不完整。
a.串口模塊仿真分析:在Testbench中依次給串口數據(data_rx)為10 11010011 011。
圖18 URAT串口仿真波形
如上圖所示,FPGA接收到的數據為11001011,根據仿真結果,URAT串口測試成功。
b.任意波形發生模塊仿真分析:
圖19 波形發生模塊仿真1
圖20 波形發生模塊仿真2
如上圖所示,在仿真中分別給波形類型控制字為0、1、2、3,對應頻率設置控制字為5、6、3、2。分別產生了頻率為10kHz的正弦波、100kHz的三角波、100Hz的三角波、10Hz的鋸齒波。其中100kHz的三角波為方波,詢問老師后確定是系統顯示問題,其波形數據圖 所示。根據分析知波形發生器仿真測試成功。
c.系統仿真測試與分析
最后通過頂層模塊,例化DDS模塊與UART模塊,將相應輸入輸出連接起來,編寫仿真激勵文件,給串口助手發送值,驗證波形輸出。
圖21 系統仿真測試1
圖22 系統仿真測試2
圖23 系統仿真測試3
圖24 系統仿真測試4
如上所示,根據仿真波形可知,當仿真輸入1011010011011,FPGA收到11001011,類型控制字11(3),頻率設置控制字0100 (4),輸出周期為 1ms(即頻率為1KHz)的 鋸齒波;
當仿真輸入1000011111011,FPGA收到11111000,類型控制字00(0), 頻率設置控制字0111(7),輸出周期為1000ns頻率 (即頻率為1MHz )的正弦波;
當仿真輸入1001010111011,FPGA收到11101010,類型控制字01(1),頻率設置控制字0101(5),輸出周期為100us( 即頻率為10KHz)的方波 ;
當仿真輸入1010011011011,FPGA收到11011001,類型控制字10(2),頻率設置控制字0110(6),輸出周期為10us(即頻率為100KHz)的三角波。
根據分析可知,系統仿真成功,接下來Run Synthesis→Run Implementation,然后在Windows的下拉選項中點擊I/O Port,根據EGO1硬件手冊上的引腳說明綁定引腳,選擇邏輯電平為LVCMOS33,然后保存即可生成引腳約束文件。最后Generate Bitstream→Open Hardware Manager→Open Target→Auto Connect→選中生成的bit文件→Program即可進行實物測試。
圖25 系統實物調試
圖26 系統實物調試
將BIT文件下入EGO1開發板后,打開串口助手,發送“de”,即二進制的“11011110”,可以觀察到代表FPGA串口接收數據的LED1中的八個燈的數據(亮為“1”,滅為“0”)為11011110;發送“95”,即二進制的“10010101”時,LED1燈群展示數據為10010101。由于沒有示波器,不能看到波形,僅能通過LED2中的LED7—LED2顯示可以看出DDS波形發生器的波形類型控制字與頻率設置控制字數據都是對的。至此,正確實現任意波形發生器功能。
低通濾波器
低通濾波器通過IP核設計得以實現,仿真波形如下圖8所示。
圖27 FIR—IP核實現仿真波形
通過上面仿真波形可以看出4MHz和5MHz的正弦混頻信號經過FIR低通濾波器后將9MHz的高頻正弦信號濾除掉了,輸出為我們需要的1MHz低頻信號。
圖27 FIR-Verilog代碼實現仿真波形
如上圖所示,DDS產生頻率為200Hz與800Hz輸入,DDS_out為疊加信號,低通濾波器輸出波形不符合功能要求,未能定位到具體原因,仿真錯誤、系統功能未正確實現。
更多信息可以來這里獲取==>>電子技術應用-AET<<