Serialización y deserialización de datos

0

Estoy tratando de desarrollar un enlace de datos en FPGA. El transmisor combina entrada de 8 canales a salida única. El Rx debe multiplexar la salida paralela de un solo canal a 8 bits. Actualmente el sistema es fuente síncrono. En el lado Rx, necesito encontrar el inicio de los datos, para el lado Tx, estoy enviando un cuadro de "11111111" después de cada 8 bits de serialización. En el lado de Rx estoy tratando de detectar este patrón, para que pueda comenzar la deserialización. El siguiente es mi código:

Lado Tx:

entity encoder is
port ( data_in : in std_logic_vector ( 7 downto 0);
        data_out_main: out std_logic;
        clk: in std_logic
        );
end encoder;

architecture Behavioral of encoder is

signal s : std_logic_vector( 3 downto 0) := "0000";
signal data_out: std_logic;


begin
 process (clk)
 begin

 if rising_edge(clk) then

    s <= s +1;
    end if;
end process;

process (clk,data_out)

begin

    if rising_edge (clk) then
        if (s = "0000") then data_out <= data_in(0);
        elsif (s = "0001") then data_out <= data_in(1);
        elsif (s = "0010") then data_out <= data_in(2);
        elsif (s = "0011") then data_out <= data_in(3);
        elsif (s = "0100") then data_out <= data_in(4);
        elsif (s = "0101") then data_out <= data_in(5);
        elsif (s = "0110") then data_out <= data_in(6);
        elsif (s = "0111") then data_out <= data_in(7);

        elsif (s = "1000") then data_out <= '1';
        elsif (s = "1001") then data_out <= '1';
        elsif (s = "1010") then data_out <= '1';
        elsif (s = "1011") then data_out <= '1';
        elsif (s = "1100") then data_out <= '1';
        elsif (s = "1101") then data_out <= '1';
        elsif (s = "1110") then data_out <= '1';
        elsif (s = "1111") then data_out <= '1';
        end if;
    end if;

    data_out_main <= data_out;
end process;

Rx lado:

entity decoder is
port ( data_in: in std_logic;
        data_out_d : out std_logic_vector( 7 downto 0);
        clk: in std_logic
        );
end decoder;

architecture Behavioral of decoder is



signal s_d : std_logic_vector ( 3 downto 0):="0000";

signal data_out,shift_regi : std_logic_vector( 7 downto 0):= "00000000";

type state2_type is (check2,get_data);

signal state2 : state2_type := check2;

signal convert : std_logic := '0';

signal cnt1 :integer := 0;

begin

process (clk)
begin
        if rising_edge (clk) then
        s_d<= s_d +1;
        end if;
end process;

    process(clk)
        begin



    if(rising_edge(clk))then

        shift_regi(7) <= shift_regi(6); 
        shift_regi(6) <= shift_regi(5);
        shift_regi(5) <= shift_regi(4);
        shift_regi(4) <= shift_regi(3);
        shift_regi(3) <= shift_regi(2);
        shift_regi(2) <= shift_regi(1);
        shift_regi(1) <= shift_regi(0);
        shift_regi(0) <= data_in;


case state2 is

when check2 =>
    if(shift_regi = "11111111")then
        state2 <= get_data;
        cnt1 <= 0;
    else
        state2 <= check2;
    end if;



when get_data =>
    if(cnt1 < 8) then
        data_out(cnt1) <= shift_regi(0);
        cnt1 <= cnt1 + 1;
        state2 <= get_data;                                             
    else
        cnt1 <= 0;
        state2 <= check2;       
end if;

    end case;



    end if;
    end process;
data_out_d <= data_out;
end Behavioral;

Después de muchos intentos, no puedo hacer que la simulación funcione correctamente para este código. ¿Alguien puede ayudarme en este sentido? Básicamente, estoy luchando con el encuadre y la definición de los datos. El registro de desplazamiento en el lado Rx está dando los datos correctos, pero no puedo desmarcarlos. Por favor, hágamelo saber si estoy confundido en algún momento. Saludos

    
pregunta Falcon98

0 respuestas

Lea otras preguntas en las etiquetas