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