---
# System prepended metadata

title: SoC design LAB3

---

Prerequisite: Introduction to AXI interface
AXI4-Lite
Introduction to AXI4-Lite interface
---> https://docs.xilinx.com/r/en-US/pg202-mipi-dphy/AXI4-Lite-Interface
AXI-Stream
---> https://docs.xilinx.com/r/en-US/pg256-sdfec-integrated-block/AXI4-Stream-Interface




⚫ Block Diagram
電路會先讀取 tap coef.，而在這次 design 中我一次就先讀完，並都存入
TapRAM，同時我也先把 data 也一次讀取 11 個值，並放入 dataRAM，接著
tb 會先檢查我們的 coef.是否正確，正確才會繼續跑。利用 FSM 去控制在前
11 次的乘加(因為前 11 次不會乘完全部的 coef. ，因此我分成前 11 次和後
面的乘加)，前 11 次乘加完就先輸出了，然後跳至 11 次後面的乘加，並要
特別注意 dataRAM 和 TapRAM 的是怎麼 shift 的，在後面的報告中有更詳細
的描述，控制好 data 和 tap 就可以完成此次的 FIR design 了。
![image](https://hackmd.io/_uploads/rkLjteiuT.png)

⚫ Describe operation
◆ How to receive data-in and tap parameters and place into SRAM
I. data-in
data 是透過 AXI-stream 來做傳輸，當我們把 ss_tready 拉起來，代表我
們可以收 data 了，這時候 tb 就會吐值到 design。在這個 lab 中，我先
把 11 個 data 放進 data SRAM，同時也把 11 個 tap 值也放進 SRAM，到
計算的 state 再開始做運算，值都成完時再把舊的 data 洗掉，重新再
拉 ss_tready 跟 tb 要值。
II. tap parameters
tap parameters 是透過 AXI-Lite 來做傳輸，主要要熟悉 AXI-lite 的
protocol，tb 會先傳送 data 的地址，我們要拉 awready high，這樣才知
道現在傳的 data address，接著 tb 會把 wready 拉 high，代表 tb 方準
備好可以寫入了，而我們的 design 準備好時再把 wvalid 拉 high，tb 就
會吐值了。在這個 lab 中我也是先把 11 個值都先讀進 SRAM 存好，後面到運算的 state 時再開始運算。
III. SRAM 
SRAM 的操作就簡單許多，要注意的地方就三點，1. data 的地址 2. 
write enable 3.輸入 data，把這三樣東西準備好，並對齊，就可以在正
確的時間地點輸入進 SRAM。
◆ How to access shiftram and tapRAM to do computation
![image](https://hackmd.io/_uploads/BkQ8qgo_6.png)
上圖為 DataRAM 和 TapRAM 的示意圖，會去控制 ptr，來決定這次要
從 SRAM 讀哪個位置，並讓 ptr 從 initial_ptr 跑到 X_count 來完成一次
輸出運算。
![image](https://hackmd.io/_uploads/ryYwqljup.png)
我分為前 11 次運算以及 12~600 次運算為一組，在前 11 次不會乘滿整
個 tap，上圖為第 1 筆以及第 2 筆的運作方式，以此類推至第 11 筆。
11 筆後就是全乘了，而且會需要寫新值進去 dataRAM，initial_ptr 也會
改變，如下圖所示，藉由控制 ptr 來做讀取和寫，如下方波形圖所
示，將 tap, data 的要乘的位置對好，再做運算。
![image](https://hackmd.io/_uploads/BJMtcgo_6.png)
![image](https://hackmd.io/_uploads/HJEyyZj_a.png)

◆ How ap_done is generated
使用計數器來看現在是第幾筆 data 輸入。
![image](https://hackmd.io/_uploads/r1weJ-oup.png)
◆ How ap_start is generated
當 awaddr==0 和 wdata==1 時就拉起來，為了讓它 hold 一個 cycle 就
好，所以使用 state 來控制。
![image](https://hackmd.io/_uploads/HJBzJWi_6.png)
◆ How ap_start is generated
idle 的控制相對簡單，只需要跟 start, done 做好搭配即可。
![image](https://hackmd.io/_uploads/HyvX1-oup.png)

⚫ Resource usage
![image](https://hackmd.io/_uploads/r1jEJbiOa.png)
⚫ Timing Report
![image](https://hackmd.io/_uploads/B1ZU1-sdp.png)
longest path
![image](https://hackmd.io/_uploads/rkz4V0jOT.png)
![image](https://hackmd.io/_uploads/HJVBEAodp.png)

⚫ Simulation Waveform
◆ Coefficient program, and read back
先把 11 個 coef.寫進 TapRAM，tb 要檢查時則透過 AXI-lite 去做資料傳
輸。

![image](https://hackmd.io/_uploads/HycINRiuT.png)
◆ Data-in stream-in
前 11 筆 data 直接拿，後面 data 則是有需要才拿
![image](https://hackmd.io/_uploads/Bk-_E0j_T.png)

◆ Data-out stream-out
在 cs ==7 的時候輸出正確 data
![image](https://hackmd.io/_uploads/HkrFVCiOT.png)
◆ Bram access control
前 11 筆 data 直接連續存進 SRAM
![image](https://hackmd.io/_uploads/HkLc40jOp.png)
◆ FSM
在 state 4 時，會做運算，把 tap 和 data 的值都對齊來做乘法。
![image](https://hackmd.io/_uploads/H1KsEAs_6.png)
在 5, 6, 7 則是做最後一次乘法，然後累加，輸出數值，並把新 data 寫進dataRAM。
![image](https://hackmd.io/_uploads/BkxR4CjOa.png)
![image](https://hackmd.io/_uploads/B1WkHRo_a.png)
