From a3fd39a1938352a93b09e7b7608b52be7f635705 Mon Sep 17 00:00:00 2001
From: Mathias Kreider <m.kreider@gsi.de>
Date: Wed, 15 Feb 2012 16:42:53 +0000
Subject: [PATCH]

---
 hdl/EB_SPEC_Test/EB_2_wb_converter.vhd |  86 +++---
 hdl/EB_SPEC_Test/EB_CORE.vhd           |  49 +++-
 hdl/EB_SPEC_Test/EB_RX_CTRL.vhd        |  28 +-
 hdl/EB_SPEC_Test/EB_TX_CTRL.vhd        | 383 ++++++++++++++-----------
 hdl/EB_SPEC_Test/eb_config_new.vhd     |  22 +-
 5 files changed, 330 insertions(+), 238 deletions(-)

diff --git a/hdl/EB_SPEC_Test/EB_2_wb_converter.vhd b/hdl/EB_SPEC_Test/EB_2_wb_converter.vhd
index 048513a..981a3a9 100644
--- a/hdl/EB_SPEC_Test/EB_2_wb_converter.vhd
+++ b/hdl/EB_SPEC_Test/EB_2_wb_converter.vhd
@@ -73,7 +73,7 @@ architecture behavioral of eb_2_wb_converter is
 --State Machines
 ------------------------------------------------------------------------------------------
 constant c_width_int : integer := 24;
-type t_state_RX is (IDLE, EB_HDR_REC, EB_HDR_PROC,  EB_HDR_PROBE_ID,  CYC_HDR_REC, CYC_HDR_READ_PROC, CYC_HDR_READ_GET_ADR, WB_READ_RDY, WB_READ, CYC_HDR_WRITE_PROC, CYC_HDR_WRITE_GET_ADR, WB_WRITE_RDY, WB_WRITE, CYC_DONE, EB_DONE, ERROR);
+type t_state_RX is (IDLE, EB_HDR_REC, EB_HDR_PROC,  EB_HDR_PROBE_ID,  EB_HDR_PROBE_RDY, CYC_HDR_REC, CYC_HDR_READ_PROC, CYC_HDR_READ_GET_ADR, WB_READ_RDY, WB_READ, CYC_HDR_WRITE_PROC, CYC_HDR_WRITE_GET_ADR, WB_WRITE_RDY, WB_WRITE, CYC_DONE, EB_DONE, ERROR);
 type t_state_TX is (IDLE, EB_HDR_INIT, EB_HDR_PROBE_ID, EB_HDR_PROBE_WAIT, PACKET_HDR_SEND, EB_HDR_SEND, RDY, CYC_HDR_INIT, CYC_HDR_SEND, BASE_WRITE_ADR_SEND, DATA_SEND, ZERO_PAD_WRITE, ZERO_PAD_WAIT, ERROR);
 
 
@@ -304,13 +304,13 @@ begin
             
             
             --Counter: RX bytes received
-            if(s_state_RX   = IDLE) then
+            if(s_state_RX   = EB_DONE) then
                 s_EB_RX_byte_cnt <= (others => '0');
-            else
+            end if;
                 if(s_rx_fifo_we = '1') then
                     s_EB_RX_byte_cnt <= s_EB_RX_byte_cnt + 4;    
                 end if;
-            end if;
+            --end if;
             -- packet reception is not complete if min packet size not reached and < s_EB_packet_length
             --
             if((s_EB_RX_byte_cnt < s_EB_packet_length) OR (s_EB_RX_byte_cnt < 16)) then
@@ -379,27 +379,27 @@ begin
             
         else
             -- RX cycle line lowered before all words were transferred
-            if    (s_EB_RX_byte_cnt < s_EB_packet_length
-            AND  EB_RX_i.CYC = '0') then
-            --    report "EB: PACKET WAS ABORTED" severity note;
-            --    ERROR: -- RX cycle line lowered before all words were transferred
-            --    s_state_RX                   <= IDLE;
-            --    s_state_TX                   <= IDLE;
+            if    ((s_EB_RX_byte_cnt < s_EB_packet_length) AND (s_rx_fifo_empty = '1') AND  EB_RX_i.CYC = '0') then
+                report "EB: PACKET WAS ABORTED" severity note;
+                --ERROR: -- RX cycle line lowered before all words were transferred
+                s_state_RX                   <= IDLE;
+                s_state_TX                   <= IDLE;
             --
-            elsif(s_EB_RX_byte_cnt > s_EB_packet_length AND NOT (s_EB_RX_byte_cnt < 16)) then
-            --    report "EB: PACKET TOO LONG" severity note;
-            --    s_state_RX                   <= IDLE;
-            --    s_state_TX                   <= IDLE;
+            elsif((s_EB_RX_byte_cnt > s_EB_packet_length) AND ((s_state_RX /= IDLE) AND (s_state_RX /= EB_HDR_REC))) then
+                report "EB: PACKET TOO LONG" severity note;
+                s_state_RX                   <= IDLE;
+                s_state_TX                   <= IDLE;
             else
             
                 case s_state_RX   is
-                    when IDLE                   =>  if(s_rx_fifo_empty = '1') then
+                    when IDLE                   =>  if(s_rx_fifo_empty = '0') then
                                                         s_state_TX                   <= IDLE;
                                                         s_state_RX                   <= EB_HDR_REC;
+                                                        
                                                         report "EB: RDY" severity note;
                                                     end if;
                                             
-                    when EB_HDR_REC             =>  if(EB_RX_i.CYC = '1' AND s_rx_fifo_empty = '0') then
+                    when EB_HDR_REC             =>  if(s_rx_fifo_empty = '0') then
                                                         s_state_RX       <= EB_HDR_PROC;
                                                     end if;
                                             
@@ -424,7 +424,14 @@ begin
                                                         end if;   
                                                     end if;
                     
