CRC-16/MODBUS theo byte: đa thức phản chiếu, LSB trước, khởi tạo 0xFFFF
Module cần viết: crc16_modbus · 6 case (2 mẫu) · giới hạn 4 s/case · ~30 phút
Modbus RTU, giao thức công nghiệp dùng trong PLC, đồng hồ điện và biến tần, kết thúc mỗi khung bằng CRC-16/MODBUS. Bài crc8 dùng CRC nối tiếp MSB trước; bài này nâng lên một byte mỗi nhịp và đổi sang dạng phản chiếu (reflected), nơi mọi thứ đi theo chiều ngược lại.
module crc16_modbus (
input logic clk,
input logic rst_n, // reset bất đồng bộ: crc = 16'hFFFF
input logic init, // đồng bộ: crc = 16'hFFFF ở cạnh lên (ưu tiên hơn valid)
input logic valid, // 1: nạp byte data ở cạnh lên này
input logic [7:0] data,
output logic [15:0] crc
);
Tham số CRC-16/MODBUS (theo danh mục CRC chuẩn):
| width | poly | init | refin | refout | xorout | check ("123456789") |
|---|---|---|---|---|---|---|
| 16 | 0x8005 | 0xFFFF | true | true | 0x0000 | 0x4B37 |
refin = true: mỗi byte được đưa vào bit 0 (LSB) trước.refout = true: kết quả được đảo bit trước khi xuất. Khi tính theo dạng dịch phải (xem gợi ý), phép đảo này đã nằm sẵn trong cách biểu diễn:crcchính là giá trị cuối cùng.
crc sau mỗi byte là CRC của mọi byte từ lần init/reset gần nhất. Testbench kiểm crc 1 ns sau mỗi cạnh lên.
Các case
- Sau reset và hai byte đầumẫu
- Giá trị kiểm chuẩn "123456789" = 0x4B37mẫu
Cùng 4 case ẩn kiểm các yêu cầu còn lại của đề. Case ẩn chỉ báo đúng/sai, không nói chi tiết: tự tìm chỗ sai từ đề, hoặc mở gợi ý.
Testbench có mô hình tham chiếu riêng, độc lập với lời giải mẫu. Lời giải mẫu đã chạy qua mọi case trên simulator thật, và 4 bản lỗi mẫu đều bị ít nhất một case bắt. Case mẫu sai sẽ cho biết chỗ sai đầu tiên (giá trị mong đợi so với giá trị nhận được); case ẩn chỉ báo đúng/sai.