如何制作具有可变输入数据大小的 CRC 生成器函数

问题描述 投票:0回答:1

我写了以下代码

FUNCTION table_CRC16
    (Data           : STD_LOGIC_VECTOR(63 DOWNTO 0);
     data_byte_num  : INTEGER)
RETURN STD_LOGIC_VECTOR IS

    TYPE table_array IS ARRAY (255 DOWNTO 0) OF STD_LOGIC_VECTOR (15 DOWNTO 0);
    VARIABLE CRCTable       : table_array;
    VARIABLE CRCWord        : STD_LOGIC_VECTOR (15 DOWNTO 0) := X"FFFF";
    VARIABLE nTemp          : STD_LOGIC_VECTOR (15 DOWNTO 0) := X"FFFF";
    VARIABLE data_byte_cnt  : INTEGER := data_byte_num;

BEGIN   
    CRCTable := (
    X"0000", X"C0C1", X"C181", X"0140", X"C301", X"03C0", X"0280", X"C241",
    X"C601", X"06C0", X"0780", X"C741", X"0500", X"C5C1", X"C481", X"0440",
    X"CC01", X"0CC0", X"0D80", X"CD41", X"0F00", X"CFC1", X"CE81", X"0E40",
    X"0A00", X"CAC1", X"CB81", X"0B40", X"C901", X"09C0", X"0880", X"C841",
    X"D801", X"18C0", X"1980", X"D941", X"1B00", X"DBC1", X"DA81", X"1A40",
    X"1E00", X"DEC1", X"DF81", X"1F40", X"DD01", X"1DC0", X"1C80", X"DC41",
    X"1400", X"D4C1", X"D581", X"1540", X"D701", X"17C0", X"1680", X"D641",
    X"D201", X"12C0", X"1380", X"D341", X"1100", X"D1C1", X"D081", X"1040",
    X"F001", X"30C0", X"3180", X"F141", X"3300", X"F3C1", X"F281", X"3240",
    X"3600", X"F6C1", X"F781", X"3740", X"F501", X"35C0", X"3480", X"F441",
    X"3C00", X"FCC1", X"FD81", X"3D40", X"FF01", X"3FC0", X"3E80", X"FE41",
    X"FA01", X"3AC0", X"3B80", X"FB41", X"3900", X"F9C1", X"F881", X"3840",
    X"2800", X"E8C1", X"E981", X"2940", X"EB01", X"2BC0", X"2A80", X"EA41",
    X"EE01", X"2EC0", X"2F80", X"EF41", X"2D00", X"EDC1", X"EC81", X"2C40",
    X"E401", X"24C0", X"2580", X"E541", X"2700", X"E7C1", X"E681", X"2640",
    X"2200", X"E2C1", X"E381", X"2340", X"E101", X"21C0", X"2080", X"E041",
    X"A001", X"60C0", X"6180", X"A141", X"6300", X"A3C1", X"A281", X"6240",
    X"6600", X"A6C1", X"A781", X"6740", X"A501", X"65C0", X"6480", X"A441",
    X"6C00", X"ACC1", X"AD81", X"6D40", X"AF01", X"6FC0", X"6E80", X"AE41",
    X"AA01", X"6AC0", X"6B80", X"AB41", X"6900", X"A9C1", X"A881", X"6840",
    X"7800", X"B8C1", X"B981", X"7940", X"BB01", X"7BC0", X"7A80", X"BA41",
    X"BE01", X"7EC0", X"7F80", X"BF41", X"7D00", X"BDC1", X"BC81", X"7C40",
    X"B401", X"74C0", X"7580", X"B541", X"7700", X"B7C1", X"B681", X"7640",
    X"7200", X"B2C1", X"B381", X"7340", X"B101", X"71C0", X"7080", X"B041",
    X"5000", X"90C1", X"9181", X"5140", X"9301", X"53C0", X"5280", X"9241",
    X"9601", X"56C0", X"5780", X"9741", X"5500", X"95C1", X"9481", X"5440",
    X"9C01", X"5CC0", X"5D80", X"9D41", X"5F00", X"9FC1", X"9E81", X"5E40",
    X"5A00", X"9AC1", X"9B81", X"5B40", X"9901", X"59C0", X"5880", X"9841",
    X"8801", X"48C0", X"4980", X"8941", X"4B00", X"8BC1", X"8A81", X"4A40",
    X"4E00", X"8EC1", X"8F81", X"4F40", X"8D01", X"4DC0", X"4C80", X"8C41",
    X"4400", X"84C1", X"8581", X"4540", X"8701", X"47C0", X"4680", X"8641",
    X"8201", X"42C0", X"4380", X"8341", X"4100", X"81C1", X"8081", X"4040" );


    WHILE (data_byte_cnt > 0) LOOP
      nTemp := Data(8*data_byte_cnt - 1 DOWNTO 8*data_byte_cnt) AND CRCWord;
      CRCWord := to_stdlogicvector(to_bitvector(CRCWord) SRL 8);
      CRCWord := CRCWord AND CRCTable(to_integer(unsigned(nTemp) & X"FF"));
      data_byte_cnt := data_byte_cnt - 1;
    END LOOP;

RETURN CRCWord;
END table_CRC16;

我不知道是否有办法让它适用于不同的数据大小。 我有 8 种不同类型的数据(不同大小)要传递给 CRC 函数。我想我可以编写一个包含 8 个不同的复制/粘贴/修改函数的包,但这似乎是一个相当丑陋的方法。

不同的大小是指数据输入端口的位宽不同。

vhdl crc16
1个回答
0
投票

你有没有弄清楚这一点?我有兴趣查看/讨论解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.