-                  when EB_HDR_PROBE_ID          =>  s_state_RX   <= EB_DONE;  
+                  when EB_HDR_PROBE_ID          =>  if(s_rx_fifo_empty = '0') then
+                                                      s_state_RX   <= EB_HDR_PROBE_RDY;  
+                                                    end if;  
+
+                  when EB_HDR_PROBE_RDY          =>  if(s_state_TX   = RDY) then
+                                                      s_state_RX   <= EB_DONE;  
+                                                    end if;
+                    
                                         
                     when CYC_HDR_REC            =>  if(s_rx_fifo_empty = '0') then
                                                             s_state_RX    <= CYC_HDR_WRITE_PROC;
@@ -531,7 +538,7 @@ begin
                                                     
                                                     
                     when EB_HDR_PROBE_WAIT =>       if(s_EB_probe_wait_cnt  > 3 AND s_tx_fifo_empty = '1' ) then    
-                                                      s_state_TX  <= IDLE;
+                                                      s_state_TX  <= RDY;
                                                     end if;
                     
                                                                            
@@ -631,29 +638,27 @@ begin
             
             
             case s_state_RX   is
-                when IDLE                   =>  s_tx_fifo_clr <= '1';
-                                                s_rx_fifo_clr <= '1';
+                when IDLE                   =>  s_EB_packet_length <= (others => '0');
                                                 s_status_clr  <= '1';
+                                                 
                                             
-                when EB_HDR_REC             =>  if(EB_RX_i.CYC = '1' AND s_rx_fifo_empty = '0') then
-                                                    s_EB_RX_HDR <= to_EB_HDR(s_rx_fifo_q);
-                                                    s_EB_packet_length <= unsigned(byte_count_rx_i)-8;
-                                                    s_rx_fifo_rd              <= '1';    
-                                                end if;
+                when EB_HDR_REC             =>  s_EB_packet_length <= unsigned(byte_count_rx_i)-8; 
+                                                s_EB_RX_HDR <= to_EB_HDR(s_rx_fifo_q);
+                                                s_rx_fifo_rd              <= '1';    
+                                                
                                         
                 when EB_HDR_PROC            =>  null;
                 
                 
-                when EB_HDR_PROBE_ID        =>  if(EB_RX_i.CYC = '1' AND s_rx_fifo_empty = '0') then
-                                                    PROBE_ID <= s_rx_fifo_q;
-                                                    s_rx_fifo_rd              <= '1';    
-                                                end if;
+                when EB_HDR_PROBE_ID        =>  PROBE_ID <= s_rx_fifo_q;
+                                                s_rx_fifo_rd              <= '1';    
+                
+                when EB_HDR_PROBE_RDY       =>  null;                                
                                                
                                     
-                when CYC_HDR_REC            =>  if(s_rx_fifo_empty = '0') then
-                                                    s_EB_RX_CUR_CYCLE    <= TO_EB_CYC(s_rx_fifo_q);
+                when CYC_HDR_REC            =>  s_EB_RX_CUR_CYCLE    <= TO_EB_CYC(s_rx_fifo_q);
                                                     s_rx_fifo_rd <= '1';
-                                                end if;
+                                                
                                         
                 when CYC_HDR_WRITE_PROC     =>  if(s_EB_RX_CUR_CYCLE.WR_CNT > 0) then
                                                 --setup word counters
@@ -661,10 +666,9 @@ begin
                                                 end if;
                                             
                 
-                when CYC_HDR_WRITE_GET_ADR  =>  if(s_rx_fifo_am_empty = '0') then
-                                                    s_WB_addr_cnt     <= unsigned(s_rx_fifo_q);
-                                                    s_rx_fifo_rd     <= '1'; -- only stall RX if we got an adress, otherwise continue listening
-                                                end if;
+                when CYC_HDR_WRITE_GET_ADR  =>  s_WB_addr_cnt     <= unsigned(s_rx_fifo_q);
+                                                s_rx_fifo_rd     <= '1'; -- only stall RX if we got an adress, otherwise continue listening
+                                                
                                                 
                 when WB_WRITE_RDY           =>  if(s_state_TX   = RDY) then
                                                     s_WB_CYC     <= '1';
@@ -716,11 +720,10 @@ begin
                                                     
                                                 end if;
                 
-                when CYC_HDR_READ_GET_ADR   =>  if(s_rx_fifo_am_empty = '0') then
-                                                    --wait for ready from tx output
+                when CYC_HDR_READ_GET_ADR   =>  --wait for ready from tx output
                                                     s_EB_TX_base_wr_adr     <= s_rx_fifo_q;
                                                     s_rx_fifo_rd     <= '1';
-                                                end if;
+                                               
                                                 
                                                 
                 when WB_READ_RDY            =>  if(s_state_TX   = RDY) then
@@ -764,10 +767,15 @@ begin
                 when EB_DONE                =>  --report "EB: PACKET COMPLETE" severity note;
                                                 --TODO: test multi packet mode
                                                 s_WB_CYC <= NOT s_EB_RX_CUR_CYCLE.DROP_CYC;
+                                                s_tx_fifo_clr <= '1';
+                                                s_rx_fifo_clr <= '1';
+                                                  
                                                 --make sure there is no running transfer before resetting FSMs, also do not start a new packet proc before cyc has been lowered
 
                 when ERROR                  =>  report "EB: ERROR" severity warning;
                                                 s_WB_CYC <= '0';
+                                                s_tx_fifo_clr <= '1';
+                                                s_rx_fifo_clr <= '1';  
             end case;
         
         
diff --git a/hdl/EB_SPEC_Test/EB_CORE.vhd b/hdl/EB_SPEC_Test/EB_CORE.vhd
index ed522cc..05dd8db 100644
--- a/hdl/EB_SPEC_Test/EB_CORE.vhd
+++ b/hdl/EB_SPEC_Test/EB_CORE.vhd
@@ -161,8 +161,8 @@ signal RXCTRL_2_EB_wb_slave 		: wb32_slave_in;
 signal	EB_RX_i	:		t_wrf_sink_in;
 signal	EB_RX_o	:		t_wrf_sink_out;
 
