⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crc_checker_rtl.vhd

📁 VHDL cyclic redundancy check generator und receiver
💻 VHD
字号:
--------------------------------------------------------------------------------
-- Description : This is a crc checker design unit for testpurposes only
--               crc-4: x^4 + x^3 + x^0 := 11001
-- References  : 
--------------------------------------------------------------------------------
-- Author      : Kurt Illmayer (IL) 
-- Department  : Bulme Graz Goesting 
-- Created     : 
-- Last update : 2005/06/29
-- Language    : vhdl '87 
--------------------------------------------------------------------------------
-- Revisions   : 
-- Date         Version   Author   Description 
-- 
--------------------------------------------------------------------------------

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;

entity crc_checker is
 port(-- System clock
      clock_i        : in  std_ulogic;
      -- active low reset
      reset_ni       : in  std_ulogic;
      -- enable_i input signal 
      enable_i       : in  std_ulogic;
      -- input data (8 bit data) and remainder
      data_i         : in  std_ulogic_vector(11 downto 0); 
      -- output data with crc checksum
      crc_ok_o       : out std_ulogic);
end crc_checker;

architecture rtl of crc_checker is

 signal	data_calc     : std_ulogic_vector(5 downto 0);
 
 signal	data_crc      : std_ulogic_vector(11 downto 0);
          -- x^4 + x^3 + x^0 := 11001
 constant crc_polynom : std_ulogic_vector(4 downto 0):="11001";

 -- statemachine definitions 
 type states is (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9); 
 -- state signal 
 signal state : states; 
 
begin

  crc_p: process (clock_i, reset_ni)
	
  begin

    if (reset_ni = '0') then

      data_crc(11 downto 0) <= (others=>'0');      

      data_calc(5 downto 0) <= (others=>'0');

      crc_ok_o              <= '0';
      
      state                 <= S0;
      
    elsif (clock_i'event and clock_i ='1') then

       case state is

	 when  S0 => if(enable_i = '1') then
			 
	                data_calc(5 downto 1) <= data_i(11 downto 7);

	                data_crc(11 downto 0) <= data_i(11 downto 0);

			crc_ok_o              <= '0';
			
 		        state                 <= S1;
			
                     else

 		        state                 <= S0;
			
		     end if;
			
         when S1 =>  if (data_calc(5) = '1') then

			data_calc(5 downto 0) <= (data_crc(11 downto 7) xor crc_polynom(4 downto 0)) & data_crc(6);
			
 		        state                 <= S2;

		     else
			 
			data_calc(0)          <= data_crc(6);
			
 		        state                 <= S2;
			
                     end if;
			
	 when S2 =>  if (data_calc(4) = '1') then

	         	data_calc(5 downto 0) <= (data_calc(4 downto 0) xor crc_polynom(4 downto 0)) &  data_crc(5);
			
 		        state                 <= S3;
			
                     else

	    	        data_calc(5 downto 0) <= data_calc(4 downto 0) & data_crc(5);

 		        state                 <= S3;
			
                     end if;

	 when S3 =>  if (data_calc(4) = '1') then

	         	data_calc(5 downto 0) <= (data_calc(4 downto 0) xor crc_polynom(4 downto 0)) &  data_crc(4);
			
 		        state                 <= S4;
			
                     else

	    	        data_calc(5 downto 0) <= data_calc(4 downto 0) & data_crc(4);

 		        state                 <= S4;
			
                     end if;

	 when S4 =>  if (data_calc(4) = '1') then

	         	data_calc(5 downto 0) <= (data_calc(4 downto 0) xor crc_polynom(4 downto 0)) &  data_crc(3);
			
 		        state                 <= S5;
			
                     else

	    	        data_calc(5 downto 0) <= data_calc(4 downto 0) & data_crc(3);

 		        state                 <= S5;
			
                     end if;

	 when S5 =>  if (data_calc(4) = '1') then

	         	data_calc(5 downto 0) <= (data_calc(4 downto 0) xor crc_polynom(4 downto 0)) &  data_crc(2);
			
 		        state                 <= S6;
			
                     else

	    	        data_calc(5 downto 0) <= data_calc(4 downto 0) & data_crc(2);

 		        state                 <= S6;
			
                     end if;

	 when S6 =>  if (data_calc(4) = '1') then

	         	data_calc(5 downto 0) <= (data_calc(4 downto 0) xor crc_polynom(4 downto 0)) &  data_crc(1);
			
 		        state                 <= S7;
			
                     else

	    	        data_calc(5 downto 0) <= data_calc(4 downto 0) & data_crc(1);

 		        state                 <= S7;
			
                     end if;

	 when S7 =>  if (data_calc(4) = '1') then

	         	data_calc(5 downto 0) <= (data_calc(4 downto 0) xor crc_polynom(4 downto 0)) &  data_crc(0);
			
 		        state                 <= S8;
			
                     else

	    	        data_calc(5 downto 0) <= data_calc(4 downto 0) & data_crc(0);

 		        state                 <= S8;
			
                     end if;		     

	 when S8 =>  if (data_calc(4) = '1') then

	         	data_calc(4 downto 0) <= (data_calc(4 downto 0) xor crc_polynom(4 downto 0));

 		        state                 <= S9;
			      
		     else

   	                state      <= S9;
		       
		     end if;
		     
	 when S9   =>--   data_calc(5 downto 0)  	-- rest bzw. residue bzw. remainder
		     if(data_calc(5 downto 0) = "000000") then

		        crc_ok_o   <= '1';

 		        state      <= S0;
		       
		     else

		        crc_ok_o   <= '0';

   		        state      <= S0;
		       
		    end if;
		     
	 when others => null;

       end case;

    end if;
       
  end process crc_p;

end rtl;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -