Decoder và encoder: mã số, one-hot và quyền ưu tiên
Tiên quyết
- Module A1: Biểu diễn số: Đang tải
- MUX và DEMUX: chọn đường dữ liệu, không giữ dữ liệu: Đang tải
Sau bài này bạn sẽ
- Dùng enable và mức kích hoạt để đọc đúng decoder
- Phân biệt encoder thường với priority encoder có valid
- Xử lý rõ không request, nhiều request và thứ tự ưu tiên
Mã chọn khác tập các yêu cầu
Một bộ giải mã nhận số thứ tự rồi kích hoạt một đường tương ứng. Một bộ mã hóa nhận các đường đang kích hoạt rồi đưa ra số thứ tự.
Hai hướng này không mặc nhiên là hai hàm nghịch đảo cho mọi đầu vào. Khi nhiều request cùng bật, encoder cần giả thiết one-hot hoặc một quy tắc ưu tiên rõ ràng.
Decoder có enable và mức kích hoạt
Decoder active-high 2→4 dùng mã A/B; khi enable E bằng 0 thì mọi đầu ra đều 0.
| E | A B | D3..D0 |
|---|---|---|
| 0 | bất kỳ mã 0/1 | 0000 |
| 1 | 00 | 0001 |
| 1 | 01 | 0010 |
| 1 | 10 | 0100 |
| 1 | 11 | 1000 |
Mỗi đầu ra là một minterm của mã và được chặn bởi E. Ví dụ D2 bằng E·A·B'. Khi E bật và mã xác định, đúng một đường ra 1.
Decoder active-low có đầu ra được chọn xuống 0, các đường còn lại lên 1. Tên linh kiện hoặc từ “decoder” chưa xác định được polarity của enable và output; phải đọc hợp đồng cụ thể.
Enable giúp ghép decoder lớn hơn
Để dựng decoder 3→8, dùng hai decoder 2→4. Hai bit thấp cấp cho cả hai khối; bit cao chọn enable của một trong hai khối. Một nhánh nhận bit cao, nhánh còn lại nhận bit đảo của nó.
Giữ đúng thứ tự bit và số thứ tự đầu ra. Nếu hai nhánh cùng được enable do nối sai polarity, tính one-hot toàn cục sẽ hỏng.
Decoder cũng tạo các minterm để ghép thành hàm. Ví dụ hàm ba đầu vào đạt khi ít nhất hai bit bằng 1 có thể OR các đường minterm 3, 5, 6, 7. Cách dựng đúng chức năng chưa chắc là cách mapping hiệu quả nhất.
Encoder thường cần đầu vào one-hot
Với bốn request, encoder OR đơn giản có C1=R3+R2 và C0=R3+R1. Nó đúng số thứ tự khi đúng một request bật.
R3..R0 |
Code | Ý nghĩa |
|---|---|---|
0001 |
00 | Request 0 |
0010 |
01 | Request 1 |
0100 |
10 | Request 2 |
1000 |
11 | Request 3 |
0000 |
00 | Không phân biệt được với request 0 nếu thiếu valid |
0110 |
11 | Trộn mã 1 và 2 thành 3, dù request 3 không bật |
“One-hot” nghĩa đúng một bit 1; “one-hot-or-zero” cho phép thêm mẫu tất cả 0. Cờ valid giúp tách trường hợp không có yêu cầu, nhưng chỉ valid chưa giải quyết việc nhiều request.
Priority encoder phải nói ai thắng
Chọn quy tắc chỉ số lớn hơn có ưu tiên cao hơn. Khi R3 bật thì code là 3, không phụ thuộc các request thấp hơn. Nếu R3 tắt mà R2 bật thì code là 2; tiếp tục như vậy.
R3..R0 |
Valid | Code trong ví dụ |
|---|---|---|
0000 |
0 | 00 theo quy ước của bài |
0001 |
1 | 00 |
0011 |
1 | 01 |
0110 |
1 | 10 |
1011 |
1 | 11 |
Code 00 vẫn có hai khả năng, vì vậy người nhận phải kiểm valid trước khi dùng. Trong nhiều giao diện, code không có ý nghĩa khi valid bằng 0; ví dụ này chọn 00 xác định để dễ kiểm, không áp đặt lên mọi thiết kế.
Ưu tiên thấp nhất thắng cũng là một hợp đồng hợp lệ nếu đã thỏa thuận. Không suy quy tắc từ tên biến hoặc thứ tự chân vẽ trên sơ đồ.
Ưu tiên tổ hợp chưa phải bộ phân xử công bằng
Priority encoder chỉ chọn một request của trạng thái đầu vào hiện tại. Nếu request ưu tiên cao luôn bật, request thấp có thể không được chọn. Nó chưa tạo fairness, round-robin hay giao thức giữ grant tới khi giao dịch xong.
Với encoder thường, cần kiểm giả thiết one-hot tại biên. Với priority encoder, cần kiểm từng lớp nhiều request, valid và quy tắc thắng. Với decoder, cần kiểm enable tắt, mọi mã và polarity.
Trong RTL tổ hợp, gán mặc định trước các nhánh rồi ghi đè theo ưu tiên. Bỏ một đầu ra chưa gán ở một nhánh có thể tạo phần tử nhớ ngoài ý muốn.
Các lỗi khiến mã không còn đại diện một request
- Dùng encoder OR khi nhiều request có thể bật.
- Quên valid nên nhầm không request với request 0.
- Đảo thứ tự ưu tiên do đọc từ trái qua phải trên một vector.
- Nối sai polarity enable của decoder ghép tầng.
- Coi priority encoder là bằng chứng không có starvation.
Khi debug, ghi cả vector request, valid và code. Chỉ in code sẽ che mất nhiều lỗi hợp đồng.
Thử cả không request và nhiều request
- Encoder OR bốn request nhận 0101 cho mã gì? Mã ấy có nhất thiết chỉ một request đang bật không?
- Priority encoder chỉ số cao thắng nhận 0101 cho code/valid nào?
- Vì sao thêm valid cho encoder OR vẫn chưa đủ xử lý mọi mẫu multi-hot?
- Decoder active-low được chọn đường 2 có vector D3..D0 nào?
- Muốn tránh request thấp bị đói, còn cần cơ chế nào ngoài priority encoder tổ hợp?
Kiểm tra
Bằng chứng kiểm chứng
Expected tính trước chạy: CODEC CHECK priority=16 onehot=4 multi=11 none=1 decoder=8 time_ns=24.
Kiểm toàn bộ 16 request pattern: bốn one-hot, 11 multi-hot và một none. Tham chiếu duyệt các vị trí bằng số nguyên để tìm chỉ số cao nhất, khác chuỗi if ưu tiên của DUT. Encoder OR chỉ đối chiếu code trong bốn mẫu thỏa one-hot; mọi mẫu priority đều kiểm valid và code xác định.
Decoder active-high kiểm cả hai trạng thái enable qua bốn mã. Parsed/linted/simulated/synthesized đạt; synthesis generic không có flip-flop/latch. Không claim fairness hoặc triển khai arbiter có trạng thái, không kiểm X/Z.
Nguồn và mức độ đối chiếu
- Digital Encoder Circuit — bản chụp resources.zip, Quick Answer: Binary vs. Priority Encoder; The Binary Encoder; Two Problems With the Plain Encoder; The Priority Encoder. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản A2.codec, Sixteen request patterns, independent highest-bit selection and eight enabled-decoder vectors. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, Priority procedural selection, combinational completeness and reduction operators — chưa đối chiếu LRM. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Digital Decoder Circuit — bản chụp resources.zip, The 2-to-4 Decoder With Enable; Building Bigger Decoders From Smaller Ones; A Decoder Generates Minterms. Trích dẫn; nguồn đã đọc các mục liên quan.