From: hadeshyp Date: Fri, 4 May 2007 11:23:31 +0000 (+0000) Subject: corrected trb_net_med_13bit_slow.vhd, Jan X-Git-Tag: oldGBE~734 X-Git-Url: https://jspc29.x-matter.uni-frankfurt.de/git/?a=commitdiff_plain;h=7f991e740d234c3aef4e8bfdfd143da476604ebc;p=trbnet.git corrected trb_net_med_13bit_slow.vhd, Jan --- diff --git a/trb_net_med_13bit_slow.vhd b/trb_net_med_13bit_slow.vhd index f0c8b12..71fc7d6 100755 --- a/trb_net_med_13bit_slow.vhd +++ b/trb_net_med_13bit_slow.vhd @@ -16,7 +16,7 @@ use IEEE.NUMERIC_STD.ALL; 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! ); @@ -73,8 +73,8 @@ 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); - 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); @@ -96,8 +96,15 @@ architecture trb_net_med_13bit_slow_arch of trb_net_med_13bit_slow is 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; @@ -135,8 +142,9 @@ gen_STAT_WORD: process(MED2INT_state,INT2MED_state,buf_INT_DATAREADY_OUT,RECV_ST 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 @@ -164,8 +172,8 @@ CTRL_reg: process (CLK,RESET) 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; @@ -201,14 +209,14 @@ reg_my_error: process(CLK,RESET) --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; @@ -217,13 +225,13 @@ trans_clk_counter_reg: process (CLK,RESET) 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; @@ -274,8 +282,8 @@ transCLK_counter: process (this_TRCLK, last_TRCLK, CLK_counter, --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"; @@ -283,94 +291,69 @@ begin 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"; @@ -387,11 +370,9 @@ INT2MED_fsm_reg: process(CLK,RESET) 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); @@ -399,7 +380,6 @@ INT2MED_fsm_reg: process(CLK,RESET) 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; @@ -427,78 +407,58 @@ INT2MED_fsm_reg: process(CLK,RESET) --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; @@ -524,6 +484,8 @@ MED2INT_fsm_reg: process(CLK,RESET) 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; @@ -531,6 +493,8 @@ MED2INT_fsm_reg: process(CLK,RESET) 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; @@ -538,6 +502,28 @@ MED2INT_fsm_reg: process(CLK,RESET) 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;