--parity bit is not used for parity but as an indicator for the first packet
--of a transmission
-
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;
+use work.trb_net_std.all;
entity trb_net_med_13bit_slow is
generic(
architecture trb_net_med_13bit_slow_arch of trb_net_med_13bit_slow is
signal INT2MED_state, next_INT2MED_state : std_logic_vector (3 downto 0);
- signal MED2INT_state, next_MED2INT_state: std_logic_vector(3 downto 0);
+
+ type MED2INT_STATE_t is (IDLE, RECV2, RECV3, RECV4, RECV5);
+ signal MED2INT_state, next_MED2INT_state: MED2INT_STATE_t;
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_DATAREADY_OUT, buf_INT_DATAREADY_OUT: std_logic;
signal next_buf_INT_READ_OUT, buf_INT_READ_OUT: std_logic;
- signal buf_MED_TRANSMISSION_CLK_OUT,next_MED_TRANSMISSION_CLK_OUT: std_logic;
+ signal buf_MED_TRANSMISSION_CLK_OUT: std_logic;
signal buf_MED_CARRIER_OUT, next_MED_CARRIER_OUT: STD_LOGIC;
signal buf_MED_PARITY_OUT, next_MED_PARITY_OUT: STD_LOGIC;
signal my_error,next_my_error : std_logic_vector(2 downto 0);
signal next_media_not_connected : std_logic;
signal transmission_clk_Counter : std_logic_vector(4 downto 0);
signal next_transmission_clk_Counter : std_logic_vector(4 downto 0);
- signal TRANSMISSION_CLK, next_TRANSMISSION_CLK: std_logic;
+ signal next_TRANSMISSION_CLK: std_logic;
signal buf_CTRL, next_STAT, buf_STAT : std_logic_vector(31 downto 0);
signal next_RECV_STAT, RECV_STAT : std_logic_vector(8 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 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;
gen_STAT_WORD: process(MED2INT_state,INT2MED_state,buf_INT_DATAREADY_OUT,RECV_STAT,buf_STAT)
begin
next_STAT <= (others => '0');
- if MED2INT_state = 0 then
+ if MED2INT_state = IDLE then
next_STAT(0) <= '0';
else
next_STAT(0) <= '1';
next_STAT(1) <= '1';
end if;
next_STAT(11 downto 8) <= INT2MED_state;
- next_STAT(15 downto 12) <= MED2INT_state;
+ --next_STAT(15 downto 12) <= MED2INT_state;
next_STAT(16) <= media_not_connected;
next_STAT(31 downto 24) <= packets_in_counter;
--next_STAT(27 downto 24) <= packets_in_compl_counter;
buf_CTRL <= (others => '0');
elsif rising_edge(CLK) then
buf_CTRL <= CTRL;
- buf_CTRL(31 downto 24) <= packets_in_counter;
+ --buf_CTRL(31 downto 24) <= packets_in_counter;
--buf_CTRL(27 downto 24) <= packets_in_compl_counter;
else
buf_CTRL <= buf_CTRL;
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)
+ variable tmp: std_logic_vector(12 downto 0);
begin
next_INT2MED_state <= "0000";
next_buf_MED_DATA_OUT <= buf_MED_DATA_OUT;
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_MED_PARITY_OUT <= xor_all(buf_INT_DATA_IN(12 downto 0));
next_INT2MED_state <= "0010";
else
next_INT2MED_state <= "0001";
when "0010" =>
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_PARITY_OUT <= '0';
+ next_MED_PARITY_OUT <= xor_all(buf_INT_DATA_IN(25 downto 13));
next_INT2MED_state <= "0100";
else
next_INT2MED_state <= "0010";
when "0100" =>
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_PARITY_OUT <= xor_all(buf_INT_DATA_IN(38 downto 26));
next_INT2MED_state <= "0110";
else
next_INT2MED_state <= "0100";
when "0110" =>
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_PARITY_OUT <= xor_all(buf_INT_DATA_IN(51 downto 39));
next_INT2MED_state <= "1000";
else
next_INT2MED_state <= "0110";
end if;
when "1000" =>
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);
+
+ tmp(3 downto 0) := buf_INT_DATA_IN(55 downto 52);
+ tmp(11 downto 4) := buf_CTRL(31 downto 24);
+ tmp(12) := buf_CTRL(0);
+
+ next_buf_MED_DATA_OUT <= tmp;
+ next_MED_PARITY_OUT <= xor_all(tmp);
next_INT2MED_state <= "1110";
else
next_INT2MED_state <= "1000";
--------------------------------
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)
+ 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 <= DAT_MED2INT;
next_INT_DATA_OUT <= buf_INT_DATA_OUT;
next_INT_DATAREADY_OUT <= buf_INT_DATAREADY_OUT;
- next_MED2INT_state <= "0000";
+ next_MED2INT_state <= IDLE;
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 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";
+ when IDLE =>
+ if reg_MED_TRANSMISSION_CLK_IN = '1' and last_MED_TRANSMISSION_CLK_IN = '0' and reg_MED_CARRIER_IN = '1' then
+ next_MED2INT_state <= RECV2;
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" =>
+ when RECV2 =>
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_MED2INT_state <= RECV3;
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";
+ next_MED2INT_state <= RECV2;
end if;
- when "0010" =>
+ when RECV3 =>
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_MED2INT_state <= RECV4;
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";
+ next_MED2INT_state <= RECV3;
end if;
- when "0011" =>
+ when RECV4 =>
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_MED2INT_state <= RECV5;
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";
+ next_MED2INT_state <= RECV4;
end if;
- when "0100" =>
+ when RECV5 =>
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) <= 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_MED2INT_state <= IDLE;
next_packets_in_counter <= packets_in_counter + 1;
else
- next_MED2INT_state <= "0100";
+ next_MED2INT_state <= RECV5;
end if;
when others =>
- next_MED2INT_state <= "0000";
+ next_MED2INT_state <= IDLE;
end case;
+
+ --clear dataready when read
if buf_INT_DATAREADY_OUT = '1' and INT_READ_IN = '1' then
next_INT_DATAREADY_OUT <= '0';
next_INT_DATA_OUT <= (others => '0');
end if;
+
+ --check parity
+ if reg_MED_TRANSMISSION_CLK_IN = '1' and last_MED_TRANSMISSION_CLK_IN = '0' then
+ if(xor_all(reg_MED_DATA_IN(12 downto 0)) /= reg_MED_PARITY_IN) then
+ next_MED2INT_state <= IDLE;
+ end if;
+ end if;
+
+ --reset on Carrier low
+-- if reg_MED_TRANSMISSION_CLK_IN = '1' and last_MED_TRANSMISSION_CLK_IN = '0' and reg_MED_CARRIER_IN = '0' then
+-- next_MED2INT_state <= IDLE;
+-- end if;
+
+ --reset on not connected
if media_not_connected = '1' then
- next_MED2INT_state <= "0000";
+ next_MED2INT_state <= IDLE;
end if;
end process;
MED2INT_fsm_reg: process(CLK,RESET)
begin
if RESET='1' then
- MED2INT_state <= "0000";
+ MED2INT_state <= IDLE;
buf_INT_DATAREADY_OUT <= '0';
DAT_MED2INT <= (others => '0');
buf_INT_DATA_OUT <= (others => '0');