?
Hello! 大家好,我是本次《來實戰(zhàn)》項目第六期的執(zhí)行官,小曹同學(xué),本次項目主題是“基于FPGA的ECG信號采集與處理系統(tǒng)設(shè)計”,與眾多STM32或Arduino等單片機直接利用軟件編程調(diào)用庫函數(shù)不同,本項目以底層邏輯為切入點進行數(shù)字電路設(shè)計,更加關(guān)注電路底層的細節(jié),包括基礎(chǔ)模塊的劃分、接口信號的定義、verilog代碼設(shè)計、仿真驗證以及板級調(diào)試,在滿足性能要求下,同時會評估資源消耗問題,希望大家能和我一起一步一步的完成此次工程項目,而不是簡單的copy。其中難免有錯誤,希望各位指正。
引言:
FPGA開發(fā)和數(shù)字IC設(shè)計十分相似,而兩者最基礎(chǔ)是verilog代碼設(shè)計,verilog是硬件描述語言,實現(xiàn)的數(shù)字電路具備硬件并行處理的優(yōu)點,所以verilog設(shè)計思想與基于軟件的編程語言是有很大不同的,復(fù)雜的verilog代碼設(shè)計不是隨隨便便直接在板子上調(diào)試成功的。
本項目側(cè)重對設(shè)計代碼的仿真驗證,而不是簡簡單單對代碼 “搬運工”,達到所謂“快速”入門的假現(xiàn)象。在FPGA開發(fā)中,每一行verilog代碼已經(jīng)決定了電路的性能和功能,仿真是對verilog代碼設(shè)計的有效驗證方法,因為代碼存在的bug在仿真中會一一被定位出來,“速成”FPGA開發(fā)都是假的,不能一行一行代碼看懂和敲出來,verilog學(xué)習(xí)的時長都是無用功,正確設(shè)計方法+動手練習(xí)是FPGA開發(fā)/數(shù)字電路設(shè)計的正確打開方法。以下是我個人設(shè)計的方法:
首先根據(jù)你的硬件條件包括FPGA板型和其他硬件(AD、VGA、LCD、舵機、攝像頭等等),確定一個硬件的詳細設(shè)計方案;
接著根據(jù)需求和參考資料將整體劃分到各個小模塊,并確定各個模塊接口之間的數(shù)據(jù)信號和控制信號;畫時序圖主要是根據(jù)數(shù)據(jù)信號走向需要哪些控制信號,而控制信號主要實現(xiàn)方式就是cnt、enable、flag等等;
其次按照圖紙就可以敲代碼了,而verilog代碼語法不是很難,主要是算術(shù)運算符、賦值運算符、關(guān)系運算符、邏輯運算符、條件運算符、位運算符以及移位拼接等,一般設(shè)計會這些足夠了,而往往多數(shù)初學(xué)者覺FPGA設(shè)計很簡單啊,大概指的這部分語法簡單,但是在敲代碼過程中還要考慮到組合邏輯以及時序邏輯中常用的模塊,{組合邏輯主要包括常用邏輯門(與門、或門、非門、異或等)、比較器、半加器、全加器、乘法器、數(shù)據(jù)選擇器、三態(tài)門,時序邏輯主要包括D觸發(fā)器、兩級D觸發(fā)器、帶異步復(fù)位的D觸發(fā)器、帶異步復(fù)位同步清零的D觸發(fā)器、移位寄存器、單口RAM、偽雙口RAM、真雙口RAM、單口ROM、有限狀態(tài)機等}。而這些基本單元在寫代碼過程做到心中有數(shù),因為這些決定了設(shè)計的PPA(Performance,Power,Area);
最后再通過仿真工具對設(shè)計的代碼進行驗證,首先是功能仿真也就是RTL行為級仿真,主要是檢查代碼中的語法錯誤以及代碼行為的正確性,但是不包括延時信息,驗證之前“模塊劃分與接口定義”階段。其次是后仿真也就是時序仿真,在設(shè)計布局布線后提供一個時序仿真模型,驗證之前“畫接口信號時序”階段。
步驟一:項目框架
目的意義:
在我國,隨著生活節(jié)奏加快,心血管疾病的發(fā)病率有逐年遞增的趨勢;同時由于人們生活水平和健康意識的不斷提高,對心臟類疾病進行實時監(jiān)護的需求也不斷增加。但是,心血管疾病本身具有無癥狀性(病人在發(fā)生心肌缺血時并沒有胸痛、心絞痛等常見癥狀)和間歇性。
選擇這個主題主要原因之一是開發(fā)一種可以幫主人們?nèi)粘I畹姆乔秩胄栽O(shè)備—基于FPGA的ECG信號采集與處理。市場上有許多ECG信號檢測產(chǎn)品可以提高效率(尺寸較小,將數(shù)據(jù)保存在云中等等),但是其中任何一件產(chǎn)品都很少涉及到復(fù)雜信號處理,并沒有與數(shù)據(jù)庫進行比對。
內(nèi)容及結(jié)構(gòu)安排:
本文基于Xilinx公司的Artix-7系列芯片xc7a35tcpg236-1和AD83232采集板搭建一套硬件平臺用以異常ECG信號檢測系統(tǒng)。使用Vivado和ModelSim設(shè)計和仿真各個系統(tǒng)模塊的功能,本系統(tǒng)主要有AD8232信號采集,FPGA存儲和處理,C#GUI顯示及matlab處理。其中FPGA處理是核心部分,由以下模塊構(gòu)成:AD模塊、RAM模塊、UART模塊及濾波模塊。本文采用Verilog HDL硬件描述語言進行編程,XADC具有兩個專用的差分輸入引腳Vp和Vn,可用于采樣模擬信號,通過ADC模塊完成100 MHz到360 Hz的數(shù)據(jù)采樣,同時采用低通濾波器消除共模噪聲;在所有存儲單元中存滿ECG的樣本數(shù)據(jù)后,將生成一個脈沖以觸發(fā)向PC的傳輸。UART模塊將接收一個信號,該信號使用TX模塊進行發(fā)送,當(dāng)接收UART檢測到起始位時,它將開始以稱為波特率的特定頻率讀取輸入位。
本項目主要有以下方面:
1.FPGA學(xué)習(xí)流程。編寫項目詳細設(shè)計方案,主要包括數(shù)據(jù)通路和控制通路的設(shè)計,模塊劃分與接口信號的定義,數(shù)據(jù)通路原理圖以及控制通路時序圖,verilog代碼的具體設(shè)計,以及仿真驗證,下載到FPGA開發(fā)板調(diào)試。在verilog代碼設(shè)計過程會描述時序圖,用到IP核,數(shù)據(jù)通路的寄存器消耗資源進行評估。
2.用到的濾波處理。在信號處理中,數(shù)字濾波器是一種對采樣的離散時間信號執(zhí)行數(shù)學(xué)運算以減少或增強該信號某些方面的系統(tǒng)。數(shù)字濾波器系統(tǒng)通常由一個模數(shù)轉(zhuǎn)換器對輸入信號進行采樣,使用FPGA或ASIC代替通用微處理器或具有特定并行架構(gòu)的專用DSP,以加快諸如過濾之類的操作。
3.基礎(chǔ)能力鍛煉。根據(jù)IP開發(fā)文檔,掌握XADC使用、RAM寫讀、UART數(shù)據(jù)傳輸以及狀態(tài)機verilog代碼設(shè)計。
項目簡介:
包含四大部分:AD采集模塊、RAM存儲模塊、濾波處理模塊、UART模塊。
首先,AD8232放大器輸出是一個介于0至3.3V之間的模擬值,ADC模塊的輸入應(yīng)為1V,因此需要進行分壓。放置在放大器的輸出和FPGA板的輸入(Vp引腳)之間,AD模塊包括PLL和XADC 完成100 MHz到360 Hz的數(shù)據(jù)采樣。
其次,我們利用RAM模塊存儲通過ADC采集的樣本。模塊具有2個命令模式:讀取和寫入。這兩種狀態(tài)由啟用寫模式時為高電平和禁用寫模式時為低電平的信號控制。
接著,盡管XADC也可以完成濾波作用,為了便于學(xué)習(xí)本項目通過Digital filter模塊完成低通濾波過程。
最后,UART模塊將接收脈沖信號后,等到信號指示燈的跳變,讀出一幀數(shù)據(jù),由于ADC只有12位,而UART只有8位,所以我們需要傳輸2組數(shù)據(jù)。
開發(fā)計劃:
圖1:整體計劃表
Step1: 確定整個設(shè)計思路,ECG信號檢測的總體框圖,確定程序流程框圖
Step2: AD模塊、包括XADC和分頻時鐘接口定義,進行具體verilog代碼設(shè)計和仿真驗證
Step3: RAM讀寫模塊、根據(jù)狀態(tài)機進行接口定義,進行具體verilog代碼設(shè)計和仿真驗證
Step4: Digital filter模塊、UART模塊接口定義,進行具體verilog代碼設(shè)計和仿真驗證
Step5: 進行功能擴展,并將以上所有模塊集成在一起,并且做整個仿真驗證以及板級調(diào)試,通過在C#GUI中顯示及保存為.csv文件,利用MATLAB進行相關(guān)算法處理,整理打包完整的開源方案所有資料(設(shè)計源碼、參考資料)
圖2:項目整體流程圖
圖3:項目整體介紹
好啦,第一期就嘮嗑到這里啦,接下來,我將陸續(xù)分享“基于FPGA的ECG信號采集與處理系統(tǒng)設(shè)計”項目的各個步驟的內(nèi)容,如果對這個項目感興趣,想深入了解和溝通,請在右欄浮動模塊中掃碼申請加入“來實戰(zhàn)技術(shù)交流群”(Q群)。
歡迎點擊下方【收藏按鈕】收藏本項目,持續(xù)更新中,敬請關(guān)注...
步驟二:AD采集模塊
心電圖分析
ECG分為兩個基本間隔,即PR Interval和QT Interval,如下所述。
圖2.1 正常心電圖
為了確定心臟病,我們需要了解所有這些波形:
P Wave:心房的去極化,心房去極化從SA結(jié)向AV結(jié),從右心房擴散到左心房。如果p波的持續(xù)時間異常長,則可能代表心房增大。通常,大的右心房會產(chǎn)生高的峰值p波,而大的左心房會產(chǎn)生兩個峰的二裂p波。持續(xù)時間<80ms。
PR interval:PR間隔是從P波的開始到QRS波的開始測量的。 該間隔反映了電脈沖從竇房結(jié)穿過AV結(jié)所花費的時間。短于120 ms的APR間隔表明,電脈沖繞過了AV節(jié)點,如Wolf-Parkinson-White綜合征。PR間隔持續(xù)超過200 ms會診斷為一級房室傳導(dǎo)阻滯。持續(xù)時間:120到200ms。
QRS complex:QRS復(fù)合波代表左右心室的快速去極化。與心房相比,心室的肌肉較大,因此QRS復(fù)合波的振幅通常比P波大得多。如果QRS復(fù)合波較寬(大于120毫秒),則表明心臟傳導(dǎo)系統(tǒng)或心室節(jié)律(如室性心動過速)中斷。持續(xù)時間:80到100 ms;
ST segment:ST段連接QRS波群和T波。它代表心室去極化的時期。可能因心肌梗塞或局部缺血而降低或升高。心包炎也可引起ST升高;
T wave:T波代表心室的復(fù)極化。除aVR和V1引線外,所有引線通常都直立。倒T波可能是心肌缺血的征兆。 T波峰值可能是非常早的心肌梗塞的征兆。持續(xù)時間:160 ms;
U wave:假設(shè)U波是由室間隔的復(fù)極化引起的。它通常具有低振幅,甚至更多時候是完全不存在的。如果U波非常突出,則可能是甲亢。
心電傳感器
電極貼片離心臟越近,則測量越好。根據(jù)Einthoven的三角形識別正確的位置。傳感器可以放置在前臂和腿上?;蛘?,可以將它們放置在靠近手臂的胸部上,并位于右下腹部上方(即,右髖上方),如圖所示。
圖2.2 傳感器放置位置
AD8232放大器
全集成式ECG前段AD8232芯片,如圖3.3所示。該芯片廣泛應(yīng)用于健身及運動心率監(jiān)護儀、便攜式ECG、游戲外圍設(shè)備、生物電信號采集等設(shè)備。其共模抑制比為80Hz(DC至60Hz)。信號增益高(G=100)帶DC阻塞能力。內(nèi)部帶有RFI射頻干擾濾波器、3極點可調(diào)低通濾波器。電源供電2.0V-3.5V。使用該模塊ADC能夠輕松地采集輸出信號。AD8232采用一個無使用約束運算放大器來創(chuàng)建一個三極點低通濾波器,消除了額外的噪聲。使用時可通過限制濾波器的截止頻率來滿足不同類型應(yīng)用的需要。芯片工作時具備導(dǎo)聯(lián)脫落檢測。
圖2.3 ?AD8232放大器
XADC配置
Xilinx的7系列FPGA和Zynq器件創(chuàng)造性地在片上集成了模數(shù)轉(zhuǎn)換器和相關(guān)的片上傳感器(內(nèi)置溫度傳感器和功耗傳感器),XADC內(nèi)部可以直接獲取芯片結(jié)溫和FPGA的若干供電電壓,用于監(jiān)控FPGA內(nèi)部狀況。同時提供了17對差分管腳,其中一對專用的模擬差分輸入,16對復(fù)用的模擬差分輸入,不使用的時候可以作為普通的User I/O。Mux除了連接到專用ADC輸入引腳上(VP_0,VN_0),同時支持外部16路差分模擬電壓輸入,可以有不同的選通,最終復(fù)用一個ADC輸入。此外可以對FPGA內(nèi)部溫度和各檔電壓監(jiān)控,同時也是復(fù)用一個12bitADC轉(zhuǎn)換,其中,參考電壓可以是內(nèi)部1.25V,也可以外接外部穩(wěn)定參考電壓源。轉(zhuǎn)換完后,有一個控制寄存器和狀態(tài)寄存器,通過FPGA的DRP接口與FPGA內(nèi)部邏輯連接,也可以通過JTAG查看溫度或者電壓變化情況。
圖2.4:XADC功能框圖
當(dāng)den_in信號拉高后,輸入的數(shù)據(jù)di_in和輸入的地址daddr_in總線就會被內(nèi)部xadc接收;dwe_in拉高表示要向xadc內(nèi)部指定寄存器寫數(shù)據(jù);dwe_in拉低表示當(dāng)前是讀數(shù)據(jù),就會隔幾個時鐘周期返回drdy_out,這個drdy_out拉高后表示要把xadc內(nèi)部寄存器地址、比如vp/vn轉(zhuǎn)換值存放在03H地址里面,讀取vp/vn寄存器地址數(shù)據(jù)也就是電壓轉(zhuǎn)換的數(shù)字值,就把數(shù)據(jù)總線do_out保存到adc_out寄存器里面。
圖2.5:DRP接口時序圖
ADC_top模塊
該部分主要由pll,xadc_capture,xadc_div模塊組成,xadc_top模塊主要完成對數(shù)據(jù)總線100 MHz到360 Hz的AD采樣。
圖2.6:ADC_top模塊
圖2.7:ADC模塊的詳細設(shè)計
PLL(鎖相環(huán)):是一種電子電路,可以不斷調(diào)節(jié)以匹配輸入信號頻率的相位; PLL用于頻率控制。鎖相環(huán)電路通過將外部信號的相位與晶體振蕩器產(chǎn)生的時鐘信號的相位進行比較來工作。該電路調(diào)整振蕩器時鐘信號的相位,以使其與參考信號的相位匹配。PLL電路可以設(shè)置為倍頻器或分頻器,跟蹤發(fā)生器,時鐘恢復(fù)電路或解調(diào)器。
在該電路中,該PLL用于將輸入頻率(100 MHz)劃分為14 MHz ,這是XADC輸入的頻率。使用了Clocking Wizard IP核,并且該模塊已連接到:
clk_in1:?輸入頻率(100 MHz); clk_in2:?動態(tài)重配置端口的時鐘輸入(XADC輸入);
圖2.8:PLL模塊
XADC:XADC具有兩個專用的差分輸入引腳Vp和Vn,可用于采樣模擬信號。 您還可以使用16個輔助輸入。但是,這些輔助輸入的FRBW(全分辨率帶寬)較低,為250kHz,而專用輸入的FRBW為500kHz。 因此,如果我們要處理XADC的最大奈奎斯特頻率附近的信號,則需要使用其專用輸入。XADC可以以高達1Msamples /秒的速度對通道進行采樣。由于XADC具有12位分辨率,因此我們需要電容器兩端的電壓穩(wěn)定在12位值的?LSB之內(nèi)。
圖2.9:XADC配置界面
在我們使用的開發(fā)板中,電極的輸出將連接到引腳vaux6,來自AD8232的模擬電壓會被轉(zhuǎn)換為數(shù)字信號,我們XADC配置的36KSPS的采樣頻率,這是因為數(shù)據(jù)庫的采樣頻率是360Hz,便于后續(xù)進行分頻操作,從PLL獲得的所需輸入DCLK頻率(MHz)為14 MHz。
由于數(shù)據(jù)總線do_out是16bit,為了便于后續(xù)發(fā)送,在這里截取了高12位。??
drdy_out:動態(tài)配置接口的數(shù)據(jù)準備好信號。xadc_div模塊:因為ADC的輸出頻率為36KHz,所以我們需要將分頻處理能達到360 Hz。
圖2.10 xadc_div模塊
通過JTAG查看輸入模擬電壓值
好啦,第二期就嘮嗑到這里啦,接下來,我將陸續(xù)分享“基于FPGA的ECG信號采集與處理系統(tǒng)設(shè)計”項目的各個步驟的內(nèi)容,如果對這個項目感興趣,想深入了解和溝通,請在右欄浮動模塊中掃碼申請加入“來實戰(zhàn)技術(shù)交流群”(Q群)。
歡迎點擊下方【收藏按鈕】收藏本項目,持續(xù)更新中,敬請關(guān)注...
步驟三:RAM模塊
3.1 FIR低通濾波器
濾波器部分主要設(shè)計到FIR的verilog設(shè)計,filter_div,filter_mult。該模塊完成對數(shù)據(jù)流的實現(xiàn)了頻率為100 Hz的21階低通濾波器,以消除ECG信號中的噪聲。
圖3.1 低通濾波器
在信號處理中,數(shù)字濾波器是一種對采樣的離散時間信號執(zhí)行數(shù)學(xué)運算以減少或增強該信號某些方面的系統(tǒng)。這與模擬濾波相反,模擬濾波器是一種對連續(xù)時間模擬信號進行操作的電路。
很容易就能理解是,高通濾波:高頻信號可以通過,而低頻信號不能通過。低通濾波:低頻信號可以通過,而高頻信號不能通過。數(shù)字濾波器通常由一個模數(shù)轉(zhuǎn)換器對輸入信號進行采樣,然后由一個微處理器和一些外圍組件(例如用于存儲數(shù)據(jù)和濾波器系數(shù)的存儲器)組成。最后,由一個數(shù)模轉(zhuǎn)換器來完成輸出階段。微處理器上運行的程序指令(軟件)通過對從ADC接收到的數(shù)字執(zhí)行必要的數(shù)學(xué)運算來實現(xiàn)數(shù)字濾波器。在某些高性能應(yīng)用中,使用FPGA或ASIC代替通用微處理器或具有特定并行架構(gòu)的專用DSP,以加快諸如過濾之類的操作。低通濾波器是一種使頻率低于某個截止頻率的信號通過并衰減高于該截止頻率的信號的濾波器。
該部分主要著重代碼設(shè)計,濾波器具體的操作在這里不在重述,這是一位CSDN博客已經(jīng)將詳細敘述整個設(shè)計,按照步驟操作即可:低通FIR濾波器設(shè)計+Vivado實現(xiàn)
使用matlab中的filterDesigner設(shè)計濾波器
圖3.2:100Hz 低通濾波器
得到濾波器系數(shù):
進行具體的verilog代碼設(shè)計
圖3.3:框架
圖3.4: 流水線操作
對輸入的數(shù)據(jù)進行延遲操作,每1個bit數(shù)據(jù),就會依次緩存到reg signed [9:0] prev[20:0]; 然后接下來的數(shù)據(jù)在進來時候,就會依次移位依次
在乘濾波器系數(shù)時候,調(diào)用一個乘法器IP核。
圖3.5: 乘法器配置界面
然后將IP核例化到filter_21.v中
generate語法是可以可以實現(xiàn)某些語句的重復(fù),在這里對例化的filter_mult.v進行了該操作,使用generate 語句同時需要定義genvar,這是因為generate語句需要的循環(huán)變量。
其中coeffs系數(shù)如下,也就是通過鏈接方法求得,這里always@(*)是指里面的語句是組合邏輯的,*代替了敏感變量。
最后使用20個加法器將乘積結(jié)果進行累加,結(jié)果就是濾波后的信號
最后我們做個簡單RTL邏輯分析,結(jié)果如下,基本滿足設(shè)計要求,高清圖放在步驟3附件,感興趣可以查看。
圖3.6: RTL分析
3.2?RAM模塊
需要存儲ADC采集的樣本,因此使用了RAM,RAM是FPGA中常用的基礎(chǔ)模塊,可廣泛用于緩存數(shù)據(jù)的情況,同樣它也是ROM,F(xiàn)IFO的基礎(chǔ)。片內(nèi)RAM具有2個命令模式:讀取和寫入。這兩種狀態(tài)由we信號啟用寫模式時為高電平和禁用寫模式時為低電平的信號控制。
圖3.7: ram寫滿操作
在這里使用了[11:0] memory [0:2048]的reg信號,每一個觸發(fā)脈沖,index都會遞增,并存儲一個樣本,當(dāng)index等于2048時,產(chǎn)生一個脈沖,并且系統(tǒng)更改其狀態(tài),然后ram處于完全讀取模式。
在ram存儲單元中存儲滿了來自ECG的樣本數(shù)據(jù)后,將生成一個脈沖pulseMEM以觸發(fā)向PC的傳輸,UART模塊將接收這個信號(該信號將允許使用TX模塊進行發(fā)送),這個脈沖也是控制數(shù)據(jù)流,而且在不完整的數(shù)據(jù)的是不發(fā)送的,這會就可以減慢獲得的結(jié)果,并于后續(xù)狀態(tài)機操作。
圖3.8: ram端口信號
該模塊具有另一種良好的同步方法:dataReady1控制信號,是在ADC模塊完成AD采集轉(zhuǎn)換后,RAM才開始被寫入數(shù)據(jù)。
仿真結(jié)果如下,從圖中可以看出地址0寫入的data_in數(shù)據(jù)是2049,在上個周期,也就是data_out數(shù)據(jù)是1,表明有效數(shù)據(jù)讀出,整個寫與讀出有個memory_delay。
圖3.9: 仿真
步驟四:UART模塊
常見的串口通信波特率有2400 、9600、115200等,發(fā)送和接收波特率必須保持一致才能正確通信。波特率是指1秒最大傳輸?shù)臄?shù)據(jù)位數(shù),包括起始位、數(shù)據(jù)位、校驗位、停止位。假如通信波特率設(shè)定為9600,那么一個數(shù)據(jù)位的時間長度是1/9600秒,本實驗中的波特率由100MHz時鐘產(chǎn)生
圖4.1:uart模塊端口信號
接下來內(nèi)容主要介紹通過狀態(tài)機設(shè)計UART,在UART通信中,兩個UART直接相互通信。UART_tx將并行數(shù)據(jù)轉(zhuǎn)換為串行形式,以串行方式將其發(fā)送至UART_rx,然后UART_rx將接收到的串行數(shù)據(jù)轉(zhuǎn)換并行數(shù)據(jù)。只需要兩條線即可在兩個UART之間傳輸數(shù)據(jù)。數(shù)據(jù)從UART_tx的Tx引腳到UART_rx的Rx引腳:
圖4.2:模塊端口引腳
這里以uart_tx模塊為例,這里畫出了控制信號接口時序圖:
圖4.3:uart_tx模塊
本實驗中的波特率由100MHz時鐘產(chǎn)生,串口通信波特率9600,也就是10416個時鐘周期傳輸1個數(shù)據(jù)位,
S0時候,系統(tǒng)空閑狀態(tài),data是需要拉高的,busy信號是串口正在發(fā)送的一個標志信號, bit_pos是對每個數(shù)據(jù)位進行計數(shù)操作,當(dāng)計數(shù)最大值7的時候,相應(yīng)也會進行清零操作,en信號就是發(fā)送模塊工作的一個觸發(fā)信號,他主要是用來檢測待發(fā)送模塊的一個信號,這里檢測到en信號,進入S1狀態(tài)
S1時候,也就是i計數(shù)到最大值時候,在這里可以看到i=10415,這個data_out會進行拉低操作,表示起始位
S2時候,bit_pos從0計數(shù)到7時候,這個時候數(shù)據(jù)進行傳輸,這邊起始位之后,就是55,也就是10101010,從低到高這個順序。
S3時候,這里會將out拉高,之后發(fā)送完之后各個控制信號清零,包括計數(shù)器,如果沒有清零,會影響到下一次發(fā)送。
其中UART協(xié)議原理:消息幀從一個低位起始位開始,后面是7個或8個數(shù)據(jù)位,一個可用的奇偶位和一個或幾個高位停止位。接收器發(fā)現(xiàn)開始位時它就知道數(shù)據(jù)準備發(fā)送,并嘗試與發(fā)送器時鐘頻率同步。如果選擇了奇偶校驗,UART就在數(shù)據(jù)位后面加上奇偶位。奇偶位可用來幫助錯誤校驗。在接收過程中,UART從消息幀中去掉起始位和結(jié)束位,對進來的字節(jié)進行奇偶校驗,并將數(shù)據(jù)字節(jié)從串行轉(zhuǎn)換成并行。UART 傳輸時序如下圖所示:
圖4.4:UART傳輸時序圖
UART異步傳輸數(shù)據(jù),這意味著沒有時鐘信號將發(fā)送UART的位輸出與接收UART的位采樣同步。發(fā)送UART代替時鐘信號,將開始和停止位添加到正在傳輸?shù)臄?shù)據(jù)包中。這些位定義了數(shù)據(jù)包的開始和結(jié)束,因此接收UART知道何時開始讀取這些位。
圖4.5:verilog仿真驗證
當(dāng)接收UART檢測到起始位時,它將開始以稱為波特率的特定頻率讀取輸入位。 波特率是數(shù)據(jù)傳輸速度的度量,以每秒比特數(shù)(bps)表示。兩個UART必須以大約相同的波特率工作。在位的時序變得太遠之前,發(fā)送和接收UART之間的波特率只能相差約10%。
· 僅使用兩根電線;
· 無需時鐘信號;
· 具有奇偶校驗位以允許進行錯誤檢查;
· 只要雙方都設(shè)置好數(shù)據(jù)包的結(jié)構(gòu)即可;
· 廣泛使用的方法;
該模塊還具有良好的同步方法:startT控制信號,僅當(dāng)該引腳為高電平時,才會開始發(fā)送。還需要檢查標志是否忙碌—是否正在進行其他傳輸,txDone是在傳輸執(zhí)行時發(fā)出信號的標志。
UART塊逐樣本讀取緩存樣本并將其發(fā)送到PC,因為在UART中包的長度是8位,所以每個樣本被分成兩個字節(jié)。
圖4.6:AD(12bit)采集到發(fā)送(8bit)
因為ADC只有12位,而UART只有8位,所以我們需要傳輸2組數(shù)據(jù)。在這種情況下,重要的是要知道何時進行每次傳輸。這就是為什么需要cntParity的原因:cntParity。在偶數(shù)奇偶校驗上,我們傳輸8位,在奇數(shù)奇偶校驗上,其他4位被傳輸。
步驟五:整理調(diào)試
5.1 工具要求
項目所需的工具是:
?Digilent的Basys3開發(fā)板
?AD8232心電采集模塊
?若干導(dǎo)線
在Basys3 上,XADC Pmod接口擁有4組差分模擬輸入輸出,其相應(yīng)的XADC通道是6、7、14和15。下圖是XADC Pmod引腳圖,該項目引用了引腳1,其中XADC配置寄存器是addr<=7'h16
分壓電路:
Vivado 2016.4
ModelSim SE-64 10.5
Notepad++
Visual Studio 2017
5.2 綜合設(shè)計
視頻包括:頂層文件,各個模塊功能,還有RTL分析,調(diào)試視頻
上位機采集結(jié)果
這個上位機C#程序被設(shè)計成通過UART連接到FPGA;首先需要做的是選擇合適的COM,這個可以在設(shè)備管理器中找到它。在對FPGA下載bit流文件后并設(shè)置放大器在電極后,只需點擊GUI中的“Send”按鈕,即可開始采集。之后,通過“Get”按鈕,樣本數(shù)據(jù)被發(fā)送到PC端并顯示出來。
5.3 模塊綜合RTL
主要模塊分為AD采集模塊(XADC模塊和分頻模塊),F(xiàn)IR濾波模塊,ram存儲模塊,UART模塊。模塊之間的連接主要在頂層模塊進行狀態(tài)機操作,實現(xiàn)功能主要有:心電信號的采集、濾波、存儲和發(fā)送。
AD采集模塊
FIR濾波模塊
RAM存儲模塊
UART模塊
5.4 性能評估
功耗
時序
資源消耗_表
資源消耗_圖
5.5 感想
這個基于FPGA的心電信號采集與處理系統(tǒng)既不是可以替代醫(yī)學(xué)咨詢的產(chǎn)品,也不是可以治療任何疾病的產(chǎn)品,而是適合檢查特定地點的人體醫(yī)學(xué)狀況的系統(tǒng)。 這種項目可用于監(jiān)測無法去醫(yī)院的老年患者的健康,或可用于檢查患者的病情是否發(fā)生了變化。來自電極的心電信號使用AD8232(放大器)進行放大,然后將其發(fā)送到Bays3開發(fā)板,在此處進行處理。 該項目還具有一個用C#開發(fā)的GUI(圖形用戶界面),用來顯示ECG。
該項目最大的問題之一是采集到發(fā)送精度:由于ADC的12位和UART的8位,很難在不丟失信號同步的情況下解決兩者之間的差異。但是很好地通過模塊之間的許多控制信號解決了該問題。
至此,本期項目挑戰(zhàn)賽已經(jīng)全部打包完成,其中難免有缺漏和錯誤之處,敬請諒解或提出寶貴意見,便于后期及時糾正。
版權(quán)聲明:本文內(nèi)容為電路城原創(chuàng)內(nèi)容,未經(jīng)授權(quán)禁止轉(zhuǎn)載,侵權(quán)必究!