Vừa

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

crcreflectedprotocolbit-ordertrap

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: crc chí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

  1. Sau reset và hai byte đầumẫu
  2. 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.

Đang kết nối máy chấm…
Đang nạp bản nháp…

Tab để thụt lề. Nhấn Esc rồi Tab để rời trình soạn. Bản nháp tự lưu trong trình duyệt.

Gợi ý

Mỗi gợi ý mở trước khi AC giảm 10% điểm của đề.

Lời giải và phân tích

Lịch sử nộp bài

Chưa có lượt nào.

Độ khó: Vừa. Điểm gốc 40.