-signal	EB_TX_i	:		wb16_master_in;
-signal	EB_TX_o	:		wb16_master_out;
+signal	EB_TX_i	:		t_wrf_source_in;
+signal	EB_TX_o	:		t_wrf_source_out;
 
 component binary_sink is
 generic(filename : string := "123.pcap";  wordsize : natural := 64; endian : natural := 0);
@@ -189,17 +189,26 @@ port(
 		wb_slave_i			: in	wb32_slave_in;
 		wb_slave_o			: out	wb32_slave_out;
 
-		TX_master_o     	: out   wb16_master_out;	--! Wishbone master output lines
-		TX_master_i     	: in    wb16_master_in;    --!
-		
 
-		
-		reply_MAC_i			: in  std_logic_vector(47 downto 0);
-		reply_IP_i			: in  std_logic_vector(31 downto 0);
-		reply_PORT_i		: in  std_logic_vector(15 downto 0);
+    		src_i : in  t_wrf_source_in;
+    		src_o : out t_wrf_source_out;
 
-		TOL_i				: in std_logic_vector(15 downto 0);
+	
+		reply_MAC_i  : in std_logic_vector(6*8-1 downto 0);
+    		reply_IP_i   : in std_logic_vector(4*8-1 downto 0);
+		reply_Port_i : in std_logic_vector(2*8-1 downto 0);
+
+		
+		TOL_i        : in std_logic_vector(2*8-1 downto 0);
 		payload_len_i : in std_logic_vector(2*8-1 downto 0);
+
+		my_mac_i  : in std_logic_vector(6*8-1 downto 0);
+		my_vlan_i : in std_logic_vector(2*8-1 downto 0); 
+		my_ip_i   : in std_logic_vector(4*8-1 downto 0);
+		my_port_i : in std_logic_vector(2*8-1 downto 0);
+
+		
+		
 		valid_i				: in std_logic
 		
 );
@@ -416,8 +425,8 @@ master : if(g_master_slave = "MASTER") generate
 			wb_slave_i	=> EB_2_TXCTRL_wb_slave,
 			wb_slave_o	=> TXCTRL_2_EB_wb_slave,
 
-			TX_master_o     =>	EB_TX_o,
-			TX_master_i     =>  EB_TX_i,  --!
+			src_o     =>	EB_TX_o,
+			src_i     =>  EB_TX_i,  --!
 			
 			reply_MAC_i			=> RXCTRL_2_TXCTRL_reply_MAC, 
 			reply_IP_i			=> RXCTRL_2_TXCTRL_reply_IP,
@@ -425,6 +434,12 @@ master : if(g_master_slave = "MASTER") generate
 
 			TOL_i				=> RXCTRL_2_TXCTRL_TOL,
 			payload_len_i =>  RXCTRL_2_CORE_LEN,
+			
+			my_mac_i  => CFG_MY_MAC,
+		            my_ip_i   => CFG_MY_IP,
+		            my_port_i => CFG_MY_PORT,
+		            my_vlan_i => (others => '0'),
+		            
 			valid_i				=> RXCTRL_2_TXCTRL_valid
 			
 	);
@@ -465,8 +480,8 @@ slave : if(g_master_slave = "SLAVE") generate
 			wb_slave_i	=> EB_2_TXCTRL_wb_slave,
 			wb_slave_o	=> TXCTRL_2_EB_wb_slave,
 
-			TX_master_o     =>	EB_TX_o,
-			TX_master_i     =>  EB_TX_i,  --!
+			src_o     =>	EB_TX_o,
+			src_i     =>  EB_TX_i,  --!
 			
 			reply_MAC_i			=> RXCTRL_2_TXCTRL_reply_MAC, 
 			reply_IP_i			=> RXCTRL_2_TXCTRL_reply_IP,
@@ -474,6 +489,12 @@ slave : if(g_master_slave = "SLAVE") generate
 
 			TOL_i				=> RXCTRL_2_TXCTRL_TOL,
 			payload_len_i =>  RXCTRL_2_CORE_LEN,
+			
+			my_mac_i  => CFG_MY_MAC,
+		            my_ip_i   => CFG_MY_IP,
+		            my_port_i => CFG_MY_PORT,
+		            my_vlan_i => (others => '0'),
+		            
 			valid_i				=> RXCTRL_2_TXCTRL_valid
 			
 	);
diff --git a/hdl/EB_SPEC_Test/EB_RX_CTRL.vhd b/hdl/EB_SPEC_Test/EB_RX_CTRL.vhd
index 0ef4789..9972057 100644
--- a/hdl/EB_SPEC_Test/EB_RX_CTRL.vhd
+++ b/hdl/EB_SPEC_Test/EB_RX_CTRL.vhd
@@ -163,6 +163,9 @@ signal RX_HDR_slv : std_logic_vector(c_IPV4_HLEN*8-1 downto 0) 		;
 --shift register input and control signals
   signal byte_count : natural range 0 to 1600;
   signal counter_comp : natural range 0 to 1600;
+  
+  
+  
   signal eop : natural range 0 to 1600;	
 
   
@@ -286,7 +289,7 @@ begin
 	end if;
 end process;
 
-
+	
 
 snk_WR <= NOT snk_hdr_fsm.stall AND snk_i.cyc AND snk_i.stb;
 
@@ -460,7 +463,7 @@ begin
 									state <= HEADER;								
 								end if;	
 					
-								when HEADER 	=> 	if(parse = DONE) then
+					when HEADER 	=> 	if(parse = DONE) then
 									eop <= (counter_comp  + to_integer(unsigned(IPV4_RX.IHL)*4) + to_integer(unsigned(UDP_RX.MLEN)) -2);
 									state <= PAYLOAD;
 									--snk_hdr_fsm_STALL <= '1';
