Altifigence Academy

17 / 24 · Khái niệm

FIFO trống, đầy và truyền đồng thời

Tách số phần tử khỏi con trỏ và xác định hành vi push/pop tại biên.

Hàng đợi giữ thứ tự chấp nhận

FIFO chuyển giao phần tử được chấp nhận lâu nhất trước. Con trỏ đọc xác định phần tử lâu nhất, còn con trỏ ghi xác định vị trí lưu tiếp theo. Chỉ con trỏ bằng nhau không thể phân biệt trống với đầy, nên thiết kế này giữ bộ đếm số phần tử. Với độ sâu bốn, con trỏ cần hai bit nhưng bộ đếm cần ba bit để biểu diễn từ 0 đến 4. Lưu thẻ cùng dữ liệu.

FIFO có thanh ghi của chúng ta không cho dữ liệu đi xuyên khi hàng đợi trống. Output-valid là count>0 và pop là output-valid AND output-ready. Input-ready là count<depth OR pop, cho phép thay thế khi hàng đợi đầy đồng thời chuyển giao phần tử đầu. Push là input-valid AND input-ready. Count tiếp theo là count+push-pop. Hai phép gán riêng tăng và giảm count có thể xử lý sai truyền đồng thời; dùng một cập nhật kết hợp hoặc các trường hợp rõ ràng.

count cũĐiều kiệnpushpopcount mới
0Có đầu vào và đích sẵn sàng101
1Có đầu vào và đích sẵn sàng111
4Có đầu vào và đích dừng004
4Có đầu vào và đích sẵn sàng114

Hàng đợi trống không thể pop chỉ vì đích sẵn sàng. Đầu vào mới của nó chỉ truyền lần đầu tại cạnh tiếp theo. Hàng đợi đầy [A,B,C,D] đồng thời nhận A và chấp nhận E trở thành [B,C,D,E], vẫn đầy. Xác minh hành vi bộ nhớ bên dưới khi đọc và ghi cùng vị trí vật lý.

Quan sát số phần tử, thêm và lấy khỏi hàng đợi

FIFO bốn ô. Ban đầu rỗng, con trỏ đọc và ghi đều bằng 0. Nhận pop khi không rỗng. Nhận push khi còn chỗ hoặc pop được nhận tại cùng cạnh.

Độ sâu là lũy thừa hai quay vòng tự nhiên trong các bit con trỏ. Độ sâu ba cần chuyển rõ từ vị trí hai về 0. Kiểm tra riêng quay vòng, lấy phần tử cuối và thay thế khi đầy.

Hàng đợi trống độ sâu bốn chỉ hấp thụ bốn phần tử trong lúc đích dừng năm chu kỳ. Đầu vào thứ năm phải chờ. Nguồn không thể dừng cần nhiều dung lượng hơn hoặc chính sách mất dữ liệu được xác định. Không FIFO hữu hạn nào giải quyết việc nhận chậm hơn mãi mãi. Kiểm tra 0≤count≤depth, accepted-delivered=count và thứ tự thẻ; chỉ số đếm không thể phát hiện đổi thứ tự.

Tự thử

Với độ sâu hai và hàng đợi [tag3,tag4], đầu vào tag5 được đưa ra với out-ready=1. Tìm push, pop, count tiếp theo và hàng đợi tiếp theo. Tag5 có pop ngay nếu hàng đợi trống không?

Đọc giải thích

Pop=1 làm input-ready cao dù đầy, nên push=1. Count tiếp theo vẫn là hai và hàng đợi là [tag4,tag5]. Hàng đợi trống có out-valid=0, nên tag5 được lưu và không thể pop đến một cạnh sau.

Lựa chọn áp dụng cho trình duyệt này. Có thể đổi ở chân trang bất cứ lúc nào.