-- ######################################################################## -- CRC Engine RTL Design -- Copyright (C) www.ElectronicDesignworks.com -- Source code generated by ElectronicDesignworks IP Generator (CRC). -- Documentation can be downloaded from www.ElectronicDesignworks.com -- ******************************** -- License -- ******************************** -- This source file may be used and distributed freely provided that this -- copyright notice, list of conditions and the following disclaimer is -- not removed from the file. -- Any derivative work should contain this copyright notice and associated disclaimer. -- This source code file is provided "AS IS" AND WITHOUT ANY WARRANTY, -- without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -- PARTICULAR PURPOSE. -- ******************************** -- Specification -- ******************************** -- File Name : CRC16_DATA32.vhd -- Description : CRC Engine ENTITY -- Clock : Positive Edge -- Reset : Active High -- First Serial : MSB -- Data Bus Width : 32 bits -- Polynomial : (0 2 15 16) -- Date : 27-Feb-2012 -- Version : 1.0 -- ######################################################################## LIBRARY IEEE ; USE ieee.std_logic_1164.all ; USE ieee.std_logic_arith.all ; USE ieee.std_logic_unsigned.all ; ENTITY crc_gen_usb_32to16 IS PORT( clock : IN STD_LOGIC; reset : IN STD_LOGIC; --soc : IN STD_LOGIC; data : IN STD_LOGIC_VECTOR(31 DOWNTO 0); data_valid : IN STD_LOGIC; eoc : IN STD_LOGIC; crc : OUT STD_LOGIC_VECTOR(15 DOWNTO 0); crc_valid : OUT STD_LOGIC ); END crc_gen_usb_32to16; ARCHITECTURE behave OF crc_gen_usb_32to16 IS SIGNAL crc_r : STD_LOGIC_VECTOR(15 DOWNTO 0); SIGNAL crc_c : STD_LOGIC_VECTOR(15 DOWNTO 0); SIGNAL crc_i : STD_LOGIC_VECTOR(15 DOWNTO 0); SIGNAL crc_const : STD_LOGIC_VECTOR(15 DOWNTO 0) := "0000000000000000"; BEGIN crc_i <= --crc_const when soc = '1' else crc_r; crc_c(0) <= data(0) XOR data(1) XOR data(15) XOR data(30) XOR crc_i(14) XOR data(2) XOR data(16) XOR crc_i(0) XOR data(31) XOR crc_i(15) XOR data(3) XOR data(17) XOR crc_i(1) XOR data(4) XOR data(18) XOR crc_i(2) XOR data(5) XOR data(19) XOR crc_i(3) XOR data(6) XOR data(20) XOR crc_i(4) XOR data(7) XOR data(21) XOR crc_i(5) XOR data(8) XOR data(22) XOR crc_i(6) XOR data(9) XOR data(23) XOR crc_i(7) XOR data(10) XOR data(24) XOR crc_i(8) XOR data(11) XOR data(25) XOR crc_i(9) XOR data(12) XOR data(26) XOR crc_i(10) XOR data(13) XOR data(27) XOR crc_i(11); crc_c(1) <= data(1) XOR data(2) XOR data(16) XOR crc_i(0) XOR data(31) XOR crc_i(15) XOR data(3) XOR data(17) XOR crc_i(1) XOR data(4) XOR data(18) XOR crc_i(2) XOR data(5) XOR data(19) XOR crc_i(3) XOR data(6) XOR data(20) XOR crc_i(4) XOR data(7) XOR data(21) XOR crc_i(5) XOR data(8) XOR data(22) XOR crc_i(6) XOR data(9) XOR data(23) XOR crc_i(7) XOR data(10) XOR data(24) XOR crc_i(8) XOR data(11) XOR data(25) XOR crc_i(9) XOR data(12) XOR data(26) XOR crc_i(10) XOR data(13) XOR data(27) XOR crc_i(11) XOR data(14) XOR data(28) XOR crc_i(12); crc_c(2) <= data(0) XOR data(14) XOR data(28) XOR crc_i(12) XOR data(29) XOR crc_i(13) XOR data(1) XOR data(30) XOR crc_i(14) XOR data(16) XOR crc_i(0) XOR data(31) XOR crc_i(15); crc_c(3) <= data(1) XOR data(15) XOR data(29) XOR crc_i(13) XOR data(30) XOR crc_i(14) XOR data(2) XOR data(31) XOR crc_i(15) XOR data(17) XOR crc_i(1); crc_c(4) <= data(2) XOR data(16) XOR data(30) XOR crc_i(14) XOR crc_i(0) XOR data(31) XOR crc_i(15) XOR data(3) XOR data(18) XOR crc_i(2); crc_c(5) <= data(3) XOR data(17) XOR data(31) XOR crc_i(15) XOR crc_i(1) XOR data(4) XOR data(19) XOR crc_i(3); crc_c(6) <= data(4) XOR data(18) XOR crc_i(2) XOR data(5) XOR data(20) XOR crc_i(4); crc_c(7) <= data(5) XOR data(19) XOR crc_i(3) XOR data(6) XOR data(21) XOR crc_i(5); crc_c(8) <= data(6) XOR data(20) XOR crc_i(4) XOR data(7) XOR data(22) XOR crc_i(6); crc_c(9) <= data(7) XOR data(21) XOR crc_i(5) XOR data(8) XOR data(23) XOR crc_i(7); crc_c(10) <= data(8) XOR data(22) XOR crc_i(6) XOR data(9) XOR data(24) XOR crc_i(8); crc_c(11) <= data(9) XOR data(23) XOR crc_i(7) XOR data(10) XOR data(25) XOR crc_i(9); crc_c(12) <= data(10) XOR data(24) XOR crc_i(8) XOR data(11) XOR data(26) XOR crc_i(10); crc_c(13) <= data(11) XOR data(25) XOR crc_i(9) XOR data(12) XOR data(27) XOR crc_i(11); crc_c(14) <= data(12) XOR data(26) XOR crc_i(10) XOR data(13) XOR data(28) XOR crc_i(12); crc_c(15) <= data(0) XOR data(14) XOR data(29) XOR crc_i(13) XOR data(1) XOR data(15) XOR data(30) XOR crc_i(14) XOR data(2) XOR data(16) XOR crc_i(0) XOR data(31) XOR crc_i(15) XOR data(3) XOR data(17) XOR crc_i(1) XOR data(4) XOR data(18) XOR crc_i(2) XOR data(5) XOR data(19) XOR crc_i(3) XOR data(6) XOR data(20) XOR crc_i(4) XOR data(7) XOR data(21) XOR crc_i(5) XOR data(8) XOR data(22) XOR crc_i(6) XOR data(9) XOR data(23) XOR crc_i(7) XOR data(10) XOR data(24) XOR crc_i(8) XOR data(11) XOR data(25) XOR crc_i(9) XOR data(12) XOR data(26) XOR crc_i(10); crc_gen_process : PROCESS(clock, reset) BEGIN IF(reset = '1') THEN crc_r <= "0000000000000000" ; ELSIF rising_edge(clock) THEN IF(data_valid = '1') THEN crc_r <= crc_c; END IF; END IF; END PROCESS crc_gen_process; crc_valid_gen : PROCESS(clock, reset) BEGIN If(reset = '1') THEN crc_valid <= '0'; ELSIF rising_edge(clock) THEN IF(data_valid = '1' AND eoc = '1') THEN crc_valid <= '1'; ELSE crc_valid <= '0'; END IF; END IF; END PROCESS crc_valid_gen; crc <= crc_r; END behave;