]> jspc29.x-matter.uni-frankfurt.de Git - trbnet.git/commitdiff
some updates
authorhadeshyp <hadeshyp>
Mon, 24 Dec 2007 23:23:02 +0000 (23:23 +0000)
committerhadeshyp <hadeshyp>
Mon, 24 Dec 2007 23:23:02 +0000 (23:23 +0000)
trb_net16_obuf.vhd

index ee1faa1acdff4e9d1d5490cbb928d93f5512f353..1d412a10228255c48611dce0a54b1c7623782f65 100644 (file)
@@ -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