@@ -476,32 +479,33 @@ begin
 
 									if(snk_i.cyc = '0') then
 									report("RX:  runt frame (< 64)") severity warning; 										state <= ERRORS;
-									elsif(byte_count =  eop) then
+									elsif(byte_count =  eop AND snk_i.STB = '1' AND snk_payload_conv.stall = '0') then
 										state <= PADDING;
 									end if;
 								else
-									if(snk_i.cyc = '0') then									
-										if(byte_count =  eop) then 											state <= DONE; 
-										elsif(byte_count >  eop) then
-											report("RX: frame too long") severity warning; 												state <= ERRORS;
-										else
-											report("RX: frame cut short") severity warning; 											state <= ERRORS;
+										if(byte_count =  eop AND snk_i.STB = '1' AND snk_payload_conv.stall = '0')  then
+										    state <= DONE; 
+										--elsif(byte_count >  eop AND ) then
+									--		report("RX: frame too long") severity warning; 												state <= ERRORS;
+									--	else
+									--		report("RX: frame cut short") severity warning; 											state <= ERRORS;
 										end if;
 																		
-									end if;
+									--end if;
 								
 									
 								end if;	  					
 					
 					when PADDING	=>	if(snk_i.cyc = '0') then									
 										if(byte_count =  c_ETH_FRAME_MIN_END) then 												state <= DONE; 
-										elsif(byte_count > c_ETH_FRAME_MIN_END) then
+										elsif(byte_count > c_ETH_FRAME_MIN_END +2) then
 											report("RX: frame too long") severity warning; 												state <= ERRORS;
 										else
 											report("RX: frame cut short") severity warning; 											state <= ERRORS;
 										end if;
 									end if;
-					when DONE	=>	parser_reset <= '1'; state <= IDLE;
+					when DONE	=>	parser_reset <= '1';  state <= IDLE;
+			
 					when ERRORS     =>	parser_reset <= '1'; state <= IDLE;
  					when others     =>	parser_reset <= '1'; state <= IDLE;
 			end case;
diff --git a/hdl/EB_SPEC_Test/EB_TX_CTRL.vhd b/hdl/EB_SPEC_Test/EB_TX_CTRL.vhd
index d08b464..3033572 100644
--- a/hdl/EB_SPEC_Test/EB_TX_CTRL.vhd
+++ b/hdl/EB_SPEC_Test/EB_TX_CTRL.vhd
@@ -37,6 +37,11 @@ library work;
 use work.EB_HDR_PKG.all;
 use work.wb32_package.all;
 use work.wb16_package.all;
