
-- ########################################################################
-- Dekódování RDS zpráv obvodem FPGA
-- The RDS decoder on the FPGA
-- Diplomova prace 
-- Rok 2012/2013
-- Posledni zmena 07.12.2012
-- ########################################################################
                    
LIBRARY IEEE ;
USE ieee.std_logic_1164.all ;
USE ieee.std_logic_arith.all ;
USE ieee.std_logic_unsigned.all ;

ENTITY Detekce_skup IS 
   PORT(           
             clk_RDS    : IN  STD_LOGIC; 
             RDS        : IN  STD_LOGIC; 
				 data       : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
				 word_A     : OUT STD_LOGIC; 			
				 word_B     : OUT STD_LOGIC;
				 word_C     : OUT STD_LOGIC;
				 word_CC    : OUT STD_LOGIC;
				 word_D     : OUT STD_LOGIC				 
       );
END Detekce_skup; 

ARCHITECTURE behave OF Detekce_skup IS 

 SIGNAL crc_r          : STD_LOGIC_VECTOR(9 DOWNTO 0);
 SIGNAL crc_c          : STD_LOGIC_VECTOR(9 DOWNTO 0);
 SIGNAL c              : STD_LOGIC_VECTOR(9 DOWNTO 0);
 SIGNAL registr        : STD_LOGIC_VECTOR(27 DOWNTO 0) := "0000000000000000000000000000";
 SIGNAL d              : STD_LOGIC_VECTOR(15 DOWNTO 0);
 SIGNAL data_16        : STD_LOGIC_VECTOR(15 DOWNTO 0);
	  
BEGIN 

-- ######################################################################## 
-- vypocet noveho CRC z 16 bitoveho informacniho slova
 PROCESS (d) BEGIN
	c <= "0000000000"; 
	crc_c(0) <= d(15) xor d(14) xor d(13) xor d(12) xor d(11) xor d(6) xor d(5) xor d(4) xor d(3) xor d(2) xor d(0) xor c(0) xor c(5) xor c(6) xor c(7) xor c(8) xor c(9);
	crc_c(1) <= d(15) xor d(14) xor d(13) xor d(12) xor d(7) xor d(6) xor d(5) xor d(4) xor d(3) xor d(1) xor c(0) xor c(1) xor c(6) xor c(7) xor c(8) xor c(9);
	crc_c(2) <= d(15) xor d(14) xor d(13) xor d(8) xor d(7) xor d(6) xor d(5) xor d(4) xor d(2) xor c(0) xor c(1) xor c(2) xor c(7) xor c(8) xor c(9);
	crc_c(3) <= d(13) xor d(12) xor d(11) xor d(9) xor d(8) xor d(7) xor d(4) xor d(2) xor d(0) xor c(1) xor c(2) xor c(3) xor c(5) xor c(6) xor c(7);
	crc_c(4) <= d(15) xor d(11) xor d(10) xor d(9) xor d(8) xor d(6) xor d(4) xor d(2) xor d(1) xor d(0) xor c(0) xor c(2) xor c(3) xor c(4) xor c(5) xor c(9);
	crc_c(5) <= d(15) xor d(14) xor d(13) xor d(10) xor d(9) xor d(7) xor d(6) xor d(4) xor d(1) xor d(0) xor c(0) xor c(1) xor c(3) xor c(4) xor c(7) xor c(8) xor c(9);
	crc_c(6) <= d(15) xor d(14) xor d(11) xor d(10) xor d(8) xor d(7) xor d(5) xor d(2) xor d(1) xor c(1) xor c(2) xor c(4) xor c(5) xor c(8) xor c(9);
	crc_c(7) <= d(14) xor d(13) xor d(9) xor d(8) xor d(5) xor d(4) xor d(0) xor c(2) xor c(3) xor c(7) xor c(8);
	crc_c(8) <= d(13) xor d(12) xor d(11) xor d(10) xor d(9) xor d(4) xor d(3) xor d(2) xor d(1) xor d(0) xor c(3) xor c(4) xor c(5) xor c(6) xor c(7);
	crc_c(9) <= d(14) xor d(13) xor d(12) xor d(11) xor d(10) xor d(5) xor d(4) xor d(3) xor d(2) xor d(1) xor c(4) xor c(5) xor c(6) xor c(7) xor c(8);
 END PROCESS;
-- ######################################################################## 

-- ######################################################################## 
-- posuvny registr + vypocet vysledneho CRC
 PROCESS (clk_RDS) BEGIN
	IF( clk_RDS 'EVENT AND clk_RDS = '1') THEN 
		-- posuvny registr
		d <= registr (25 downto 10);
		registr (27 downto 0)   <= registr (26 downto 0) & RDS;
		-- vypoctene CRC xor vysilane CRC 
		crc_r <= crc_c xor registr (10 downto 1);
		-- CRC na vystup
		data_16 <= registr (26 downto 11);
	END IF;
 END PROCESS;
-- ######################################################################## 

-- ######################################################################## 
-- nalezeni offsetoveho slova a zapis na vystup
 PROCESS (crc_c, clk_RDS) BEGIN
	IF( clk_RDS 'EVENT AND clk_RDS = '1') THEN 
		
		CASE crc_r IS
			WHEN  "0011111100"  => word_A <= '1'; word_B <= '0'; word_C <= '0'; word_CC <= '0'; word_D <= '0';
									     data <= data_16;
									  
			WHEN  "0110011000"  => word_A <= '0'; word_B <= '1'; word_C <= '0'; word_CC <= '0'; word_D <= '0';
									     data <= data_16;
										  
			WHEN  "0101101000"  => word_A <= '0'; word_B <= '0'; word_C <= '1'; word_CC <= '0'; word_D <= '0';
									     data <= data_16;
									  
			WHEN  "1101010000"  => word_A <= '0'; word_B <= '0'; word_C <= '0'; word_CC <= '1'; word_D <= '0';
									     data <= data_16;
									  
			WHEN  "0110110100"  => word_A <= '0'; word_B <= '0'; word_C <= '0'; word_CC <= '0'; word_D <= '1';
									     data <= data_16;
									  
			WHEN OTHERS =>  	 	  word_A <= '0'; word_B <= '0'; word_C <= '0'; word_CC <= '0'; word_D <= '0';
										  data <= X"0000";
		END CASE;
	
	END IF;
 END PROCESS;
-- ######################################################################## 


END behave;
                      





 



