---------------------------------------------------------------------------- -- icsp.vhd -- ICSP Low Level Interface -- Version 1.0 -- -- Copyright (C) 2015 H.Poetzl -- -- This program is free software: you can redistribute it and/or -- modify it under the terms of the GNU General Public License -- as published by the Free Software Foundation, either version -- 2 of the License, or (at your option) any later version. ---------------------------------------------------------------------------- library IEEE; use IEEE.std_logic_1164.ALL; use IEEE.numeric_std.ALL; use work.vivado_pkg.ALL; -- Vivado Attributes entity crc is port ( clk : in std_logic; reset : in std_logic; -- sync reset -- data : in std_logic_vector(7 downto 0); enable : in std_logic; crc : out std_logic_vector(15 downto 0) ); end entity crc; architecture RTL of crc is signal reg : std_logic_vector(15 downto 0); signal reg_d : std_logic_vector(15 downto 0); signal ex : std_logic_vector(7 downto 0); begin crc <= reg; crc_proc : process (clk) begin if rising_edge(clk) then if reset then reg <= (others => '1'); else if enable then reg <= reg_d; end if; end if; end if; end process; /* ex <= reg(7 downto 0) xor data; reg_d(0) <= reg(8) xor ex(4) xor ex(0); reg_d(1) <= reg(9) xor ex(5) xor ex(1); reg_d(2) <= reg(10) xor ex(6) xor ex(2); reg_d(3) <= reg(11) xor ex(7) xor ex(3) xor ex(0); reg_d(4) <= reg(12) xor ex(1); reg_d(5) <= reg(13) xor ex(2); reg_d(6) <= reg(14) xor ex(3); reg_d(7) <= reg(15) xor ex(4) xor ex(0); reg_d(8) <= ex(5) xor ex(1) xor ex(0); reg_d(9) <= ex(6) xor ex(2) xor ex(1); reg_d(10) <= ex(7) xor ex(3) xor ex(2); reg_d(11) <= ex(3); reg_d(12) <= ex(4) xor ex(0); reg_d(13) <= ex(5) xor ex(1); reg_d(14) <= ex(6) xor ex(2); reg_d(15) <= ex(7) xor ex(3); */ -------------------------------------------------------------------- -- CRC-16 0x8005 x^16 + x^15 + x^2 + 1 -------------------------------------------------------------------- /* reg_d(0) <= reg(8) xor reg(9) xor reg(10) xor reg(11) xor reg(12) xor reg(13) xor reg(14) xor reg(15) xor data(0) xor data(1) xor data(2) xor data(3) xor data(4) xor data(5) xor data(6) xor data(7); reg_d(1) <= reg(9) xor reg(10) xor reg(11) xor reg(12) xor reg(13) xor reg(14) xor reg(15) xor data(1) xor data(2) xor data(3) xor data(4) xor data(5) xor data(6) xor data(7); reg_d(2) <= reg(8) xor reg(9) xor data(0) xor data(1); reg_d(3) <= reg(9) xor reg(10) xor data(1) xor data(2); reg_d(4) <= reg(10) xor reg(11) xor data(2) xor data(3); reg_d(5) <= reg(11) xor reg(12) xor data(3) xor data(4); reg_d(6) <= reg(12) xor reg(13) xor data(4) xor data(5); reg_d(7) <= reg(13) xor reg(14) xor data(5) xor data(6); reg_d(8) <= reg(0) xor reg(14) xor reg(15) xor data(6) xor data(7); reg_d(9) <= reg(1) xor reg(15) xor data(7); reg_d(10) <= reg(2); reg_d(11) <= reg(3); reg_d(12) <= reg(4); reg_d(13) <= reg(5); reg_d(14) <= reg(6); reg_d(15) <= reg(7) xor reg(8) xor reg(9) xor reg(10) xor reg(11) xor reg(12) xor reg(13) xor reg(14) xor reg(15) xor data(0) xor data(1) xor data(2) xor data(3) xor data(4) xor data(5) xor data(6) xor data(7); */ -------------------------------------------------------------------- -- CRC-CCITT 0x1021 x^16 + x^12 + x^5 + 1 -------------------------------------------------------------------- reg_d(0) <= reg(8) xor reg(12) xor data(0) xor data(4); reg_d(1) <= reg(9) xor reg(13) xor data(1) xor data(5); reg_d(2) <= reg(10) xor reg(14) xor data(2) xor data(6); reg_d(3) <= reg(11) xor reg(15) xor data(3) xor data(7); reg_d(4) <= reg(12) xor data(4); reg_d(5) <= reg(8) xor reg(12) xor reg(13) xor data(0) xor data(4) xor data(5); reg_d(6) <= reg(9) xor reg(13) xor reg(14) xor data(1) xor data(5) xor data(6); reg_d(7) <= reg(10) xor reg(14) xor reg(15) xor data(2) xor data(6) xor data(7); reg_d(8) <= reg(0) xor reg(11) xor reg(15) xor data(3) xor data(7); reg_d(9) <= reg(1) xor reg(12) xor data(4); reg_d(10) <= reg(2) xor reg(13) xor data(5); reg_d(11) <= reg(3) xor reg(14) xor data(6); reg_d(12) <= reg(4) xor reg(8) xor reg(12) xor reg(15) xor data(0) xor data(4) xor data(7); reg_d(13) <= reg(5) xor reg(9) xor reg(13) xor data(1) xor data(5); reg_d(14) <= reg(6) xor reg(10) xor reg(14) xor data(2) xor data(6); reg_d(15) <= reg(7) xor reg(11) xor reg(15) xor data(3) xor data(7); end RTL;