+use work.wr_fabric_pkg.all;
+
+
+    
+
 
 entity EB_TX_CTRL is
 port(
@@ -47,17 +52,25 @@ port(
 		wb_slave_i			: in	wb32_slave_in;
 		wb_slave_o			: out	wb32_slave_out;
 
-		TX_master_o     	: out   wb16_master_out;	--! Wishbone master output lines
-		TX_master_i     	: in    wb16_master_in;    --!
-		
+
+    		src_i : in  t_wrf_source_in;
+    		src_o : out t_wrf_source_out;
+
+	
+		reply_MAC_i  : in std_logic_vector(6*8-1 downto 0);
+    		reply_IP_i   : in std_logic_vector(4*8-1 downto 0);
+		reply_Port_i : in std_logic_vector(2*8-1 downto 0);
 
 		
-		reply_MAC_i			: in  std_logic_vector(47 downto 0);
-		reply_IP_i			: in  std_logic_vector(31 downto 0);
-		reply_PORT_i		: in  std_logic_vector(15 downto 0);
+		TOL_i        : in std_logic_vector(2*8-1 downto 0);
+		payload_len_i : in std_logic_vector(2*8-1 downto 0);
+
+		my_mac_i  : in std_logic_vector(6*8-1 downto 0);
+		my_vlan_i : in std_logic_vector(2*8-1 downto 0); 
+		my_ip_i   : in std_logic_vector(4*8-1 downto 0);
+		my_port_i : in std_logic_vector(2*8-1 downto 0);
 
-		TOL_i				: in std_logic_vector(15 downto 0);
-		payload_len_i : in std_logic_vector(15 downto 0);
+		
 		
 		valid_i				: in std_logic
 		
@@ -129,44 +142,48 @@ port(
 );
   end component;
   
-signal conv_B    : wb16_master_out;	--! Wishbone master output lines
+
 signal conv_A    : wb32_slave_out;    --!
 
 -- main FSM
-type st is (IDLE, CALC_CHKSUM, WAIT_SEND_REQ, HDR_SEND, PAYLOAD_SEND, WAIT_IFGAP);
-signal state_tx 		: st := IDLE;
+type st is (IDLE, CALC_CHKSUM, WAIT_SEND_REQ, PREP_ETH, ETH, IPV4, UDP, HDR_SEND, PAYLOAD_SEND, PADDING, WAIT_IFGAP);
+signal state 		: st := IDLE;
 
--- convert shift register input from hdr records to standard logic vectors and join them
 signal ETH_TX 			: ETH_HDR;
 signal IPV4_TX 			: IPV4_HDR;
 signal UDP_TX 			: UDP_HDR;
-signal TX_HDR_slv 		: std_logic_vector((c_ETH_HLEN + c_IPV4_HLEN + c_UDP_HLEN) * 8-1 downto 0);
-alias  ETH_TX_slv 		: std_logic_vector(c_ETH_HLEN*8-1 downto 0) 	is TX_HDR_slv((c_ETH_HLEN + c_IPV4_HLEN + c_UDP_HLEN)*8-1 downto (c_IPV4_HLEN + c_UDP_HLEN)*8);
-alias  IPV4_TX_slv 		: std_logic_vector(c_IPV4_HLEN*8-1 downto 0) 	is TX_HDR_slv((c_IPV4_HLEN + c_UDP_HLEN)*8-1 downto c_UDP_HLEN*8);
-alias  UDP_TX_slv 		: std_logic_vector(c_UDP_HLEN*8-1 downto 0) 	is TX_HDR_slv(c_UDP_HLEN*8-1 downto 0);
+
+signal TX_HDR_slv : std_logic_vector(c_IPV4_HLEN*8 -1 downto 0);
+
 
 --shift register output and control signals
-signal s_out 			: std_logic_vector(31 downto 0);
+signal byte_count : natural range 0 to 1600;
+signal counter_comp : natural range 0 to 1600;
+  
+  
+  
+  signal eop : natural range 0 to 1600;	
+
 signal sh_hdr_en 		: std_logic;
 signal s_sh_hdr_en : std_logic;
 signal ld_hdr		: std_logic;
-signal counter_ouput	: unsigned(7 downto 0);
+signal hdr_empty 	: std_logic;
+signal hdr_full 	: std_logic;
 
 signal chksum_empty 	: std_logic;
-signal hdr_empty 	: std_logic;
 signal chksum_full 	: std_logic;
-signal hdr_full 	: std_logic;
+
 
 
 -- forking the bus
-type stmux is (HEADER, PAYLOAD);
+type stmux is (HEADER, PAYLOAD, PADDING, NONE);
 signal state_mux		: stmux := HEADER;
-signal  TX_hdr_o 		: wb16_master_out;	--! Wishbone master output lines
+
 signal  wb_payload_stall_o 		: wb32_slave_out;
 signal 	stalled  		: std_logic;
 
 -- IP checksum generator
-signal 	counter_chksum	: unsigned(7 downto 0);
+
 signal 	p_chk_vals		: std_logic_vector(95 downto 0);
 signal  s_chk_vals		: std_logic_vector(15 downto 0);
 signal 	IP_chk_sum		: std_logic_vector(15 downto 0);
@@ -175,46 +192,69 @@ signal  calc_chk_en		: std_logic;
 signal  ld_p_chk_vals	: std_logic;            --parallel load
 signal 	chksum_done 	: std_logic;
 
-signal DEBUG_cmp_chksum : IPV4_HDR;
-
-signal PISO_STALL : std_logic;
-
-function calc_ip_chksum(input : IPV4_HDR)
-return IPV4_HDR is
-    variable tmp : unsigned(c_IPV4_HLEN*8-1 downto 0); 
-	variable output : IPV4_HDR;
-	variable tmp_sum : unsigned(31 downto 0) := (others => '0');
-	variable tmp_slice : unsigned(15 downto 0);
-	begin
- 		tmp := unsigned(to_std_logic_vector(input));
-		for i in c_IPV4_HLEN*8/16-1 downto 0 loop 
-			tmp_slice := tmp((i+1)*16-1 downto i*16);
-			tmp_sum := tmp_sum + (x"0000" & tmp_slice); 
-		end loop;
-		tmp_sum := (x"0000" & tmp_sum(15 downto 0)) + (x"0000" + tmp_sum(31 downto 16));
-		output.SUM := std_logic_vector(NOT(tmp_sum(15 downto 0) + tmp_sum(31 downto 16)));
-	return output;
-end function calc_ip_chksum; 
+
+signal s_src_o : t_wrf_source_out;
+signal s_src_hdr_o 	: t_wrf_source_out;
+signal s_src_payload_o  : t_wrf_source_out;
+signal s_src_padding_o  : t_wrf_source_out;
+
+signal payload_stall : std_logic;
+signal hdr_wait : std_logic;
+
+signal hdr_done : std_logic;
+
 
 begin
 
-ETH_TX_slv	<= TO_STD_LOGIC_VECTOR(ETH_TX);
-IPV4_TX_slv	<= TO_STD_LOGIC_VECTOR(IPV4_TX);
-UDP_TX_slv	<= TO_STD_LOGIC_VECTOR(UDP_TX);
 
+count_tx_bytes : process(clk_i)
+begin
+	if rising_edge(clk_i) then
+		if (nRST_i = '0' or state = IDLE) then		
+			byte_count <= 0;
+		else		
+			if(s_src_o.stb = '1' and s_src_o.cyc = '1' and src_i.stall = '0') then
+				byte_count <= byte_count + 2;	
+			end if;
+			
+		end if;		 
+		
+	end if;
+end process;
 
+
+-- source output mapping to source output signals
+src_o.cyc <= '0' when state_mux = NONE
+	else '1';
+
+src_o.stb <= s_src_o.stb;
+src_o.dat <= s_src_o.dat;
+src_o.sel <= "11";
+src_o.adr <= c_WRF_DATA;	
+src_o.we <= '1';
+
+-- source mux
 MUX_TX : with state_mux select 
-TX_master_o	<=  conv_B	when PAYLOAD,
-				TX_hdr_o 						when others;
+s_src_o	<=  	s_src_hdr_o 	when HEADER,
+		s_src_payload_o when PAYLOAD,
+		s_src_padding_o when PADDING,
+		s_src_padding_o when others;
 
-MUX_WB : with state_mux select
-wb_slave_o <=	conv_A when others; --wb_payload_stall_o when HEADER,
-							 
-				
 
-MUX_PISO : with state_mux select
-PISO_STALL <=	'1' when HEADER,
-				TX_master_i.STALL when others;
+-- wb_slave mux
+MUX_WB : with state_mux select 
+wb_slave_o.STALL <= conv_A.STALL when PAYLOAD,
+                    '1' when others; 
+
+wb_slave_o.ACK <= conv_A.ACK;
+wb_slave_o.ERR <= conv_A.ERR;
+wb_slave_o.RTY <= '0';
+wb_slave_o.DAT <= (others => '0');
+
+
+s_sh_hdr_en <= s_src_hdr_o.cyc and s_src_hdr_o.stb and not src_i.stall;
+
+			
 			
 				
 shift_hdr_chk_sum : piso_flag generic map( 96, 16)
@@ -224,8 +264,8 @@ port map ( d_i         => p_chk_vals,
            nRST_i      => nRST_i,
            en_i        => sh_chk_en,
            ld_i       	=> ld_p_chk_vals, 
-					 full_o	   => chksum_full,
-					 empty_o		=> chksum_empty
+	 full_o	   => chksum_full,
+	 empty_o		=> chksum_empty
 );
 
 p_chk_vals		<= x"C511" & IPV4_TX.SRC & IPV4_TX.DST & IPV4_TX.TOL;
@@ -242,16 +282,16 @@ chksum_generator: EB_checksum port map ( clk_i  => clk_i,
 
 
 
-Shift_out: piso_flag generic map ((c_ETH_HLEN + c_IPV4_HLEN + c_UDP_HLEN)*8, 16)
-                        port map ( d_i         => TX_HDR_slv ,
-                                   q_o         => TX_hdr_o.DAT,
+Shift_out: piso_flag generic map (c_IPV4_HLEN*8, 16)
+                        port map ( d_i         => TX_HDR_slv,
+                                   q_o         => s_src_hdr_o.DAT,
                                    clk_i       => clk_i,
                                    nRST_i      => nRST_i,
                                    en_i        => s_sh_hdr_en,
                                    ld_i       	=> ld_hdr, 
-								   full_o	   => hdr_full,
-									empty_o		=> hdr_empty
-								   );
+				full_o	   => hdr_full,
+				empty_o		=> hdr_empty
+				  );
 
 
 
@@ -260,7 +300,7 @@ Shift_out: piso_flag generic map ((c_ETH_HLEN + c_IPV4_HLEN + c_UDP_HLEN)*8, 16)
 			
 -- convert streaming input from 16 to 32 bit data width
 uut: WB_bus_adapter_streaming_sg generic map (   g_adr_width_A => 32,
-                                                 g_adr_width_B => 32,
+                                                 g_adr_width_B => 2,
                                                  g_dat_width_A => 32,
                                                  g_dat_width_B => 16,
                                                  g_pipeline    =>  3)
@@ -277,28 +317,21 @@ uut: WB_bus_adapter_streaming_sg generic map (   g_adr_width_A => 32,
                                                  A_RTY_o       => conv_A.RTY,
                                                  A_STALL_o     => conv_A.STALL,
                                                  A_DAT_o       => conv_A.DAT,
-                                                 B_CYC_o       => conv_B.CYC,
-                                                 B_STB_o       => conv_B.STB,
-                                                 B_ADR_o       => conv_B.ADR,
-                                                 B_SEL_o       => conv_B.SEL,
-                                                 B_WE_o        => conv_B.WE,
-                                                 B_DAT_o       => conv_B.DAT,
-                                                 B_ACK_i       => TX_master_i.ACK,
-                                                 B_ERR_i       => TX_master_i.ERR,
-                                                 B_RTY_i       => TX_master_i.RTY,
-                                                 B_STALL_i     => PISO_STALL,
-                                                 B_DAT_i       => TX_master_i.DAT); 
-
-
-
+                                                 B_CYC_o       => s_src_payload_o.cyc,
+                                                 B_STB_o       => s_src_payload_o.stb,
+                                                 B_ADR_o       => s_src_payload_o.adr,
+                                                 B_SEL_o       => s_src_payload_o.sel,
+                                                 B_WE_o        => open,
+                                                 B_DAT_o       => s_src_payload_o.dat,
+                                                 B_ACK_i       => src_i.ack,
+                                                 B_ERR_i       => src_i.err,
+                                                 B_RTY_i       => src_i.rty,
+                                                 B_STALL_i     => src_i.stall,
+                                                 B_DAT_i       => (others => '0')); 
 
 
-TX_hdr_o.STB <= '1' when state_tx = HDR_SEND AND hdr_empty = '0'
-else '0';
 
 
-s_sh_hdr_en 	<= TX_hdr_o.STB AND NOT TX_master_i.STALL;
-
 
 main_fsm : process(clk_i)
 begin
@@ -308,113 +341,133 @@ begin
 	   -- SYNC RESET                         
        --========================================================================== 
 		if (nRST_i = '0') then
-			ETH_TX 					<= INIT_ETH_HDR(c_MY_MAC);
-			IPV4_TX 				<= INIT_IPV4_HDR(c_MY_IP);
-			UDP_TX 					<= INIT_UDP_HDR(c_EB_PORT);
-			
-			IPV4_TX.TOL 			<= std_logic_vector(to_unsigned(112, 16));
+			ETH_TX 				<= INIT_ETH_HDR (my_mac_i);
+			IPV4_TX 			<= INIT_IPV4_HDR(my_ip_i);
+			UDP_TX 				<= INIT_UDP_HDR (my_port_i);
 			
-			TX_hdr_o.CYC 			<= '0';
-			--TX_hdr_o.STB 			<= '0';
-			TX_hdr_o.WE 			<= '1';
-			TX_hdr_o.ADR 			<= (others => '0');
-			TX_hdr_o.SEL  			<= (others => '1');
 			
-			wb_payload_stall_o.STALL <= '1';
-			wb_payload_stall_o.ACK 	<= '0';
-			wb_payload_stall_o.DAT 	<= (others => '0');
-			wb_payload_stall_o.ERR 	<= '0';
-			wb_payload_stall_o.RTY 	<= '0';
+			state_mux			<= NONE;
 			
-			state_mux				<= HEADER;
 			
-			sh_hdr_en 				<= '0';
+			sh_hdr_en 			<= '0';
 			ld_hdr 				<= '0';
-			stalled 				<= '0';
-			counter_ouput 			<= (others => '0');
-			counter_chksum			<= (others => '0');
-			 -- prepare chk sum field_tx_hdr, fill in reply IP and TOL field_tx_hdr when available
+			
+
 			ld_p_chk_vals			<= '0';
-			sh_chk_en				<= '0';
+			sh_chk_en			<= '0';
 			calc_chk_en 			<= '0';
+
+			s_src_padding_o <= 	(cyc => '1',
+                                                stb => '0',
+                                                adr => (others => '0'),
+                                                sel => (others => '1'),
+						we => '1',
+                                  		dat => x"9AD1");
+			
+			s_src_hdr_o.cyc <= 	'1';
+			s_src_hdr_o.stb <= 	'0';
+			s_src_hdr_o.adr <= (others => '0');
+			s_src_hdr_o.we 	<= '1';
+			s_src_hdr_o.sel <= (others => '1');	
+                        TX_HDR_slv <= (others => '0');  	                     
+                                                
 		else
 			
-			--TX_hdr_o.STB 			<= '0';
 			
 			ld_hdr 				<= '0';
-			sh_hdr_en 	  			<= '0';
+			sh_hdr_en 	  		<= '0';
 			
 			ld_p_chk_vals			<= '0';
 			sh_chk_en				<= '0';
 			calc_chk_en				<= '0';
 			
-			case state_tx is
-				when IDLE 			=>  ETH_TX 				<= INIT_ETH_HDR (c_MY_MAC);
-										IPV4_TX 			<= INIT_IPV4_HDR(c_MY_IP);
-										UDP_TX 				<= INIT_UDP_HDR (c_EB_PORT);
-										state_mux			<= HEADER;
-										counter_chksum 		<= (others => '0');
-										counter_ouput 		<= (others => '0');
-										
-										if(valid_i = '1') then
-											ETH_TX.DST  	<= reply_MAC_i;
-											IPV4_TX.DST		<= reply_IP_i;
-											IPV4_TX.TOL		<= TOL_i;
-											UDP_TX.MLEN		<= payload_len_i;	
-											UDP_TX.DST_PORT	<= reply_PORT_i;
-											ld_p_chk_vals	<= '1';
-											state_tx 		<= CALC_CHKSUM;		
-										end if;
-				
-				when CALC_CHKSUM	=>	if(chksum_empty = '0') then
-											sh_chk_en <= '1';
-											calc_chk_en 	<= '1';
-											counter_chksum 	<= counter_chksum +1;
-										else
-											if(chksum_done = '1') then
-												DEBUG_cmp_chksum <= calc_ip_chksum(IPV4_TX);
-												IPV4_TX.SUM	<= IP_chk_sum;
-												ld_hdr 	<= '1';
-												state_tx 	<= WAIT_SEND_REQ;
-											end if;
-										end if;	
-				
-				when WAIT_SEND_REQ	=>	state_mux	<= HEADER;	
-										if(wb_slave_i.CYC = '1') then
-											TX_hdr_o.CYC 	<= '1';
-											--TX_hdr_o.STB 	<= '1';
-											
-											state_tx 		<= HDR_SEND;
-										end if;
+			case state is
+				when IDLE 			=>  	state_mux			<= NONE;
+									
+									if(valid_i = '1') then
+										ETH_TX.DST  	<= reply_MAC_i;
+										IPV4_TX.DST	<= reply_IP_i;
+										IPV4_TX.TOL	<= TOL_i;
+										UDP_TX.MLEN	<= payload_len_i;	
+										UDP_TX.DST_PORT	<= reply_PORT_i;
 										
+										ld_p_chk_vals	<= '1';
+										state 	<= CALC_CHKSUM;		
+									end if;
 				
-				when HDR_SEND		=> 	if(hdr_empty = '0') then
-											--TX_hdr_o.STB <= '1';
-											if(TX_master_i.STALL = '0') then
+				when CALC_CHKSUM	=>		if(chksum_empty = '0') then
+										sh_chk_en <= '1';
+										calc_chk_en 	<= '1';
+									else
+										if(chksum_done = '1') then
+											IPV4_TX.SUM	<= IP_chk_sum;
+											ld_hdr 	<= '1';
+											state 	<= WAIT_SEND_REQ;
 												
-												sh_hdr_en 	<= '1';
-												counter_ouput <= counter_ouput +1;	
-											end if;											
-										
-										else
-											state_mux    	<= PAYLOAD;
-											state_tx 		<= PAYLOAD_SEND;		
 										end if;
+									end if;	
+				
+				when WAIT_SEND_REQ	=>		if(wb_slave_i.CYC = '1') then
+										state 		<= PREP_ETH;
+										state_mux	<= HEADER;
+									end if;
+				
 
-				when PAYLOAD_SEND	=>  if(wb_slave_i.CYC = '0' AND conv_B.STB = '0' AND TX_master_i.STALL = '0') then
-											state_tx 		<= WAIT_IFGAP;
-											state_mux 		<= HEADER;	
-											TX_hdr_o.CYC <= '0';
-										end if;
+									                              
+				when PREP_ETH		=>	TX_HDR_slv(TX_HDR_slv'left downto TX_HDR_slv'length-c_ETH_HLEN*8) <= to_std_logic_vector(ETH_TX);
+								ld_hdr <= '1';
+								state 		<= ETH;			
+				  
+				when ETH		=>	
+								s_src_hdr_o.stb <= '1';
+								if(byte_count = c_ETH_end and src_i.stall = '0') then
+									TX_HDR_slv <= to_std_logic_vector(IPV4_TX);
+									ld_hdr <= '1';									
+									state 		<= IPV4;
+									s_src_hdr_o.stb <= '0';
+								end if;
+
+				when IPV4		=> 	s_src_hdr_o.stb <= '1';
+								if((byte_count = (c_ETH_end + c_IPV4_HLEN)) and src_i.stall = '0') then
+									TX_HDR_slv(TX_HDR_slv'left downto TX_HDR_slv'length-c_UDP_HLEN*8) <= to_std_logic_vector(UDP_TX);
+									ld_hdr <= '1';									
+									state 		<= UDP;
+									s_src_hdr_o.stb <= '0';
+								end if;
+
+				when UDP		=> 	s_src_hdr_o.stb <= '1';
+								if(byte_count = (c_ETH_end + c_IPV4_HLEN + c_UDP_HLEN) and src_i.stall = '0') then
+									state 		<= HDR_SEND;
+									s_src_hdr_o.stb <= '0';
+								end if;	
+				
+				when HDR_SEND		=> 	state_mux    	<= PAYLOAD;
+								state 		<= PAYLOAD_SEND;		
+								
+
+				when PAYLOAD_SEND	=>  	if( s_src_payload_o.cyc = '0') then
+									if(byte_count  <  c_ETH_FRAME_MIN_END) then
+										state 		<= PADDING;
+										state_mux 	<= PADDING;	
+									else
+										state 		<= WAIT_IFGAP;
+										state_mux 	<= NONE;
+									end if;
+								end if;	
+				
+				when PADDING	=>  		if(byte_count  >=  c_ETH_FRAME_MIN_END) then
+									state 	  <= WAIT_IFGAP;
+									state_mux <= NONE;	
+								end if;
 				
 				when WAIT_IFGAP		=>	--ensure interframe gap
-										if(counter_ouput < 10) then
-											counter_ouput 	<= counter_ouput +1;
-										else
-											state_tx 		<= IDLE;
-										end if;
+								--if(counter_ouput < 10) then
+								--	counter_ouput 	<= counter_ouput +1;
+								--else
+									state 		<= IDLE;
+								--end if;
 	
-				when others =>			state_tx <= IDLE;			
+				when others =>			state <= IDLE;			
 			
 			
 			end case;
diff --git a/hdl/EB_SPEC_Test/eb_config_new.vhd b/hdl/EB_SPEC_Test/eb_config_new.vhd
index fb398bf..4b31430 100644
--- a/hdl/EB_SPEC_Test/eb_config_new.vhd
+++ b/hdl/EB_SPEC_Test/eb_config_new.vhd
@@ -68,12 +68,13 @@ signal local_write_reg : std_logic_vector(31 downto 0);
 signal status_reg : std_logic_vector(63 downto 0);
 signal p_auto_cfg : std_logic_vector(63 downto 0);
 
-signal my_mac : std_logic_vector(47 downto 0);
-signal my_ip : std_logic_vector(31 downto 0);
-
-constant c_my_default_ip 	: std_logic_vector(31 downto 0) 	:= x"C0A80064";
-constant c_my_default_mac 	: std_logic_vector(47 downto 0) 	:= x"D15EA5EDBEEF";
+signal my_mac : std_logic_vector(6*8-1 downto 0);
+signal my_ip : std_logic_vector(4*8-1  downto 0);
+signal my_port : std_logic_vector(2*8-1  downto 0);
 
+constant c_my_default_mac 	: std_logic_vector(6*8-1  downto 0) 	:= x"D15EA5EDBEEF";
+constant c_my_default_ip 	: std_logic_vector(4*8-1  downto 0) 	:= x"C0A80064";
+constant c_my_default_port 	: std_logic_vector(2*8-1  downto 0) 	:= x"EBD0";
 
 begin
  
@@ -85,6 +86,7 @@ local_adr <= to_integer(unsigned(local_slave_i.ADR(7 downto 0)));
 
 my_mac_o <= my_mac;
 my_ip_o <= my_ip;
+my_port_o <= my_port;
 
 local_slave_o.STALL <= eb_slave_i.CYC;
 
@@ -110,7 +112,8 @@ eb_if	:	process (clk_i)
 		    local_slave_o.DAT	<= (others => '0');
 		    
 			my_ip   <= c_my_default_ip;
-			my_mac  <= c_my_default_mac;	
+			my_mac  <= c_my_default_mac;
+			my_port <= c_my_default_port;	
       p_auto_cfg <= (others => '0');
 			  
 		else
@@ -124,6 +127,7 @@ eb_if	:	process (clk_i)
 						when 16		    => my_mac(47 downto 16) <= eb_slave_i.DAT(31 downto 0);
 						when 20		    => my_mac(15 downto 0) <= eb_slave_i.DAT(31 downto 16);
 						when 24		    => my_ip <= eb_slave_i.DAT;
+						when 28		   => my_port 		<= eb_slave_i.DAT(31 downto 16);   
 						when others => null;
 					end case;	
 				else
@@ -135,7 +139,8 @@ eb_if	:	process (clk_i)
 						when 16		    => eb_slave_o.DAT <= my_mac(47 downto 16);
 						when 20		    => eb_slave_o.DAT <= (my_mac(15 downto 0) & std_logic_vector(to_unsigned(0, 16)));
 						when 24		    => eb_slave_o.DAT <= my_ip;
-						    
+						when 28		   => eb_slave_o.DAT 		<= my_port & std_logic_vector(to_unsigned(0, 16));    
+						   
 						when others => eb_slave_o.DAT <= status_reg(63 downto 32);
 					end case;	
 				end if;	
@@ -152,6 +157,7 @@ eb_if	:	process (clk_i)
 						when 16		=> my_mac(47 downto 16) 	<= local_write_reg(31 downto 0);
 						when 20		=> my_mac(15 downto 0) 		<= local_write_reg(31 downto 16);
 						when 24		=> my_ip 			<= local_write_reg;
+						when 28		=> my_port 		<= local_write_reg(31 downto 16); 
 						when others 	=> null;
 					end case;	
 				else
@@ -163,7 +169,7 @@ eb_if	:	process (clk_i)
 						when 16		=> local_slave_o.DAT 		<= my_mac(47 downto 16);
 						when 20		=> local_slave_o.DAT 		<= my_mac(15 downto 0) & std_logic_vector(to_unsigned(0, 16));
 						when 24		=> local_slave_o.DAT 		<= my_ip;
-						    
+						when 28		=> local_slave_o.DAT 		<= my_port & std_logic_vector(to_unsigned(0, 16)) ;   
 						when others 	=> local_slave_o.DAT <= status_reg(63 downto 32);
 					end case;	
 				end if;	
-- 
GitLab