1. Giới thiệu về FIFO.
- FIFO rất thường được sử dụng trong các thiết kế, chức nằng chủ yếu là bộ buffer lưu giữ tạm dữ liệu của bạn khi dữ liệu trước đó chưa xử lý xong. Ngoài ra còn được sử dụng để truyền nhận dữ liệu giữa 2 miền clock khác nhau (asynchronous FIFO). Trong hầu hết nhiều IP đều sử dụng FIFO
- Có hai loại FIFO cơ bản là : FIFO đồng bộ ( synchronous FIFO, read write sử dụng cùng clock) và FIFO bất đồng bộ( asynchronous FIFO, read clock khác write clock) . Trong bài này sẽ nói về thiết kế FIFO đồng bộ.
- Thông thường để thiết kế FIFO ta thường dùng thanh ghi (Regidters) được để lưu trữ dữ liệu, cách này chỉ áp dụng cho các FIFO cỡ nhỏ vì dùng nhiều thanh ghi rất tốn tài nguyên (resource). Một cách khác là thiết kế FIFO để điều khiển SRAM hai port.
2. Nguyên lý hoạt động FIFO
Figure 1 : Đọc FIFO.
- Theo Figure 1 trên ta thấy cứ sau một lần đoc thì con trỏ đọc của FIFO tăng lên, đến một lúc nào đó thì hai con trỏ ở cùng một vị trì như hình trên thì FIFO empty( FIFO không còn data). Lúc này wptr = rptr.
#Note : Nhưng ô màu đỏ chứa data chưa được đọc.
Figure 2 : Write FIFO.
- Trong Figure 2 trên ta thấy cứ sau một lần ghi thì con trỏ ghi của FIFO tăng lên, đến một lúc nào đó thì hai con trỏ ở cùng một vị trì như hình trên thì FIFO full. Lúc này wptr = rptr.
- Khi FIFO full con trỏ ghi = con trỏ đọc, khi FIFO empty thì con trỏ ghi cũng bằng con trỏ đọc. Vậy làm sao để biết lúc nào là full, lúc nào la empty ?
-Trong design này sử dụng một cách đơn giản là mở rộng con trỏ đọc và ghi thêm một bit.
Ví dụ : Nếu FIFO có chiều sâu là 8 ô nhớ thì chỉ cần 3 bit địa chỉ là đủ. Trong design này ta sẽ dùng 4 bit cho con trỏ đọc và ghi.( reg [3:0] wptr , reg [3:0] rptr).
Figure 3 : Inputs, outputs port
3. Logic Implementation
Figure 4 : Functional blocks.
Read control logic
Write control logic
Read/Write timing
Link code : http://www.mediafire.com/file/38wbunf32uuoqyw/sync_fifo.rar
- FIFO rất thường được sử dụng trong các thiết kế, chức nằng chủ yếu là bộ buffer lưu giữ tạm dữ liệu của bạn khi dữ liệu trước đó chưa xử lý xong. Ngoài ra còn được sử dụng để truyền nhận dữ liệu giữa 2 miền clock khác nhau (asynchronous FIFO). Trong hầu hết nhiều IP đều sử dụng FIFO
- Có hai loại FIFO cơ bản là : FIFO đồng bộ ( synchronous FIFO, read write sử dụng cùng clock) và FIFO bất đồng bộ( asynchronous FIFO, read clock khác write clock) . Trong bài này sẽ nói về thiết kế FIFO đồng bộ.
- Thông thường để thiết kế FIFO ta thường dùng thanh ghi (Regidters) được để lưu trữ dữ liệu, cách này chỉ áp dụng cho các FIFO cỡ nhỏ vì dùng nhiều thanh ghi rất tốn tài nguyên (resource). Một cách khác là thiết kế FIFO để điều khiển SRAM hai port.
2. Nguyên lý hoạt động FIFO
Figure 1 : Đọc FIFO.
- Theo Figure 1 trên ta thấy cứ sau một lần đoc thì con trỏ đọc của FIFO tăng lên, đến một lúc nào đó thì hai con trỏ ở cùng một vị trì như hình trên thì FIFO empty( FIFO không còn data). Lúc này wptr = rptr.
#Note : Nhưng ô màu đỏ chứa data chưa được đọc.
Figure 2 : Write FIFO.
- Trong Figure 2 trên ta thấy cứ sau một lần ghi thì con trỏ ghi của FIFO tăng lên, đến một lúc nào đó thì hai con trỏ ở cùng một vị trì như hình trên thì FIFO full. Lúc này wptr = rptr.
- Khi FIFO full con trỏ ghi = con trỏ đọc, khi FIFO empty thì con trỏ ghi cũng bằng con trỏ đọc. Vậy làm sao để biết lúc nào là full, lúc nào la empty ?
-Trong design này sử dụng một cách đơn giản là mở rộng con trỏ đọc và ghi thêm một bit.
Ví dụ : Nếu FIFO có chiều sâu là 8 ô nhớ thì chỉ cần 3 bit địa chỉ là đủ. Trong design này ta sẽ dùng 4 bit cho con trỏ đọc và ghi.( reg [3:0] wptr , reg [3:0] rptr).
- Trong quá trinh ghi FIFO nếu thỏa điều kiện {~wptr[3],wptr[2:0]} = rptr thi kết luận FIFO full.
- Còn trong quá trinh ghi FIFO nếu thỏa điều kiện wptr = rptr thi kết luận FIFO empty.
Figure 3 : Inputs, outputs port
3. Logic Implementation
Figure 4 : Functional blocks.
Read control logic
Write control logic
Read/Write timing
Link code : http://www.mediafire.com/file/38wbunf32uuoqyw/sync_fifo.rar