Gray code: một bit đổi ở mỗi bước kề nhau
Tiên quyết
- Module A0: Bức tranh toàn cảnh: Đang tải
- Binary, hex và BCD: cùng bit, khác cách biểu diễn: Đang tải
Sau bài này bạn sẽ
- Encode và decode binary-reflected Gray code
- Đọc bước chuyển binary và Gray trên VCD thật
- Phân biệt tính chất mã với điều kiện an toàn CDC
Đếm thứ tự không bắt buộc đổi nhiều bit
Binary từ 7 sang 8 chuyển 0111 → 1000: cả bốn bit đều đổi. Nếu quan sát các bit đổi ở những thời điểm khác nhau, một mẫu trung gian có thể không phải giá trị đầu hay cuối.
Binary-reflected Gray code sắp các từ mã để hai vị trí kề nhau chỉ khác một bit. Nó giúp giảm số bit phải chuyển trong một bước đếm; không tự sửa lỗi điện hay làm biến mất metastability.
Một bảng mã Gray bốn bit
Bài này dùng binary-reflected Gray code, viết tắt BRGC. Gray code là một họ mã; không phải mọi bảng Gray đều dùng đúng thứ tự dưới đây.
| Chỉ số binary | Binary | BRGC |
|---|---|---|
| 0 | 0000 |
0000 |
| 1 | 0001 |
0001 |
| 2 | 0010 |
0011 |
| 3 | 0011 |
0010 |
| 4 | 0100 |
0110 |
| 5 | 0101 |
0111 |
| 6 | 0110 |
0101 |
| 7 | 0111 |
0100 |
| 8 | 1000 |
1100 |
| 9 | 1001 |
1101 |
| 10 | 1010 |
1111 |
| 11 | 1011 |
1110 |
| 12 | 1100 |
1010 |
| 13 | 1101 |
1011 |
| 14 | 1110 |
1001 |
| 15 | 1111 |
1000 |
Vòng cuối 1000 → 0000 cũng đổi đúng một bit. Tính chất này áp dụng khi đi giữa hai vị trí kề nhau trên vòng, không phải giữa hai chỉ số bất kỳ. Ví dụ chỉ số 0 sang 2 có từ mã 0000 → 0011, đổi hai bit.
Tạo Gray bằng XOR hai bit kề
Với từ binary b rộng W bit, công thức BRGC là g = b XOR (b >> 1), dùng dịch logic và giữ W bit. MSB của g bằng MSB của b; mỗi bit thấp là XOR giữa hai bit binary kề nhau.
Ví dụ b là 1011; b dịch phải một vị trí thành 0101; XOR được 1110. Kết quả khớp hàng chỉ số 11 trong bảng.
Đừng dùng phép cộng thông thường trên g rồi coi đó là “tăng bộ đếm Gray”. Cách dễ kiểm là giữ bộ đếm binary để tính số học, rồi mã hóa giá trị cần truyền hoặc hiển thị.
Giải mã bằng XOR tích lũy từ MSB
MSB của b bằng MSB của g. Mỗi bit binary tiếp theo bằng bit binary ngay phía trên XOR với bit Gray cùng vị trí.
Với g là 1110: MSB b bằng 1; tiếp theo 1 XOR 1 = 0; tiếp 0 XOR 1 = 1; cuối 1 XOR 0 = 1. Khôi phục b là 1011.
Hai hướng encode/decode cần được so với bảng độc lập. Chỉ kiểm “decode(encode(b)) bằng b” có thể bỏ sót việc hai hàm cùng dùng một bảng mã sai so với giao diện đã thỏa thuận.
Nhìn bước 7 sang 8 trên waveform
Các lane b3 tới b0 là binary; g3 tới g0 là Gray. Mỗi cột là một giá trị đã ổn định trong mô phỏng, đi từ 0 tới 15 rồi quay về 0.
Tại cột 8, so với cột 7, b đổi cả bốn bit còn g chỉ đổi g3. Cột 16 cho thấy bước quay vòng. Clock trong hình chỉ là mốc lấy mẫu của testbench; bộ encode/decode trong ví dụ là tổ hợp.
Waveform được lấy mẫu không cho biết các glitch ngắn giữa hai mẫu. Không dùng hình này để kết luận encoder tổ hợp luôn không glitch trong phần cứng.
Một bit đổi chưa đủ để bảo đảm CDC
Gray thường xuất hiện trong việc chuyển con trỏ FIFO giữa hai miền clock. Mục đích là tránh truyền một bộ đếm binary có nhiều bit đang chuyển đồng thời ở mỗi bước kề nhau.
Thiết kế thực còn cần quy tắc tạo và đăng ký con trỏ, synchronizer, ràng buộc timing/skew và phân tích CDC phù hợp. Mã Gray không phát hiện hoặc sửa metastability. Nếu nguồn nhảy nhiều vị trí, nhiều bit có thể đổi; một bit lỗi vẫn có thể tạo ra từ mã Gray hợp lệ khác.
Clock đích có thể bỏ qua vài giá trị nguồn khi hai miền chạy khác tốc độ. Tính đơn bit của các bước nguồn, điều kiện quan sát ở đích và độ trễ đồng bộ là các vấn đề riêng cần kiểm; ví dụ mã hóa ở bài này chưa xác nhận FIFO bất đồng bộ an toàn.
Đặt đúng phạm vi của tính chất đơn bit
- Nhầm “hai vị trí kề nhau” với “mọi cặp giá trị”.
- Dùng Gray như số binary để cộng, so lớn nhỏ trực tiếp.
- Cho rằng bảng mã là mã sửa lỗi chỉ vì mỗi bước đổi một bit.
- Suy tính không glitch từ vài cột waveform.
- Bỏ synchronizer vì đã mã hóa Gray.
Trong review RTL, hãy yêu cầu người viết chỉ rõ chuỗi chuyển trạng thái hợp lệ và nơi đăng ký tín hiệu. Đây là thông tin cần trước khi bàn đến CDC.
Tự dựng và phản biện bảng mã
- Encode binary
0110rồi decode kết quả để kiểm. - Đếm số bit đổi của bước chỉ số 3 sang 4 ở binary và BRGC.
- Tìm hai vị trí không kề nhau có từ Gray khác ít nhất hai bit.
- Vì sao kiểm round-trip thôi chưa chứng minh encoder khớp một giao diện bên ngoài?
- Một con trỏ có thể nhảy tăng 2 mỗi chu kỳ. Có thể dùng nguyên kết luận “chỉ một bit đổi” của bộ đếm tăng 1 không?
Kiểm tra
Bằng chứng kiểm chứng
Expected tính trước chạy: GRAY CHECK samples=17 unique=16 transitions=16 seen=65535 wrap=0 time_ns=180.
Tham chiếu là bảng 16 từ BRGC viết trước chạy, tách khỏi công thức XOR của DUT. Kiểm từng encode/decode, đủ 16 mã khác nhau và 16 bước kề gồm quay vòng. Giữ cạnh lấy mẫu thứ 18 để chặn cột VCD cuối; kết thúc tại 180 ns.
Parser, lint, simulation, VCD và synthesis generic đều đạt. Wave có 17 cột khớp trace thật. Yosys không suy flip-flop/latch trong DUT tổ hợp. Không claim timing vật lý, glitch-free, xác suất metastability hay CDC sign-off.
Nguồn và mức độ đối chiếu
- Gray Code — bản chụp resources.zip, What is Gray Code?; Binary vs. Gray Code Transition Comparison; Gray Code Table (0-15); Binary to Gray Code Conversion; Mathematical Formula; Common Beginner Mistakes. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản A1.gray, Sixteen BRGC lookup words, round-trip, cyclic one-bit transitions and sampled VCD. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, Bitwise XOR, logical shifts and integral widths — chưa đối chiếu LRM. Chưa đối chiếu với văn bản nguồn (chưa mở).