1 | -- ########################################################################
|
2 | -- CRC Engine RTL Design
|
3 | -- Copyright (C) www.ElectronicDesignworks.com
|
4 | -- Source code generated by ElectronicDesignworks IP Generator (CRC).
|
5 | -- Documentation can be downloaded from www.ElectronicDesignworks.com
|
6 | -- ********************************
|
7 | -- License
|
8 | -- ********************************
|
9 | -- This source file may be used and distributed freely provided that this
|
10 | -- copyright notice, list of conditions and the following disclaimer is
|
11 | -- not removed from the file.
|
12 | -- Any derivative work should contain this copyright notice and associated disclaimer.
|
13 | -- This source code file is provided "AS IS" AND WITHOUT ANY WARRANTY,
|
14 | -- without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
15 | -- PARTICULAR PURPOSE.
|
16 | -- ********************************
|
17 | -- Specification
|
18 | -- ********************************
|
19 | -- File Name : CRC32_DATA16.vhd
|
20 | -- Description : CRC Engine ENTITY
|
21 | -- Clock : Positive Edge
|
22 | -- Reset : Active Low
|
23 | -- First Serial : LSB
|
24 | -- Data Bus Width : 16 bits
|
25 | -- Polynomial : (0 1 2 4 5 7 8 10 11 12 16 22 23 26 32)
|
26 | -- Date : 11-Apr-2011
|
27 | -- Version : 1.0
|
28 | -- ########################################################################
|
29 |
|
30 | LIBRARY IEEE ;
|
31 | USE ieee.std_logic_1164.all ;
|
32 | USE ieee.std_logic_arith.all ;
|
33 | USE ieee.std_logic_unsigned.all ;
|
34 |
|
35 | ENTITY crc_gen IS
|
36 | PORT(
|
37 | clock : IN STD_LOGIC;
|
38 | reset : IN STD_LOGIC;
|
39 | soc : IN STD_LOGIC;
|
40 | data : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
|
41 | data_valid : IN STD_LOGIC;
|
42 | eoc : IN STD_LOGIC;
|
43 | crc : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
|
44 | crc_valid : OUT STD_LOGIC
|
45 | );
|
46 | END crc_gen;
|
47 |
|
48 | ARCHITECTURE behave OF crc_gen IS
|
49 |
|
50 | SIGNAL crc_r : STD_LOGIC_VECTOR(31 DOWNTO 0);
|
51 | SIGNAL crc_c : STD_LOGIC_VECTOR(31 DOWNTO 0);
|
52 | SIGNAL crc_i : STD_LOGIC_VECTOR(31 DOWNTO 0);
|
53 | SIGNAL crc_const : STD_LOGIC_VECTOR(31 DOWNTO 0) := "11111111111111111111111111111111";
|
54 |
|
55 | BEGIN
|
56 |
|
57 |
|
58 | crc_i <= crc_const when soc = '1' else
|
59 | crc_r;
|
60 |
|
61 | crc_c(0) <= data(15) XOR data(9) XOR data(6) XOR data(5) XOR crc_i(16) XOR crc_i(26) XOR crc_i(25) XOR data(3) XOR crc_i(22) XOR crc_i(28);
|
62 | crc_c(1) <= data(15) XOR data(14) XOR data(8) XOR data(4) XOR crc_i(17) XOR crc_i(27) XOR data(2) XOR crc_i(23) XOR crc_i(29) XOR data(9) XOR data(6) XOR crc_i(16) XOR crc_i(25) XOR data(3) XOR crc_i(22) XOR crc_i(28);
|
63 | crc_c(2) <= data(15) XOR data(14) XOR data(13) XOR data(7) XOR crc_i(18) XOR data(1) XOR crc_i(24) XOR crc_i(30) XOR data(8) XOR crc_i(17) XOR data(2) XOR crc_i(23) XOR crc_i(29) XOR data(9) XOR data(6) XOR crc_i(16) XOR crc_i(25) XOR crc_i(22);
|
64 | crc_c(3) <= data(14) XOR data(13) XOR data(12) XOR data(6) XOR crc_i(19) XOR data(0) XOR crc_i(25) XOR crc_i(31) XOR data(7) XOR crc_i(18) XOR data(1) XOR crc_i(24) XOR crc_i(30) XOR data(8) XOR data(5) XOR crc_i(17) XOR crc_i(26) XOR crc_i(23);
|
65 | crc_c(4) <= data(15) XOR data(13) XOR data(12) XOR data(11) XOR crc_i(20) XOR crc_i(19) XOR data(0) XOR crc_i(31) XOR data(7) XOR data(4) XOR crc_i(18) XOR crc_i(27) XOR crc_i(24) XOR data(9) XOR crc_i(16) XOR data(3) XOR crc_i(22) XOR crc_i(28);
|
66 | crc_c(5) <= data(15) XOR data(14) XOR data(12) XOR data(11) XOR data(10) XOR crc_i(21) XOR crc_i(20) XOR crc_i(19) XOR data(8) XOR crc_i(17) XOR data(2) XOR crc_i(23) XOR crc_i(29) XOR data(9) XOR data(5) XOR crc_i(16) XOR crc_i(26) XOR crc_i(22);
|
67 | crc_c(6) <= data(14) XOR data(13) XOR data(11) XOR data(10) XOR data(9) XOR crc_i(22) XOR crc_i(21) XOR crc_i(20) XOR data(7) XOR crc_i(18) XOR data(1) XOR crc_i(24) XOR crc_i(30) XOR data(8) XOR data(4) XOR crc_i(17) XOR crc_i(27) XOR crc_i(23);
|
68 | crc_c(7) <= data(15) XOR data(13) XOR data(12) XOR data(10) XOR data(8) XOR crc_i(23) XOR crc_i(21) XOR crc_i(19) XOR data(0) XOR crc_i(31) XOR data(7) XOR crc_i(18) XOR crc_i(24) XOR data(5) XOR crc_i(16) XOR crc_i(26);
|
69 | crc_c(8) <= data(15) XOR data(14) XOR data(12) XOR data(11) XOR data(7) XOR crc_i(24) XOR crc_i(20) XOR crc_i(19) XOR data(4) XOR crc_i(17) XOR crc_i(27) XOR data(5) XOR crc_i(16) XOR crc_i(26) XOR data(3) XOR crc_i(28);
|
70 | crc_c(9) <= data(14) XOR data(13) XOR data(11) XOR data(10) XOR data(6) XOR crc_i(25) XOR crc_i(21) XOR crc_i(20) XOR data(3) XOR crc_i(18) XOR crc_i(28) XOR data(4) XOR crc_i(17) XOR crc_i(27) XOR data(2) XOR crc_i(29);
|
71 | crc_c(10) <= data(15) XOR data(13) XOR data(12) XOR data(10) XOR crc_i(21) XOR data(2) XOR crc_i(19) XOR crc_i(29) XOR crc_i(18) XOR data(1) XOR crc_i(30) XOR data(6) XOR crc_i(16) XOR crc_i(25);
|
72 | crc_c(11) <= data(15) XOR data(14) XOR data(12) XOR data(11) XOR data(1) XOR crc_i(20) XOR crc_i(30) XOR crc_i(19) XOR data(0) XOR crc_i(31) XOR crc_i(17) XOR data(6) XOR crc_i(16) XOR crc_i(25) XOR data(3) XOR crc_i(28);
|
73 | crc_c(12) <= data(15) XOR data(14) XOR data(13) XOR data(11) XOR data(10) XOR data(0) XOR crc_i(21) XOR crc_i(31) XOR crc_i(20) XOR crc_i(18) XOR crc_i(17) XOR data(2) XOR crc_i(29) XOR data(9) XOR data(6) XOR crc_i(16) XOR crc_i(25) XOR data(3) XOR crc_i(22) XOR crc_i(28);
|
74 | crc_c(13) <= data(14) XOR data(13) XOR data(12) XOR data(10) XOR data(9) XOR crc_i(22) XOR crc_i(21) XOR crc_i(19) XOR crc_i(18) XOR data(1) XOR crc_i(30) XOR data(8) XOR data(5) XOR crc_i(17) XOR crc_i(26) XOR data(2) XOR crc_i(23) XOR crc_i(29);
|
75 | crc_c(14) <= data(13) XOR data(12) XOR data(11) XOR data(9) XOR data(8) XOR crc_i(23) XOR crc_i(22) XOR crc_i(20) XOR crc_i(19) XOR data(0) XOR crc_i(31) XOR data(7) XOR data(4) XOR crc_i(18) XOR crc_i(27) XOR data(1) XOR crc_i(24) XOR crc_i(30);
|
76 | crc_c(15) <= data(12) XOR data(11) XOR data(10) XOR data(8) XOR data(7) XOR crc_i(24) XOR crc_i(23) XOR crc_i(21) XOR crc_i(20) XOR data(6) XOR data(3) XOR crc_i(19) XOR crc_i(28) XOR data(0) XOR crc_i(25) XOR crc_i(31);
|
77 | crc_c(16) <= data(15) XOR data(11) XOR data(10) XOR data(7) XOR crc_i(0) XOR crc_i(24) XOR crc_i(21) XOR data(2) XOR crc_i(20) XOR crc_i(29) XOR crc_i(16) XOR data(3) XOR crc_i(28);
|
78 | crc_c(17) <= data(14) XOR data(10) XOR data(9) XOR data(6) XOR crc_i(1) XOR crc_i(25) XOR crc_i(22) XOR data(1) XOR crc_i(21) XOR crc_i(30) XOR crc_i(17) XOR data(2) XOR crc_i(29);
|
79 | crc_c(18) <= data(13) XOR data(9) XOR data(8) XOR data(5) XOR crc_i(2) XOR crc_i(26) XOR crc_i(23) XOR data(0) XOR crc_i(22) XOR crc_i(31) XOR crc_i(18) XOR data(1) XOR crc_i(30);
|
80 | crc_c(19) <= data(12) XOR data(8) XOR data(7) XOR data(4) XOR crc_i(3) XOR crc_i(27) XOR crc_i(24) XOR crc_i(23) XOR crc_i(19) XOR data(0) XOR crc_i(31);
|
81 | crc_c(20) <= data(11) XOR data(7) XOR data(6) XOR data(3) XOR crc_i(4) XOR crc_i(28) XOR crc_i(25) XOR crc_i(24) XOR crc_i(20);
|
82 | crc_c(21) <= data(10) XOR data(6) XOR data(5) XOR data(2) XOR crc_i(5) XOR crc_i(29) XOR crc_i(26) XOR crc_i(25) XOR crc_i(21);
|
83 | crc_c(22) <= data(15) XOR data(4) XOR data(1) XOR crc_i(6) XOR crc_i(30) XOR crc_i(27) XOR data(6) XOR crc_i(16) XOR crc_i(25) XOR data(3) XOR crc_i(28);
|
84 | crc_c(23) <= data(15) XOR data(14) XOR data(0) XOR crc_i(7) XOR crc_i(31) XOR crc_i(17) XOR data(2) XOR crc_i(29) XOR data(9) XOR data(6) XOR crc_i(16) XOR crc_i(25) XOR crc_i(22);
|
85 | crc_c(24) <= data(14) XOR data(13) XOR crc_i(8) XOR crc_i(18) XOR data(1) XOR crc_i(30) XOR data(8) XOR data(5) XOR crc_i(17) XOR crc_i(26) XOR crc_i(23);
|
86 | crc_c(25) <= data(13) XOR data(12) XOR crc_i(9) XOR crc_i(19) XOR data(0) XOR crc_i(31) XOR data(7) XOR data(4) XOR crc_i(18) XOR crc_i(27) XOR crc_i(24);
|
87 | crc_c(26) <= data(15) XOR data(12) XOR data(11) XOR crc_i(10) XOR crc_i(20) XOR crc_i(19) XOR data(9) XOR data(5) XOR crc_i(16) XOR crc_i(26) XOR crc_i(22);
|
88 | crc_c(27) <= data(14) XOR data(11) XOR data(10) XOR crc_i(11) XOR crc_i(21) XOR crc_i(20) XOR data(8) XOR data(4) XOR crc_i(17) XOR crc_i(27) XOR crc_i(23);
|
89 | crc_c(28) <= data(13) XOR data(10) XOR data(9) XOR crc_i(12) XOR crc_i(22) XOR crc_i(21) XOR data(7) XOR data(3) XOR crc_i(18) XOR crc_i(28) XOR crc_i(24);
|
90 | crc_c(29) <= data(12) XOR data(9) XOR data(8) XOR crc_i(13) XOR crc_i(23) XOR crc_i(22) XOR data(6) XOR data(2) XOR crc_i(19) XOR crc_i(29) XOR crc_i(25);
|
91 | crc_c(30) <= data(11) XOR data(8) XOR data(7) XOR crc_i(14) XOR crc_i(24) XOR crc_i(23) XOR data(5) XOR data(1) XOR crc_i(20) XOR crc_i(30) XOR crc_i(26);
|
92 | crc_c(31) <= data(10) XOR data(7) XOR data(6) XOR crc_i(15) XOR crc_i(25) XOR crc_i(24) XOR data(4) XOR data(0) XOR crc_i(21) XOR crc_i(31) XOR crc_i(27);
|
93 |
|
94 |
|
95 | crc_gen_process : PROCESS(clock, reset)
|
96 | BEGIN
|
97 | IF(reset = '0') THEN
|
98 | crc_r <= "11111111111111111111111111111111" ;
|
99 | ELSIF( clock 'EVENT AND clock = '1') THEN
|
100 | IF(data_valid = '1') THEN
|
101 | crc_r <= crc_c;
|
102 | END IF;
|
103 | END IF;
|
104 | END PROCESS crc_gen_process;
|
105 |
|
106 |
|
107 | crc_valid_gen : PROCESS(clock, reset)
|
108 | BEGIN
|
109 | IF(reset = '0') THEN
|
110 | crc_valid <= '0';
|
111 | ELSIF( clock 'EVENT AND clock = '1') THEN
|
112 | IF(data_valid = '1' AND eoc = '1') THEN
|
113 | crc_valid <= '1';
|
114 | ELSE
|
115 | crc_valid <= '0';
|
116 | END IF;
|
117 | END IF;
|
118 | END PROCESS crc_valid_gen;
|
119 |
|
120 | crc <= crc_r;
|
121 |
|
122 | END behave;
|