From: hadeshyp Date: Mon, 24 Dec 2007 23:23:02 +0000 (+0000) Subject: some updates X-Git-Tag: oldGBE~654 X-Git-Url: https://jspc29.x-matter.uni-frankfurt.de/git/?a=commitdiff_plain;h=f23086bb03960b6c70c7fcbe5eb798cdf93f2774;p=trbnet.git some updates --- diff --git a/trb_net16_obuf.vhd b/trb_net16_obuf.vhd index ee1faa1..1d412a1 100644 --- a/trb_net16_obuf.vhd +++ b/trb_net16_obuf.vhd @@ -10,6 +10,8 @@ use work.trb_net_std.all; entity trb_net16_obuf is generic ( + USE_ACKNOWLEDGE : integer range 0 to 1 := 1; + CAN_SEND_DATA : integer range 0 to 1 := 1; DATA_COUNT_WIDTH : integer range 1 to 7 := 5 -- max used buffer size is 2**DATA_COUNT_WIDTH. ); port( @@ -89,7 +91,8 @@ architecture trb_net16_obuf_arch of trb_net16_obuf is signal transfer_counter : std_logic_vector(1 downto 0); signal saved_packet_type : std_logic_vector(2 downto 0); - + signal reg_SEND_ACK_IN_2,next_SEND_ACK_IN_2 : std_logic; + begin SBUF: trb_net16_sbuf @@ -113,30 +116,46 @@ begin SYN_READ_IN => MED_READ_IN ); - decrease_TRANSMITTED_BUFFERS <= GOT_ACK_IN; comb_read <= '1'; INT_READ_OUT <= reg_INT_READ_OUT; sbuf_free <= comb_next_read; - send_ACK <= SEND_ACK_IN or reg_SEND_ACK_IN; - send_DATA <= not TRANSMITTED_BUFFERS(1);--'1' when (TRANSMITTED_BUFFERS(1) = '0') else '0'; - - --only for full obuf - send_EOB <= '1' when (CURRENT_DATA_COUNT = max_DATA_COUNT_minus_one) else '0'; - - - -- buffer registers - STAT_BUFFER(1 downto 0) <= TRANSMITTED_BUFFERS; - STAT_BUFFER(14 downto 2) <= (others => '0'); - STAT_BUFFER(15) <= send_DATA; - STAT_BUFFER(20 downto 16) <= CURRENT_DATA_COUNT; - STAT_BUFFER(31 downto 21) <= (others => '0'); - SEND_BUFFER_SIZE_IN <= CTRL_BUFFER(3 downto 0); - REC_BUFFER_SIZE_IN <= CTRL_BUFFER(7 downto 4); - SEND_ACK_IN <= CTRL_BUFFER(8); - GOT_ACK_IN <= CTRL_BUFFER(9); - - + gen1 : if USE_ACKNOWLEDGE = 1 generate + decrease_TRANSMITTED_BUFFERS <= GOT_ACK_IN; + send_ACK <= SEND_ACK_IN or reg_SEND_ACK_IN or reg_SEND_ACK_IN_2; + next_SEND_ACK_IN_2 <= (reg_SEND_ACK_IN_2 or SEND_ACK_IN) and reg_SEND_ACK_IN; + send_DATA <= not TRANSMITTED_BUFFERS(1);--'1' when (TRANSMITTED_BUFFERS(1) = '0') else '0'; + + --only for full obuf + send_EOB <= '1' when (CURRENT_DATA_COUNT = max_DATA_COUNT_minus_one) else '0'; + + + -- buffer registers + STAT_BUFFER(1 downto 0) <= TRANSMITTED_BUFFERS; + STAT_BUFFER(14 downto 2) <= (others => '0'); + STAT_BUFFER(15) <= send_DATA; + STAT_BUFFER(20 downto 16) <= CURRENT_DATA_COUNT; + STAT_BUFFER(31 downto 21) <= (others => '0'); + SEND_BUFFER_SIZE_IN <= CTRL_BUFFER(3 downto 0); + REC_BUFFER_SIZE_IN <= CTRL_BUFFER(7 downto 4); + SEND_ACK_IN <= CTRL_BUFFER(8); + GOT_ACK_IN <= CTRL_BUFFER(9); + end generate; + gen1a : if USE_ACKNOWLEDGE = 0 generate + send_EOB <= '0'; + send_ACK <= '0'; + reg_SEND_ACK_IN <= '0'; + reg_SEND_ACK_IN_2 <= '0'; + send_DATA <= '1'; + got_locked <= '0'; + release_locked <= '0'; + is_locked <= '0'; + CURRENT_DATA_COUNT <= (others => '0'); + max_DATA_COUNT_minus_one <= (others => '0'); + next_max_DATA_COUNT_minus_one <= (others => '0'); + next_TRANSMITTED_BUFFERS <= (others => '0'); + + end generate; GENERATE_WORDS : process(transfer_counter, SEND_BUFFER_SIZE_IN, INT_DATA_IN) begin @@ -193,8 +212,7 @@ begin next_INT_READ_OUT <= '1'; increase_TRANSMITTED_BUFFERS <= '0'; next_DATA_COUNT <= CURRENT_DATA_COUNT; - next_SEND_ACK_IN <= send_ACK; --BUGBUG: next_SEND_ACK_IN should be a counter (2 may arrive) - -- -> no real problem due to same speed of transmission + next_SEND_ACK_IN <= send_ACK; comb_dataready <= '0'; if (reg_INT_READ_OUT = '1' and INT_DATAREADY_IN = '1') then @@ -235,85 +253,108 @@ begin end process; - - REG : process(CLK) + REG1 : process(CLK) begin if rising_edge(CLK) then if RESET = '1' then - reg_SEND_ACK_IN <= '0'; - CURRENT_DATA_COUNT <= (others => '0'); reg_INT_READ_OUT <= '0'; elsif CLK_EN = '1' then - reg_SEND_ACK_IN <= next_SEND_ACK_IN; - CURRENT_DATA_COUNT <= next_DATA_COUNT; reg_INT_READ_OUT <= next_INT_READ_OUT; end if; end if; end process; - next_max_DATA_COUNT_minus_one <= - conv_std_logic_vector(3, DATA_COUNT_WIDTH) when REC_BUFFER_SIZE_IN="0010" else - conv_std_logic_vector(7, DATA_COUNT_WIDTH) when REC_BUFFER_SIZE_IN="0011" else - (others => '1') when REC_BUFFER_SIZE_IN(3 downto 1)="011" else --this is bram or infty - conv_std_logic_vector(1, DATA_COUNT_WIDTH); + gen3 : if USE_ACKNOWLEDGE = 0 generate + STAT_BUFFER <= (others => '0'); + STAT_LOCKED <= (others => '0'); + TRANSMITTED_BUFFERS <= (others => '0'); + end generate; + + gen2 : if USE_ACKNOWLEDGE = 1 generate + REG : process(CLK) + begin + if rising_edge(CLK) then + if RESET = '1' then + reg_SEND_ACK_IN <= '0'; + reg_SEND_ACK_IN_2 <= '0'; + CURRENT_DATA_COUNT <= (others => '0'); + elsif CLK_EN = '1' then + reg_SEND_ACK_IN <= next_SEND_ACK_IN; + reg_SEND_ACK_IN_2 <= next_SEND_ACK_IN_2; + CURRENT_DATA_COUNT <= next_DATA_COUNT; + end if; + end if; + end process; + + next_max_DATA_COUNT_minus_one <= + conv_std_logic_vector(3, DATA_COUNT_WIDTH) when REC_BUFFER_SIZE_IN="0010" else + conv_std_logic_vector(7, DATA_COUNT_WIDTH) when REC_BUFFER_SIZE_IN="0011" else + (others => '1') when REC_BUFFER_SIZE_IN(3 downto 1)="011" else --this is bram or infty + conv_std_logic_vector(1, DATA_COUNT_WIDTH); + + reg_max_DATA_COUNT : process(CLK) + begin + if rising_edge(CLK) then + if RESET = '1' then + max_DATA_COUNT_minus_one(0) <= '1'; + max_DATA_COUNT_minus_one(DATA_COUNT_WIDTH-1 downto 1) <= (others => '0'); + else + max_DATA_COUNT_minus_one <= next_max_DATA_COUNT_minus_one(DATA_COUNT_WIDTH-1 downto 0); + end if; + end if; + end process; - reg_max_DATA_COUNT : process(CLK) + comb_TRANSMITTED_BUFFERS : process (increase_TRANSMITTED_BUFFERS, decrease_TRANSMITTED_BUFFERS, TRANSMITTED_BUFFERS) begin - if rising_edge(CLK) then - if RESET = '1' then - max_DATA_COUNT_minus_one(0) <= '1'; - max_DATA_COUNT_minus_one(DATA_COUNT_WIDTH-1 downto 1) <= (others => '0'); + if (increase_TRANSMITTED_BUFFERS = '1' and decrease_TRANSMITTED_BUFFERS = '0') then + next_TRANSMITTED_BUFFERS <= TRANSMITTED_BUFFERS +1; + elsif (increase_TRANSMITTED_BUFFERS = '0' and decrease_TRANSMITTED_BUFFERS = '1') then + next_TRANSMITTED_BUFFERS <= TRANSMITTED_BUFFERS -1; else - max_DATA_COUNT_minus_one <= next_max_DATA_COUNT_minus_one(DATA_COUNT_WIDTH-1 downto 0); + next_TRANSMITTED_BUFFERS <= TRANSMITTED_BUFFERS; end if; - end if; - end process; + end process; + + reg_TRANSMITTED_BUFFERS : process(CLK) + begin + if rising_edge(CLK) then + if RESET = '1' then + TRANSMITTED_BUFFERS <= "00"; + elsif CLK_EN = '1' then + TRANSMITTED_BUFFERS <= next_TRANSMITTED_BUFFERS; + end if; + end if; + end process; + + comb_locked : process (MED_READ_IN, saved_packet_type, transfer_counter, release_locked, is_locked) + begin -- process + got_locked <= is_locked and not release_locked; + if MED_READ_IN = '1' then + if saved_packet_type = TYPE_TRM and transfer_counter = "11" and release_locked = '0' then + got_locked <= '1'; + end if; + end if; + end process; + + release_locked <= CTRL_LOCKED(0); + STAT_LOCKED(0) <= is_locked; + STAT_LOCKED(15 downto 1) <= (others => '0'); + + reg_locked: process(CLK) + begin + if rising_edge(CLK) then + if RESET = '1' then + is_locked <= '0'; + elsif CLK_EN = '1' then + is_locked <= got_locked; + end if; + end if; + end process; + end generate; - comb_TRANSMITTED_BUFFERS : process (increase_TRANSMITTED_BUFFERS, decrease_TRANSMITTED_BUFFERS, TRANSMITTED_BUFFERS) - begin - if (increase_TRANSMITTED_BUFFERS = '1' and decrease_TRANSMITTED_BUFFERS = '0') then - next_TRANSMITTED_BUFFERS <= TRANSMITTED_BUFFERS +1; - elsif (increase_TRANSMITTED_BUFFERS = '0' and decrease_TRANSMITTED_BUFFERS = '1') then - next_TRANSMITTED_BUFFERS <= TRANSMITTED_BUFFERS -1; - else - next_TRANSMITTED_BUFFERS <= TRANSMITTED_BUFFERS; - end if; - end process; - reg_TRANSMITTED_BUFFERS : process(CLK) - begin - if rising_edge(CLK) then - if RESET = '1' then - TRANSMITTED_BUFFERS <= "00"; - elsif CLK_EN = '1' then - TRANSMITTED_BUFFERS <= next_TRANSMITTED_BUFFERS; - end if; - end if; - end process; - comb_locked : process (MED_READ_IN, saved_packet_type, transfer_counter, release_locked, is_locked) - begin -- process - got_locked <= is_locked and not release_locked; - if MED_READ_IN = '1' then - if saved_packet_type = TYPE_TRM and transfer_counter = "11" and release_locked = '0' then - got_locked <= '1'; - end if; - end if; - end process; - release_locked <= CTRL_LOCKED(0); - STAT_LOCKED(0) <= is_locked; - STAT_LOCKED(15 downto 1) <= (others => '0'); - reg_locked: process(CLK) - begin - if rising_edge(CLK) then - if RESET = '1' then - is_locked <= '0'; - elsif CLK_EN = '1' then - is_locked <= got_locked; - end if; - end if; - end process; end architecture; \ No newline at end of file