題目描述
一個 ECG 信號有 P、Q、R、S、T 四個波,本題希望輸出 Q、R、S 的位置。
下圖為需要實作的演算法流程,主要分為三段:
- 16-tap Moving Avergage:$MV(n) = [x(n)+x(n-1)+…+x(n-15)]/16$
- Remove DC-Bias:$DelDC(n) = x(n)-MV(n)$
- 15-tap Windowing Filter: $WF(n) = [DelDC(n-7) + 2DelDC(n-6) + … + 8DelDC(n) + … + DelDC(n+7)]/64$
硬體架構圖
硬體介面描述
腳位 | 內容 |
---|---|
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$ 我們可以觀察到
- 加減法器量大量減少,由 15 個加法器變為 2 組加減法器。(但要注意的是總和 $S1$ 的加減法器會比較大,因為其數值範圍較大)
- 暫存器不會變少($S1$ 也需要 16 個 delay),而且也不可能變少(否則,數學上不可能達到原本濾波器的效果)
- 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)。