1 |
3 |
axuan25268 |
-------------------------------------------------------------------------------
|
2 |
|
|
-- Title :
|
3 |
|
|
-- Project :
|
4 |
|
|
-------------------------------------------------------------------------------
|
5 |
|
|
-- File : eth_crc32.vhd
|
6 |
|
|
-- Author : liyi <alxiuyain@foxmail.com>
|
7 |
|
|
-- Company : OE@HUST
|
8 |
|
|
-- Created : 2012-11-04
|
9 |
|
|
-- Last update: 2012-11-06
|
10 |
|
|
-- Platform :
|
11 |
|
|
-- Standard : VHDL'93/02
|
12 |
|
|
-------------------------------------------------------------------------------
|
13 |
|
|
-- Description:
|
14 |
|
|
-------------------------------------------------------------------------------
|
15 |
|
|
-- Copyright (c) 2012 OE@HUST
|
16 |
|
|
-------------------------------------------------------------------------------
|
17 |
|
|
-- Revisions :
|
18 |
|
|
-- Date Version Author Description
|
19 |
|
|
-- 2012-11-04 1.0 root Created
|
20 |
|
|
-- 经过测试没有问题!计算后输出到外面的crc值需要按照以太网的大小端模式发送才是正确的!
|
21 |
|
|
-------------------------------------------------------------------------------
|
22 |
|
|
LIBRARY ieee;
|
23 |
|
|
USE ieee.std_logic_1164.ALL;
|
24 |
|
|
-------------------------------------------------------------------------------
|
25 |
|
|
ENTITY eth_crc32 IS
|
26 |
|
|
|
27 |
|
|
PORT (
|
28 |
|
|
iClk : IN STD_LOGIC;
|
29 |
|
|
iRst_n : IN STD_LOGIC;
|
30 |
|
|
iInit : IN STD_LOGIC;
|
31 |
|
|
iCalcEn : IN STD_LOGIC;
|
32 |
|
|
iData : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
|
33 |
|
|
oCRC : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
|
34 |
|
|
oCRCErr : OUT STD_LOGIC);
|
35 |
|
|
|
36 |
|
|
END ENTITY eth_crc32;
|
37 |
|
|
-------------------------------------------------------------------------------
|
38 |
|
|
ARCHITECTURE rtl OF eth_crc32 IS
|
39 |
|
|
|
40 |
|
|
SIGNAL crc, nxtCrc : STD_LOGIC_VECTOR(31 DOWNTO 0);
|
41 |
|
|
|
42 |
|
|
BEGIN -- ARCHITECTURE rtl
|
43 |
|
|
|
44 |
|
|
nxtCrc(0) <= crc(24) XOR crc(30) XOR iData(1) XOR iData(7);
|
45 |
|
|
nxtCrc(1) <= crc(25) XOR crc(31) XOR iData(0) XOR iData(6) XOR crc(24) XOR crc(30) XOR iData(1) XOR iData(7);
|
46 |
|
|
nxtCrc(2) <= crc(26) XOR iData(5) XOR crc(25) XOR crc(31) XOR iData(0) XOR iData(6) XOR crc(24) XOR crc(30) XOR iData(1) XOR iData(7);
|
47 |
|
|
nxtCrc(3) <= crc(27) XOR iData(4) XOR crc(26) XOR iData(5) XOR crc(25) XOR crc(31) XOR iData(0) XOR iData(6);
|
48 |
|
|
nxtCrc(4) <= crc(28) XOR iData(3) XOR crc(27) XOR iData(4) XOR crc(26) XOR iData(5) XOR crc(24) XOR crc(30) XOR iData(1) XOR iData(7);
|
49 |
|
|
nxtCrc(5) <= crc(29) XOR iData(2) XOR crc(28) XOR iData(3) XOR crc(27) XOR iData(4) XOR crc(25) XOR crc(31) XOR iData(0) XOR iData(6) XOR crc(24) XOR crc(30) XOR iData(1) XOR iData(7);
|
50 |
|
|
nxtCrc(6) <= crc(30) XOR iData(1) XOR crc(29) XOR iData(2) XOR crc(28) XOR iData(3) XOR crc(26) XOR iData(5) XOR crc(25) XOR crc(31) XOR iData(0) XOR iData(6);
|
51 |
|
|
nxtCrc(7) <= crc(31) XOR iData(0) XOR crc(29) XOR iData(2) XOR crc(27) XOR iData(4) XOR crc(26) XOR iData(5) XOR crc(24) XOR iData(7);
|
52 |
|
|
nxtCrc(8) <= crc(0) XOR crc(28) XOR iData(3) XOR crc(27) XOR iData(4) XOR crc(25) XOR iData(6) XOR crc(24) XOR iData(7);
|
53 |
|
|
nxtCrc(9) <= crc(1) XOR crc(29) XOR iData(2) XOR crc(28) XOR iData(3) XOR crc(26) XOR iData(5) XOR crc(25) XOR iData(6);
|
54 |
|
|
nxtCrc(10) <= crc(2) XOR crc(29) XOR iData(2) XOR crc(27) XOR iData(4) XOR crc(26) XOR iData(5) XOR crc(24) XOR iData(7);
|
55 |
|
|
nxtCrc(11) <= crc(3) XOR crc(28) XOR iData(3) XOR crc(27) XOR iData(4) XOR crc(25) XOR iData(6) XOR crc(24) XOR iData(7);
|
56 |
|
|
nxtCrc(12) <= crc(4) XOR crc(29) XOR iData(2) XOR crc(28) XOR iData(3) XOR crc(26) XOR iData(5) XOR crc(25) XOR iData(6) XOR crc(24) XOR crc(30) XOR iData(1) XOR iData(7);
|
57 |
|
|
nxtCrc(13) <= crc(5) XOR crc(30) XOR iData(1) XOR crc(29) XOR iData(2) XOR crc(27) XOR iData(4) XOR crc(26) XOR iData(5) XOR crc(25) XOR crc(31) XOR iData(0) XOR iData(6);
|
58 |
|
|
nxtCrc(14) <= crc(6) XOR crc(31) XOR iData(0) XOR crc(30) XOR iData(1) XOR crc(28) XOR iData(3) XOR crc(27) XOR iData(4) XOR crc(26) XOR iData(5);
|
59 |
|
|
nxtCrc(15) <= crc(7) XOR crc(31) XOR iData(0) XOR crc(29) XOR iData(2) XOR crc(28) XOR iData(3) XOR crc(27) XOR iData(4);
|
60 |
|
|
nxtCrc(16) <= crc(8) XOR crc(29) XOR iData(2) XOR crc(28) XOR iData(3) XOR crc(24) XOR iData(7);
|
61 |
|
|
nxtCrc(17) <= crc(9) XOR crc(30) XOR iData(1) XOR crc(29) XOR iData(2) XOR crc(25) XOR iData(6);
|
62 |
|
|
nxtCrc(18) <= crc(10) XOR crc(31) XOR iData(0) XOR crc(30) XOR iData(1) XOR crc(26) XOR iData(5);
|
63 |
|
|
nxtCrc(19) <= crc(11) XOR crc(31) XOR iData(0) XOR crc(27) XOR iData(4);
|
64 |
|
|
nxtCrc(20) <= crc(12) XOR crc(28) XOR iData(3);
|
65 |
|
|
nxtCrc(21) <= crc(13) XOR crc(29) XOR iData(2);
|
66 |
|
|
nxtCrc(22) <= crc(14) XOR crc(24) XOR iData(7);
|
67 |
|
|
nxtCrc(23) <= crc(15) XOR crc(25) XOR iData(6) XOR crc(24) XOR crc(30) XOR iData(1) XOR iData(7);
|
68 |
|
|
nxtCrc(24) <= crc(16) XOR crc(26) XOR iData(5) XOR crc(25) XOR crc(31) XOR iData(0) XOR iData(6);
|
69 |
|
|
nxtCrc(25) <= crc(17) XOR crc(27) XOR iData(4) XOR crc(26) XOR iData(5);
|
70 |
|
|
nxtCrc(26) <= crc(18) XOR crc(28) XOR iData(3) XOR crc(27) XOR iData(4) XOR crc(24) XOR crc(30) XOR iData(1) XOR iData(7);
|
71 |
|
|
nxtCrc(27) <= crc(19) XOR crc(29) XOR iData(2) XOR crc(28) XOR iData(3) XOR crc(25) XOR crc(31) XOR iData(0) XOR iData(6);
|
72 |
|
|
nxtCrc(28) <= crc(20) XOR crc(30) XOR iData(1) XOR crc(29) XOR iData(2) XOR crc(26) XOR iData(5);
|
73 |
|
|
nxtCrc(29) <= crc(21) XOR crc(31) XOR iData(0) XOR crc(30) XOR iData(1) XOR crc(27) XOR iData(4);
|
74 |
|
|
nxtCrc(30) <= crc(22) XOR crc(31) XOR iData(0) XOR crc(28) XOR iData(3);
|
75 |
|
|
nxtCrc(31) <= crc(23) XOR crc(29) XOR iData(2);
|
76 |
|
|
|
77 |
|
|
PROCESS (iClk,iRst_n) IS
|
78 |
|
|
BEGIN
|
79 |
|
|
IF iRst_n = '0' THEN
|
80 |
|
|
crc <= (OTHERS => '0');
|
81 |
|
|
ELSIF rising_edge(iClk) THEN
|
82 |
|
|
IF iInit = '1' THEN
|
83 |
|
|
crc <= (OTHERS => '1');
|
84 |
|
|
ELSIF iCalcEn = '1' THEN
|
85 |
|
|
crc <= nxtCrc;
|
86 |
|
|
END IF;
|
87 |
|
|
END IF;
|
88 |
|
|
END PROCESS;
|
89 |
|
|
|
90 |
|
|
oCRC(31 DOWNTO 24) <= NOT (crc(24)&crc(25)&crc(26)&crc(27)&crc(28)&crc(29)&crc(30)&crc(31));
|
91 |
|
|
oCRC(23 DOWNTO 16) <= NOT (crc(16)&crc(17)&crc(18)&crc(19)&crc(20)&crc(21)&crc(22)&crc(23));
|
92 |
|
|
oCRC(15 DOWNTO 8) <= NOT (crc(8)&crc(9)&crc(10)&crc(11)&crc(12)&crc(13)&crc(14)&crc(15));
|
93 |
|
|
oCRC(7 DOWNTO 0) <= NOT (crc(0)&crc(1)&crc(2)&crc(3)&crc(4)&crc(5)&crc(6)&crc(7));
|
94 |
|
|
|
95 |
|
|
oCRCErr <= '1' WHEN crc /= X"c704dd7b" ELSE '0'; -- CRC not equal to magic number
|
96 |
|
|
|
97 |
|
|
END ARCHITECTURE rtl;
|
98 |
|
|
|