]> jspc29.x-matter.uni-frankfurt.de Git - trbnet.git/commitdiff
added parity to trb_net_med_13bit_slow.vhd, Jan
authorhadeshyp <hadeshyp>
Tue, 8 May 2007 09:32:25 +0000 (09:32 +0000)
committerhadeshyp <hadeshyp>
Tue, 8 May 2007 09:32:25 +0000 (09:32 +0000)
trb_net_med_13bit_slow.vhd
trb_net_std.vhd

index 71fc7d671c35ac4c25253fb1a435381b5e173607..9da30ecd022750d2b5c1c275c35f24bc6e721709 100755 (executable)
@@ -6,13 +6,13 @@
 --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( 
@@ -71,7 +71,9 @@ end trb_net_med_13bit_slow;
 
 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);
@@ -81,7 +83,7 @@ architecture trb_net_med_13bit_slow_arch of trb_net_med_13bit_slow is
   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);
@@ -89,7 +91,7 @@ architecture trb_net_med_13bit_slow_arch of trb_net_med_13bit_slow is
   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);
 
@@ -100,7 +102,7 @@ architecture trb_net_med_13bit_slow_arch of trb_net_med_13bit_slow is
   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;
@@ -130,7 +132,7 @@ fatal_error <= '0';
 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';
@@ -141,7 +143,7 @@ gen_STAT_WORD: process(MED2INT_state,INT2MED_state,buf_INT_DATAREADY_OUT,RECV_ST
       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;
@@ -172,7 +174,7 @@ CTRL_reg: process (CLK,RESET)
       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;
@@ -285,6 +287,7 @@ INT2MED_fsm: process(buf_INT_DATA_IN,INT2MED_state,
               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;
@@ -311,7 +314,7 @@ begin
         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";
@@ -319,7 +322,7 @@ begin
       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";
@@ -327,6 +330,7 @@ begin
       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";
@@ -334,15 +338,20 @@ begin
       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";
@@ -408,69 +417,81 @@ INT2MED_fsm_reg: process(CLK,RESET)
 --------------------------------
 
 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;
 
@@ -478,7 +499,7 @@ MED2INT_fsm: process(reg_MED_PARITY_IN,MED2INT_state,CLK,reg_MED_DATA_IN,DAT_MED
 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');
index 3f118820cb2b127287f0ff6a724344fe2dd19746..9c8817ac54ea96e1175363ceea4483c3049fcc25 100644 (file)
@@ -12,6 +12,9 @@ package trb_net_std is
     return std_logic;
   function all_zero (arg : std_logic_vector)
     return std_logic;
+  function xor_all  (arg : std_logic_vector)
+    return std_logic;
+  
 
   subtype TYPE_POSITION is integer range 50 downto 48;      
   constant TYPE_DAT : std_logic_vector(2 downto 0) := "000";
@@ -52,7 +55,7 @@ package trb_net_std is
        INT_READ_OUT:      STD_LOGIC; 
        INT_ERROR_IN:      STD_LOGIC_VECTOR (2 downto 0);  -- Status bits  
     end record;
-  
+   
   
 end package trb_net_std;
 
@@ -90,6 +93,17 @@ package body trb_net_std is
       end loop;  -- i
       return tmp;
   end function all_zero;
+
+  function xor_all (arg : std_logic_vector)
+    return std_logic is
+    variable tmp : std_logic := '0';
+    begin
+      tmp := '0';
+      for i in arg'range loop
+        tmp := tmp xor arg(i);
+      end loop;  -- i
+      return tmp;
+  end function xor_all;
   
 end package body trb_net_std;