Thứ Tư, 6 tháng 9, 2017

[IP core] FIFO và LIFO đồng bộ - phiên bản hỗ trợ một số trường hợp đặc biệt

Bài này trình bày về một số trường hợp đặc biệt của FIFO và LIFO (STACK) đồng bộ và cách thực hiện mạch xử lý các trường hợp riêng này. Với FIFO, các trường hợp đặc biệt là khả năng ghi thêm khi FIFO đã đầy (full), khả năng đọc khi FIFO đang rỗng (empty). Với LIFO (STACK),  khả năng đọc và ghi cùng một thời điểm là vấn đề sẽ được đề cập đến.
Hai bài viết them khảo cần đọc trước khi đọc và hiểu bài viết này:

1. FIFO đồng bộ

1.1 Phân tích
Đầu tiên các bạn hãy tham khảo bài FIFO đồng bộ phiên bản 1 trong wesite này vì bài viết này sẽ chỉ trình bày những điểm khác biệt và các mạch mới sẽ được thêm vào dựa trên thiết kế có sẵn này.

Trong phiên bản này, gọi là phiên bản 1, khi FIFO đã đầy, tín hiệu sfifo_full=1 thì FIFO hoàn toàn không thể ghi tiếp. Nếu tiếp tục ghi khi FIFO đang đầy, wr=1, thì trạng thái tiếp theo sẽ là overflow, sfifo_ov=1. Khi FIFO đã rỗng, sfifo_empty=1, thì FIFO hoàn toàn không thể đọc được một giá trị dữ liệu hợp lệ nào. Nếu tiếp tục đọc, rd=1, khi FIFO đang rỗng thì trạng thái tiếp theo là underflow, sfifo_ud=1.

Phiên bản 1 có thể được nâng cấp với một vài điều chỉnh nhỏ để hỗ trợ thêm:
  1. Ghi khi FIFO đã đầy, sfifo_full=1
  2. Đọc khi FIFO đã rỗng, sfifo_empty=1

Hai điều trên có thể thực hiện được trong một trường hợp đặc biệt khi cả tín hiệu đọc (rd) và tín hiệu ghi (wr) cùng tích cực khi FIFO đang đầy hoặc đang rỗng. Cụ thể:
  1. Khi FIFO đầy (sfifo_full=1), nếu wr=rd=1 thì dữ liệu cần đọc sẽ được lấy ra khỏi FIFO và dữ liệu cần ghi sẽ được ghi vào FIFO ở cùng 1 cạch xung clock. Lúc này, cả hai con trỏ đọc và ghi cùng tăng. Trạng thái FIFO đầy vẫn được duy trì vì FIFO được lấy ra 1 dữ liệu nhưng đồng thời cũng nạp thêm 1 dữ liệu mới.
  2. Khi FIFO rỗng (sfifo_empty=1), nếu wr=rd=1 thì dữ liệu cần đọc sẽ được truyền trực tiếp từ ngõ vào FIFO đến ngõ ra FIFO mà không cần lưu vào bộ nhớ trung gian mem_array. Trạng thái FIFO rỗng vẫn được duy trì vì FIFO không lưu giá trị dữ liệu mới. Lúc này, cả hai con trỏ đọc và ghi không thay đổi giá trị.

Hình 1. Minh họa hai trường hợp đặc biệt của FIFO khi FULL và EMPTY
Một số điều chỉnh được thực hiện như sau:

Mạch tạo tín hiệu ghi vào FIFO, đồng thời là tín hiệu tăng con trỏ ghi:
  • Mạch này thêm trường hợp cho phép ghi khi FIFO đang FULL nhưng đang được đọc (sfifo_full AND rd)
  • Mạch này loại bỏ trường hợp ghi khi FIFO đang EMPTY nhưng đang được đọc (sfifo_empty AND rd NOR sfifo_full) vì lúc này dữ liệu đầu vào FIFO được chuyển trực tiếp đến đầu ra FIFO

Hình 2. Mạch tạo tín hiệu cho phép ghi vào FIFO
Mạch dữ liệu đầu ra FIFO được thêm phần xử lý chuyển tiếp dữ liệu khi FIFO đang EMPTY:
Hình 3. Mạch tạo dữ liệu đầu ra của FIFO
Mạch set/clear của tín hiệu báo overflow (sfifo_ov) và underflow (sfifo_ud):
  • Set khi không xuất hiện đọc/ghi cùng thời điểm
  • Clear dùng trực tiếp tín hiệu rd, đối với sfifo_ov, và wr đối với sfifo_ud

Hình 4. Mạch tạo set/clear tín hiệu báo overflow và underflow

Mạch tạo tín hiệu báo hợp lệ cho ngõ ra dữ liệu: Để hỗ trợ tốt cho việc phát hiện đúng giá trị dữ liệu hợp lệ được đọc ra từ FIFO. Thiết kế có thể thêm một tín hiệu báo hợp lệ, sfifo_valid đi kèm với dữ liệu data_out. Tín hiệu này chỉ tích cực nếu ngõ ra data_out là dữ liệu hợp lệ.
Hình 5. Mạch tạo tín hiệu báo valid cho ngõ ra data_out
1.2 RTL code và Testbench

