]> jspc29.x-matter.uni-frankfurt.de Git - trbnet.git/commitdiff
corrected trb_net_med_13bit_slow.vhd, Jan
authorhadeshyp <hadeshyp>
Fri, 4 May 2007 11:23:31 +0000 (11:23 +0000)
committerhadeshyp <hadeshyp>
Fri, 4 May 2007 11:23:31 +0000 (11:23 +0000)
trb_net_med_13bit_slow.vhd

index f0c8b1217692f44d53d7c72ec52d5b494bea7c6a..71fc7d671c35ac4c25253fb1a435381b5e173607 100755 (executable)
@@ -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;