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