Pass (nếu có): nguyenquanicd
Source File:
  • sfifo_v2.v - RTL code
  • sfifo_define.h - chứa các định nghĩa để cấu hình trước khi tổng hợp. Nếu bạn không muốn sử dụng phần tín hiệu hay mạch nào thì chỉ cần comment che định nghĩa đó đi. Thêm 2 định nghĩa mới:
    • `define WRITE_FULL_EN - Cho phép hỗ trợ ghi khi FULL
    • `define READ_EMPTY_EN - Cho phép hỗ trợ đọc khi EMPTY
  • sfifo_parameter.h - chứa thông số cấu hình dung lượng FIFO
  • tb_sfifo_v2.v - một basic testbench
Lưu ý:
  • Chỉ hỗ trợ ghi khi FULL và đọc khi EMPTY khi không định nghĩa TWO_CLOCK (nghĩa là chỉ sử dụng 1 xung clock)
1.3 Tổng hợp trên FPGA
Cấu hình trong file sfifo_define.h
`define EMPTY_SIGNAL
`define FULL_SIGNAL
`define SET_LOW_EN
`define SET_HIGH_EN
`define LOW_TH_SIGNAL
`define HIGH_TH_SIGNAL
`define OV_SIGNAL
`define UD_SIGNAL
//`define OUTPUT_REG
//`define TWO_CLOCK
//The new defines of the version 2
//Only use the following options when TWO_CLOCK is not defined
`define WRITE_FULL_EN

`define READ_EMPTY_EN



2. LIFO (STACK) đồng bộ
2.1 Phân tích
Đầu tiên các bạn hãy tham khảo bài LIFO đồng bộ phiên bản 1 trong wesite này.

Trong phiên bản này, gọi là phiên bản 1, LIFO không hỗ trợ việc đọc và ghi cùng một thời điểm, nghĩa là khi wr=rd=1 thì LIFO không hoạt động. Để hỗ trợ chức năng này, một số điều chỉnh thiết kế cần được thực hiện.
Hình 6. Chuyển tiếp dữ liệu khi wr=rd=1

Mạch tạo dữ liệu ngõ ra LIFO
thực hiện chuyển tiếp dữ liệu từ ngõ vào đến ngõ ra khi có sự kiện đọc/ghi cùng xuất hiện.
Hình 7. Mạch tạo ngõ ra LIFO phiên bản 2
Mạch tạo tín hiệu cho phép đọc/ghi LIFO chỉ tích cực tín hiệu lifo_we hoặc lifo_re khi không có sự kiện đọc/ghi đồng thời.
Hình 8. Mạch tạo tín hiệu cho phép đọc/ghi LIFO phiên bản 2
Mạch set/clear tín hiệu báo overflow và underflow cũng được điều chỉnh để:

  • Không báo overflow khi xuất hiện sự kiện ghi vào LIFO khi đang đầy nếu sự kiện đọc cũng xuất hiện, vì lúc này dữ liệu ghi vào LIFO được chuyển tiếp đến ngõ ra LIFO
  • Không báo underflow khi xuất hiện sự kiện đọc từ LIFO khi đang rỗng nếu sự kiện ghi cũng xuất hiện, vì lúc này dữ liệu ghi vào LIFO được chuyển tiếp đến ngõ ra LIFO

Hình 9. Mạch tạo tín hiệu set/clear tín hiệu báo trạng thái overflow và underflow
Mạch tạo tín hiệu báo dữ liệu ngõ ra LIFO hợp lệ được tích cực khi dữ liệu được đọc ở ngõ ra LIFO là hợp lệ.
Hình 10. Mạch tạo tín hiệu báo giá trị hợp lệ của ngõ ra LIFO
2.2 RTL code và testbench


Pass (nếu có): nguyenquanicd

Source File:
  • slifo_v2.v - RTL code
  • slifo_define.h - chứa các định nghĩa để cấu hình trước khi tổng hợp. Nếu bạn không muốn sử dụng phần tín hiệu hay mạch nào thì chỉ cần comment che định nghĩa đó đi. Thêm định nghĩa mới:
    • `define WR_SAME_TIME_EN - cho phép chức năng đọc/ghi đồng thời được tạo ra
  • slifo_parameter.h - chứa thông số cấu hình dung lượng LIFO
  • tb_slifo_v2.v - một basic testbench
2.3 Tổng hợp trên FPGA
Cấu hình trong file slifo_define.h
`define EMPTY_SIGNAL
`define FULL_SIGNAL
`define SET_LOW_EN
`define SET_HIGH_EN
`define LOW_TH_SIGNAL
`define HIGH_TH_SIGNAL
`define OV_SIGNAL
`define UD_SIGNAL
`define OUTPUT_REG
//The new defines of the version 2
`define WR_SAME_TIME_EN

*Nếu có bất cứ ý kiến cần trao đổi, các bạn có thể comment dưới bài viết 

0 bình luận:

Đăng nhận xét