---
# System prepended metadata

title: SOCStudy.md

---

# LAB 2-AXI-Master Interface 實作範例遇到的問題

### 下載從windows來的檔案之後導入ubuntu無法閱讀 :
要使用 dos2unix 指令將其轉換成 linux 系統有辦法閱讀的檔案。原因是因為在 windows 系統中的換行符號為\r\n。但是在 linux 系統之中的換行符號\n。dos2unix就是用來將\r\n換成\n。相反來說，要將 linux 系統之中的檔案轉換到 windows 系統就可以使用 unix2dos 指令。

### 加入directives的方式
在開始 Synthesis 之前必須先加入 directive 描述。加入directive 有兩種方式，一種是 inline 方式(使用#pragma)，另一種是以directives.tcl 來控制。

### 執行c sim時遇到的許多error
```
ERROR: [HLS 207-812] 'fir.h' file not found (AXI-Master_lab2/FIR.cpp:2:10)
ERROR: [SIM 211-100] 'csim_design' failed: compilation error(s).
ERROR: [HLS 200-627] Cannot find C test bench. Please specify test bench files using 'add_files -tb'.
fatal error: fir.h: No such file or directory #include "fir.h"
.
.
.
```
以上錯誤都是執行c sim時候一直遇到的，最後我把資料都整理好統一放在HLS project的folder裡面就解決了(之前design、testbench和其他一些需要在c sim時讀取的檔案都分散在不同的folder之中。)

![](https://hackmd.io/_uploads/r12Vs_ze6.png)

### 找不到c sim以及co sim紀錄檔的檔案位置
![](https://hackmd.io/_uploads/By41Tdfg6.png)

![](https://hackmd.io/_uploads/HJ_-adzep.png)

### .bit檔以及.hwh檔的位置

```
/home/ubuntu/course_lab-2/stream/Stream_vivado_lab2/Stream_vivado_lab2.runs/impl_1/design_1_wrapper.bit

/home/ubuntu/course_lab-2/stream/Stream_vivado_lab2/Stream_vivado_lab2.gen/sources_1/bd/design_1/hw_handoff/design_1.hwh 
```

這兩個檔案都是去vivado專案所儲存的資料夾裡面尋找。
* .bit檔去後綴為.run的資料夾，再進impl_1資料夾就可以找到。
* .hwh檔去後綴為.gen的資料夾，再進hw_handoff資料夾就可以找到。

# LAB 3 FIR
## BRAM
* BRAM的定義:

RAM是Random Access Memory，也就是**隨機訪問數據記憶體**，RAM的內部是一個一個小記憶體單元（可以看成是一個小格子）組成。每個記憶體單元都對應一個位址編號。當我們需要讀寫數據時，就訪問對應的記憶體單元位址，很快地把數據寫入或者讀取出來。BRAM是Block RAM，也就是FPGA中專用RAM資源，固定分佈在FPGA內部的特定位置。而分散式RAM（Distributed RAM或DRAM）是由FPGA的LUT邏輯資源組合而成。

* BRAM的組成


BRAM在FPGA實際對應的資源是RAMB36E1和RAMB18E1。
（1）RAMB36E1

RAMB36E1是一種具有36KB容量的Block RAM，**由兩個獨立的18KB BRAM（Block RAM，RAMB18E1）組成。**

一個36K的Block Memory可以配置成4種情形：

全部用於配置成36KB的BRAM;
全部用於配置成36KB的FIFO;
配置成18KB的BRAM和18KB的BRAM;
配置成18KB的BRAM和18KB的FIFO。
這裡需要注意的是，不能配置成兩個18KB的FIFO，因為一個Block Memory中間有一個FIFO Logic結構，它用於生成FIFO控制信號，包括讀/寫位址等，由於它只有1個且不能共用，所以最多只能配置一個FIFO。

（2）RAMB18E1

RAMB18E1是一種具有18KB容量的Block RAM，是Xilinx FPGA重要的內置Block RAM配置模組，**提供高速的同步存儲訪問能力。**

（3）FPGA的BRAM數量

BRAM資源是FPGA中非常重要的資源，不同型號FPGA晶元的BRAM數量不一樣

---
DRAM是組合邏輯直接輸出，BRAM則是時序邏輯輸出。BRAM把位址送進去的時候是要過寄存器，所以數據也是要有時鍾才能輸出。
![](https://hackmd.io/_uploads/Bkawfh8Wa.png)


---

BRAM IP的基本選項:
![](https://hackmd.io/_uploads/rkK9znL-a.png)

左邊的IP SYMBOL（省略末尾的a/b）:

* addr：埠地址輸入
* clk ：埠時鐘輸入
* din ： 連接埠資料輸入
* dout： 埠資料輸出
* ena： 埠使能輸入，高有效
* rst ： 埠複位輸入，高有效
*　wea：寫使能/Byte 寫使能輸入，高有效
### BRAM的三種模式
第一種，WRITE_FIRST（寫先於讀）
![](https://hackmd.io/_uploads/BJWYX3IW6.png)
紅線以前，WE=0 ，即埠做的是讀操作。 在CLK上升沿后，位址aa里的數據打到DO。 在紅線后，WE=1，即埠做的是寫操作。 在CLK上升沿后，**DI的數據存入到位址bb里，與此同時輸入的數據DI直接打到去輸出DO。原先存在bb里的數據嘛還沒出來就被衝掉。**


第二種，READ_FIRST（讀先於寫）
![](https://hackmd.io/_uploads/HJvnEhLbT.png)
紅線以前，WE=0 ，即埠做的是讀操作。 在CLK上升沿后，位址aa里的數據打到DO。 在紅線后，WE=1，即埠做的是寫操作。 在CLK上升沿后，DI的數據存入到位址bb里，與此同時原先存放在位址bb的數據輸出到DO。

第三種，NO_CHANGE
![](https://hackmd.io/_uploads/Sk0YSh8Wp.png)
紅線以前，WE=0 ，即埠做的是讀操作。 在CLK上升沿后，位址aa里的數據打到DO。 在紅線后，WE=1，即埠做的是寫操作。 在CLK上升沿后，DI的數據存入到位址bb里，與此同時輸出DO的數據保持不變（依舊是位址aa里的數據）





