entity trb_net_med_13bit_slow is
generic(
- TRANSMISSION_CLOCK_DIVIDER: integer := 1
+ TRANSMISSION_CLOCK_DIVIDER: integer range 2 to 62 := 2 --even values only!
);
signal INT2MED_state, next_INT2MED_state : std_logic_vector (3 downto 0);
signal MED2INT_state, next_MED2INT_state: std_logic_vector(3 downto 0);
- signal DAT_MED2INT, next_DAT_MED2INT :std_logic_vector(64 downto 0);
- signal buf_INT_DATA_IN, next_buf_INT_DATA_IN :std_logic_vector(55 downto 13);
+ signal DAT_MED2INT, next_DAT_MED2INT :std_logic_vector(51 downto 0);
+ signal buf_INT_DATA_IN, next_buf_INT_DATA_IN :std_logic_vector(55 downto 0);
signal next_INT_DATA_OUT, buf_INT_DATA_OUT: std_logic_vector(55 downto 0);
signal next_buf_MED_DATA_OUT, buf_MED_DATA_OUT: std_logic_vector(12 downto 0);
signal last_TRCLK, this_TRCLK: std_logic;
signal CLK_counter,next_CLK_counter: std_logic_vector(7 downto 0);
- signal packets_in_counter, next_packets_in_counter: std_logic_vector(3 downto 0);
+ signal packets_in_counter, next_packets_in_counter: std_logic_vector(7 downto 0);
+ signal packets_in_compl_counter, next_packets_in_compl_counter: std_logic_vector(3 downto 0);
signal packets_out_counter, next_packets_out_counter: std_logic_vector(3 downto 0);
+
+ signal last_MED_TRANSMISSION_CLK_IN, next_last_MED_TRANSMISSION_CLK_IN : std_logic;
+ signal reg_MED_DATA_IN : std_logic_vector(12 downto 0);
+ signal reg_MED_TRANSMISSION_CLK_IN, reg_MED_CARRIER_IN : std_logic;
+ signal reg_MED_PARITY_IN : std_logic;
+
begin
INT_DATAREADY_OUT <= buf_INT_DATAREADY_OUT;
end if;
next_STAT(11 downto 8) <= INT2MED_state;
next_STAT(15 downto 12) <= MED2INT_state;
- next_STAT(31 downto 28) <= packets_in_counter;
- next_STAT(27 downto 24) <= packets_out_counter;
+ next_STAT(16) <= media_not_connected;
+ next_STAT(31 downto 24) <= packets_in_counter;
+ --next_STAT(27 downto 24) <= packets_in_compl_counter;
if buf_INT_DATAREADY_OUT = '1' then
next_STAT(24 downto 16) <= RECV_STAT(8 downto 0);
else
buf_CTRL <= (others => '0');
elsif rising_edge(CLK) then
buf_CTRL <= CTRL;
- buf_CTRL(31 downto 28) <= packets_in_counter;
- buf_CTRL(27 downto 24) <= packets_out_counter;
+ buf_CTRL(31 downto 24) <= packets_in_counter;
+ --buf_CTRL(27 downto 24) <= packets_in_compl_counter;
else
buf_CTRL <= buf_CTRL;
end if;
--Transmission clock generator
--------------------------------
-trans_clk_counter: process (transmission_clk_Counter,TRANSMISSION_CLK)
+trans_clk_counter: process (transmission_clk_Counter, buf_MED_TRANSMISSION_CLK_OUT)
begin
- if transmission_clk_Counter = TRANSMISSION_CLOCK_DIVIDER - 1 then
+ if transmission_clk_Counter = (TRANSMISSION_CLOCK_DIVIDER/2) - 1 then
next_transmission_clk_Counter <= (others => '0');
- next_TRANSMISSION_CLK <= not TRANSMISSION_CLK;
+ next_TRANSMISSION_CLK <= not buf_MED_TRANSMISSION_CLK_OUT;
else
next_transmission_clk_Counter <= transmission_clk_Counter + 1;
- next_TRANSMISSION_CLK <= TRANSMISSION_CLK;
+ next_TRANSMISSION_CLK <= buf_MED_TRANSMISSION_CLK_OUT;
end if;
end process;
begin
if RESET = '1' then
transmission_clk_Counter <= (others => '0');
- TRANSMISSION_CLK <= '0';
+ buf_MED_TRANSMISSION_CLK_OUT <= '0';
elsif rising_edge(CLK) then
transmission_clk_Counter <= next_transmission_clk_Counter;
- TRANSMISSION_CLK <= next_TRANSMISSION_CLK;
+ buf_MED_TRANSMISSION_CLK_OUT <= next_TRANSMISSION_CLK;
else
transmission_clk_Counter <= transmission_clk_Counter;
- TRANSMISSION_CLK <= TRANSMISSION_CLK;
+ buf_MED_TRANSMISSION_CLK_OUT <= buf_MED_TRANSMISSION_CLK_OUT;
end if;
end process;
--INT to MED direction
--------------------------------
INT2MED_fsm: process(buf_INT_DATA_IN,INT2MED_state,
- INT_DATAREADY_IN, INT_DATA_IN,
- TRANSMISSION_CLK, buf_MED_DATA_OUT,
+ INT_DATAREADY_IN, INT_DATA_IN, buf_INT_READ_OUT,
+ next_TRANSMISSION_CLK, buf_MED_TRANSMISSION_CLK_OUT, buf_MED_DATA_OUT,
buf_MED_CARRIER_OUT, buf_MED_PARITY_OUT, buf_CTRL)
begin
next_INT2MED_state <= "0000";
next_MED_CARRIER_OUT <= buf_MED_CARRIER_OUT;
next_MED_PARITY_OUT <= buf_MED_PARITY_OUT;
next_buf_INT_DATA_IN <= buf_INT_DATA_IN;
- next_buf_INT_READ_OUT <= '0';
- next_MED_TRANSMISSION_CLK_OUT <= TRANSMISSION_CLK;
+ next_buf_INT_READ_OUT <= buf_INT_READ_OUT;
+
next_packets_out_counter <= packets_out_counter;
case INT2MED_state is
when "0000" =>
- if INT_DATAREADY_IN = '1' and TRANSMISSION_CLK = '0' then
+ if INT_DATAREADY_IN = '1' and buf_INT_READ_OUT = '1' then
--generate data word to transmit
- next_buf_INT_DATA_IN(55 downto 13) <= INT_DATA_IN(55 downto 13);
+ next_buf_INT_DATA_IN(55 downto 0) <= INT_DATA_IN(55 downto 0);
next_INT2MED_state <= "0001";
- next_buf_INT_READ_OUT <= '1';
- next_buf_MED_DATA_OUT(12 downto 0) <= INT_DATA_IN(12 downto 0);
- next_MED_CARRIER_OUT <= '1';
- next_MED_PARITY_OUT <= '1';
+ next_buf_INT_READ_OUT <= '0';
next_packets_out_counter <= packets_out_counter + 1;
- else
- if TRANSMISSION_CLK = '0' then
- next_MED_CARRIER_OUT <= '0';
- next_buf_MED_DATA_OUT(12 downto 0) <= (others => '0');
- next_MED_PARITY_OUT <= '0';
- end if;
+ else
+ next_buf_INT_READ_OUT <= '1';
+ next_MED_CARRIER_OUT <= '0';
+ next_MED_PARITY_OUT <= '0';
end if;
when "0001" =>
- if TRANSMISSION_CLK = '1' then
+ if next_TRANSMISSION_CLK = '0' and buf_MED_TRANSMISSION_CLK_OUT = '1' then
+ next_buf_MED_DATA_OUT(12 downto 0) <= buf_INT_DATA_IN(12 downto 0);
+ next_MED_CARRIER_OUT <= '1';
+ next_MED_PARITY_OUT <= '1';
next_INT2MED_state <= "0010";
else
next_INT2MED_state <= "0001";
end if;
when "0010" =>
- if TRANSMISSION_CLK = '0' then
+ if next_TRANSMISSION_CLK = '0' and buf_MED_TRANSMISSION_CLK_OUT = '1' then
next_buf_MED_DATA_OUT(12 downto 0) <= buf_INT_DATA_IN(25 downto 13);
- next_MED_CARRIER_OUT <= '1';
next_MED_PARITY_OUT <= '0';
- next_INT2MED_state <= "0011";
+ next_INT2MED_state <= "0100";
else
next_INT2MED_state <= "0010";
end if;
- when "0011" =>
- if TRANSMISSION_CLK = '1' then
- next_INT2MED_state <= "0100";
- else
- next_INT2MED_state <= "0011";
- end if;
when "0100" =>
- if TRANSMISSION_CLK = '0' then
+ if next_TRANSMISSION_CLK = '0' and buf_MED_TRANSMISSION_CLK_OUT = '1' then
next_buf_MED_DATA_OUT(12 downto 0) <= buf_INT_DATA_IN(38 downto 26);
- next_MED_CARRIER_OUT <= '1';
- next_MED_PARITY_OUT <= '0';
- next_INT2MED_state <= "0101";
+ next_INT2MED_state <= "0110";
else
next_INT2MED_state <= "0100";
end if;
- when "0101" =>
- if TRANSMISSION_CLK = '1' then
- next_INT2MED_state <= "0110";
- else
- next_INT2MED_state <= "0101";
- end if;
when "0110" =>
- if TRANSMISSION_CLK = '0' then
+ if next_TRANSMISSION_CLK = '0' and buf_MED_TRANSMISSION_CLK_OUT = '1' then
next_buf_MED_DATA_OUT(12 downto 0) <= buf_INT_DATA_IN(51 downto 39);
- next_MED_CARRIER_OUT <= '1';
- next_MED_PARITY_OUT <= '0';
- next_INT2MED_state <= "0111";
+ next_INT2MED_state <= "1000";
else
next_INT2MED_state <= "0110";
end if;
- when "0111" =>
- if TRANSMISSION_CLK = '1' then
- next_INT2MED_state <= "1000";
- else
- next_INT2MED_state <= "0111";
- end if;
when "1000" =>
- if TRANSMISSION_CLK = '0' then
+ if next_TRANSMISSION_CLK = '0' and buf_MED_TRANSMISSION_CLK_OUT = '1' then
next_buf_MED_DATA_OUT(3 downto 0) <= buf_INT_DATA_IN(55 downto 52);
next_buf_MED_DATA_OUT(11 downto 4) <= buf_CTRL(31 downto 24);
next_buf_MED_DATA_OUT(12) <= buf_CTRL(0);
- next_MED_CARRIER_OUT <= '1';
- next_MED_PARITY_OUT <= '0';
- next_INT2MED_state <= "1101";
+ next_INT2MED_state <= "1110";
else
next_INT2MED_state <= "1000";
end if;
- when "1101" =>
- if TRANSMISSION_CLK = '1' then
+ when "1110" =>
+ if next_TRANSMISSION_CLK = '0' and buf_MED_TRANSMISSION_CLK_OUT = '1' then
next_INT2MED_state <= "0000";
+ next_MED_CARRIER_OUT <= '0';
+ next_buf_MED_DATA_OUT <= (others => '0');
else
- next_INT2MED_state <= "1101";
+ next_INT2MED_state <= "1110";
end if;
when others =>
next_INT2MED_state <= "0000";
buf_INT_READ_OUT <= '0';
buf_MED_CARRIER_OUT <= '0';
buf_MED_PARITY_OUT <= '0';
- buf_MED_TRANSMISSION_CLK_OUT <= '0';
packets_out_counter <= (others => '0');
elsif rising_edge(CLK) then
INT2MED_state <= next_INT2MED_state;
- buf_MED_TRANSMISSION_CLK_OUT <= next_MED_TRANSMISSION_CLK_OUT;
buf_INT_DATA_IN <= next_buf_INT_DATA_IN;
buf_INT_READ_OUT <= next_buf_INT_READ_OUT;
buf_MED_DATA_OUT(12 downto 0) <= next_buf_MED_DATA_OUT(12 downto 0);
buf_MED_PARITY_OUT <= next_MED_PARITY_OUT;
packets_out_counter <= next_packets_out_counter;
else
- buf_MED_TRANSMISSION_CLK_OUT <= buf_MED_TRANSMISSION_CLK_OUT;
buf_MED_DATA_OUT <= buf_MED_DATA_OUT;
buf_MED_CARRIER_OUT <= buf_MED_CARRIER_OUT;
buf_MED_PARITY_OUT <= buf_MED_PARITY_OUT;
--MED to INT direction
--------------------------------
-MED2INT_fsm: process(MED_PARITY_IN,MED2INT_state,CLK,MED_DATA_IN,DAT_MED2INT,
- MED_TRANSMISSION_CLK_IN,MED_CARRIER_IN,INT_READ_IN, RECV_STAT,
- media_not_connected,buf_INT_DATAREADY_OUT, buf_INT_DATA_OUT)
+MED2INT_fsm: process(reg_MED_PARITY_IN,MED2INT_state,CLK,reg_MED_DATA_IN,DAT_MED2INT,
+ reg_MED_TRANSMISSION_CLK_IN,reg_MED_CARRIER_IN,INT_READ_IN, RECV_STAT,
+ media_not_connected,buf_INT_DATAREADY_OUT, buf_INT_DATA_OUT, last_MED_TRANSMISSION_CLK_IN)
begin
- next_DAT_MED2INT (64 downto 0) <= DAT_MED2INT (64 downto 0);
+ next_DAT_MED2INT <= DAT_MED2INT;
next_INT_DATA_OUT <= buf_INT_DATA_OUT;
next_INT_DATAREADY_OUT <= buf_INT_DATAREADY_OUT;
next_MED2INT_state <= "0000";
next_RECV_STAT <= RECV_STAT;
next_packets_in_counter <= packets_in_counter;
+ next_packets_in_compl_counter <= packets_in_compl_counter;
+
case MED2INT_state is
when "0000" =>
- if MED_TRANSMISSION_CLK_IN = '1' and MED_CARRIER_IN = '1'
- and MED_PARITY_IN = '1' then
- next_MED2INT_state <= "1001";
- next_DAT_MED2INT(12 downto 0) <= MED_DATA_IN(12 downto 0);
- end if;
- when "1001" =>
- if MED_TRANSMISSION_CLK_IN = '0' then
+ if reg_MED_TRANSMISSION_CLK_IN = '1' and last_MED_TRANSMISSION_CLK_IN = '0'
+ and reg_MED_CARRIER_IN = '1' and reg_MED_PARITY_IN = '1' then
next_MED2INT_state <= "0001";
- else
- next_MED2INT_state <= "1001";
+ next_DAT_MED2INT(12 downto 0) <= reg_MED_DATA_IN(12 downto 0);
+ next_packets_in_counter <= packets_in_counter + 1;
end if;
when "0001" =>
- if MED_TRANSMISSION_CLK_IN = '1' and MED_CARRIER_IN = '1' then
- next_MED2INT_state <= "1010";
- next_DAT_MED2INT(25 downto 13) <= MED_DATA_IN(12 downto 0);
+ if reg_MED_TRANSMISSION_CLK_IN = '1' and last_MED_TRANSMISSION_CLK_IN = '0' and reg_MED_CARRIER_IN = '1' then
+ next_MED2INT_state <= "0010";
+ next_DAT_MED2INT(25 downto 13) <= reg_MED_DATA_IN(12 downto 0);
+ next_packets_in_counter <= packets_in_counter + 1;
else
next_MED2INT_state <= "0001";
end if;
- when "1010" =>
- if MED_TRANSMISSION_CLK_IN = '0' then
- next_MED2INT_state <= "0010";
- else
- next_MED2INT_state <= "1010";
- end if;
when "0010" =>
- if MED_TRANSMISSION_CLK_IN = '1' and MED_CARRIER_IN = '1' then
- next_MED2INT_state <= "1011";
- next_DAT_MED2INT(38 downto 26) <= MED_DATA_IN(12 downto 0);
+ if reg_MED_TRANSMISSION_CLK_IN = '1' and last_MED_TRANSMISSION_CLK_IN = '0' and reg_MED_CARRIER_IN = '1' then
+ next_MED2INT_state <= "0011";
+ next_DAT_MED2INT(38 downto 26) <= reg_MED_DATA_IN(12 downto 0);
+ next_packets_in_counter <= packets_in_counter + 1;
else
next_MED2INT_state <= "0010";
end if;
- when "1011" =>
- if MED_TRANSMISSION_CLK_IN = '0' then
- next_MED2INT_state <= "0011";
- else
- next_MED2INT_state <= "1011";
- end if;
when "0011" =>
- if MED_TRANSMISSION_CLK_IN = '1' and MED_CARRIER_IN = '1' then
- next_MED2INT_state <= "1100";
- next_DAT_MED2INT(51 downto 39) <= MED_DATA_IN(12 downto 0);
+ if reg_MED_TRANSMISSION_CLK_IN = '1' and last_MED_TRANSMISSION_CLK_IN = '0' and reg_MED_CARRIER_IN = '1' then
+ next_MED2INT_state <= "0100";
+ next_DAT_MED2INT(51 downto 39) <= reg_MED_DATA_IN(12 downto 0);
+ next_packets_in_counter <= packets_in_counter + 1;
else
next_MED2INT_state <= "0011";
end if;
- when "1100" =>
- if MED_TRANSMISSION_CLK_IN = '0' then
- next_MED2INT_state <= "0100";
- else
- next_MED2INT_state <= "1100";
- end if;
when "0100" =>
- if MED_TRANSMISSION_CLK_IN = '1' and MED_CARRIER_IN = '1' then
- next_MED2INT_state <= "0110";
- next_DAT_MED2INT(64 downto 52) <= MED_DATA_IN(12 downto 0);
+ if reg_MED_TRANSMISSION_CLK_IN = '1' and last_MED_TRANSMISSION_CLK_IN = '0' and reg_MED_CARRIER_IN = '1' then
next_INT_DATA_OUT(51 downto 0) <= DAT_MED2INT(51 downto 0);
- next_INT_DATA_OUT(55 downto 52) <= MED_DATA_IN(3 downto 0);
- next_RECV_STAT <= MED_DATA_IN(12 downto 4);
+ next_INT_DATA_OUT(55 downto 52) <= reg_MED_DATA_IN(3 downto 0);
+ next_RECV_STAT <= reg_MED_DATA_IN(12 downto 4);
next_INT_DATAREADY_OUT <= '1';
next_MED2INT_state <= "0000";
- next_packets_in_counter <= packets_in_counter + 1;
+ next_packets_in_counter <= packets_in_counter + 1;
else
next_MED2INT_state <= "0100";
end if;
buf_INT_DATA_OUT <= (others => '0');
RECV_STAT <= (others => '0');
packets_in_counter <= (others => '0');
+ packets_in_compl_counter <= (others => '0');
+ last_MED_TRANSMISSION_CLK_IN <= '1';
elsif rising_edge(CLK) then
DAT_MED2INT <= next_DAT_MED2INT;
MED2INT_state <= next_MED2INT_state;
buf_INT_DATAREADY_OUT <= next_INT_DATAREADY_OUT;
RECV_STAT <= next_RECV_STAT;
packets_in_counter <= next_packets_in_counter;
+ packets_in_compl_counter <= next_packets_in_compl_counter;
+ last_MED_TRANSMISSION_CLK_IN <= reg_MED_TRANSMISSION_CLK_IN;
else
buf_INT_DATA_OUT <= buf_INT_DATA_OUT;
MED2INT_state <= MED2INT_state;
DAT_MED2INT <= DAT_MED2INT;
RECV_STAT <= RECV_STAT;
packets_in_counter <= packets_in_counter;
+ packets_in_compl_counter <= packets_in_compl_counter;
+ last_MED_TRANSMISSION_CLK_IN <= last_MED_TRANSMISSION_CLK_IN;
+ end if;
+ end process;
+
+LVDS_IN_reg: process(CLK, RESET)
+ begin
+ if RESET='1' then
+ reg_MED_TRANSMISSION_CLK_IN <= '0';
+ reg_MED_CARRIER_IN <= '0';
+ reg_MED_PARITY_IN <= '0';
+ reg_MED_DATA_IN <= (others => '0');
+ elsif rising_edge(CLK) then
+ reg_MED_TRANSMISSION_CLK_IN <= MED_TRANSMISSION_CLK_IN;
+ reg_MED_CARRIER_IN <= MED_CARRIER_IN;
+ reg_MED_PARITY_IN <= MED_PARITY_IN;
+ reg_MED_DATA_IN <= MED_DATA_IN;
+ else
+ reg_MED_TRANSMISSION_CLK_IN <= reg_MED_TRANSMISSION_CLK_IN;
+ reg_MED_CARRIER_IN <= reg_MED_CARRIER_IN;
+ reg_MED_PARITY_IN <= reg_MED_PARITY_IN;
+ reg_MED_DATA_IN <= reg_MED_DATA_IN;
end if;
end process;