題目描述

一個 ECG 信號有 P、Q、R、S、T 四個波,本題希望輸出 Q、R、S 的位置。

下圖為需要實作的演算法流程,主要分為三段:

  1. 16-tap Moving Avergage:$MV(n) = [x(n)+x(n-1)+…+x(n-15)]/16$
  2. Remove DC-Bias:$DelDC(n) = x(n)-MV(n)$
  3. 15-tap Windowing Filter: $WF(n) = [DelDC(n-7) + 2DelDC(n-6) + … + 8DelDC(n) + … + DelDC(n+7)]/64$

Flow of a ECG QRS detection algorithm

硬體架構圖

Hardware diagram of a ECG QRS detector

硬體介面描述

腳位 內容
din 10 bit 訊號輸入
busy 當為 0 時,Host才會輸入資料
Q、R、S 12 bit位置資訊,須同步輸出
valid 當 Q、R、S 值有效時為1

硬體實作

MV 實作

我的想法是存取一個總和的變數:$S1(n) = x(n)+S(n-1)$。如此,我們可以利用 $MV(n)=(S(n)-S(n-16))/16$來計算。相比於原本直接實作 $MV(n) = [x(n)+x(n-1)+…+x(n-15)]/16$ 我們可以觀察到

  1. 加減法器量大量減少,由 15 個加法器變為 2 組加減法器。(但要注意的是總和 $S1$ 的加減法器會比較大,因為其數值範圍較大)
  2. 暫存器不會變少($S1$ 也需要 16 個 delay),而且也不可能變少(否則,數學上不可能達到原本濾波器的效果)
  3. Critical Path 可望有大幅度的減少

WF 實作

我利用了類似 MV 的做法來實作。我想有些同學可能沒看出來這也可以利用累加的方式實作。事實上,我們在訊號課程中都學過,兩個方波的卷積是三角波。這邊也是一樣的道理,WF 即是通過兩次的 MV 而得。公式如下,

$S2(n)=DelDc(n)+…+DelDc(n-7)$ $WF(n)=S2(n)+…+S2(n+7)$

一樣的,我們也是利用前面 MV 的做法來實現兩個 MV。

QRS 判斷

R 判定位置的部分,我們可以值續更新最大值的位置及數值而得到。相同的,Q 和 S 波也可以利用一些簡單的判斷來存取他的位置。每一種判定都只需要兩三個加減法器與暫存器。

優化細節

在比賽結束後,我觀察其他同學的 clock 週期大多優化到 3 奈秒左右而已。但是我們的做法因為 register 之間頂多只有兩三個 register (包括一些判斷用的 comparator),可以優化到 2 奈秒。光是這部分就造成了 T 值 50% 的差距。

我們再觀察 A 值部分會發現,基本上 register 已經不可能再少。否則就不可能運算出原本演算法的結果(這邊不討論犧牲硬體只求通過比賽提供的測試資料的方式)。

競賽細節與心得

這篇文章主要介紹我在看到題目當下的想法。這些方法雖然看似簡單,但還是有一些 boundary condition 需要驗證。我在比賽中也花了 60 % 的時間來用 MATLAB 進行驗證,並保證演算法的可行性才開始實作。後續的 RTL 和 APR 也都很順利的完成。最後再留一點時間進行 RTL 上的優化,以及優化不同 core utilization 的 floorplan。

在比賽當下,我判斷這樣的 AT 值已經是我能估計得極限,剩下就只剩下細節優化的部分了。在最後優化的時候,因為時間也不是很夠。我稍微計算後,我開始優化 timing 而非 core utilization。我會選擇優化 timing 的原因是:從 2.2 奈秒到 2.0 奈秒,整體 AT 值就可以提升 10%,而 core utilization 從 70 到 80 一樣可以提升 10 %,但卻需要很長的實作時間(修正 timing 和 DRC)。