From c1ef8370ff28009d6169aefba10eab39d3748edc Mon Sep 17 00:00:00 2001
From: donker <donker@astron.nl>
Date: Thu, 12 Mar 2020 16:48:10 +0100
Subject: [PATCH] some cleanup

---
 .../src/vhdl/unb2b_arp_ping.vhd               |  22 +++-
 libraries/io/eth1g/src/vhdl/eth1g_master.vhd  | 114 +++++++++---------
 2 files changed, 77 insertions(+), 59 deletions(-)

diff --git a/boards/uniboard2b/designs/unb2b_arp_ping/src/vhdl/unb2b_arp_ping.vhd b/boards/uniboard2b/designs/unb2b_arp_ping/src/vhdl/unb2b_arp_ping.vhd
index a4879bc8fa..9148fff223 100644
--- a/boards/uniboard2b/designs/unb2b_arp_ping/src/vhdl/unb2b_arp_ping.vhd
+++ b/boards/uniboard2b/designs/unb2b_arp_ping/src/vhdl/unb2b_arp_ping.vhd
@@ -97,6 +97,9 @@ ARCHITECTURE str OF unb2b_arp_ping IS
   SIGNAL st_rst                     : STD_LOGIC;
   SIGNAL st_clk                     : STD_LOGIC;
 
+  SIGNAL app_led_red                : STD_LOGIC := '1';
+  SIGNAL app_led_green              : STD_LOGIC := '0';
+
   -- PIOs
   SIGNAL pout_wdi                   : STD_LOGIC := '0';
   SIGNAL wdi_cnt                    : INTEGER := 0;
@@ -203,7 +206,9 @@ BEGIN
     g_factory_image           => g_factory_image,
     g_udp_offload             => g_sim,            -- use g_udp_offload to enable ETH instance in simulation
     g_udp_offload_nof_streams => 3,                -- use g_udp_offload, but no UDP offload streams
-    g_protect_addr_range      => g_protect_addr_range
+    g_protect_addr_range      => g_protect_addr_range,
+    g_app_led_red             => TRUE,
+    g_app_led_green           => TRUE
   )
   PORT MAP (
     -- Clock an reset signals
@@ -221,6 +226,9 @@ BEGIN
     dp_rst_in                => st_rst,
     dp_clk_in                => st_clk,
 
+    app_led_red              => app_led_red,
+    app_led_green            => app_led_green,
+
     -- Toggle WDI
     pout_wdi                 => pout_wdi,
 
@@ -323,9 +331,21 @@ BEGIN
 
   eth1g_mm_rst <= mm_rst;
 
+  -- led control
+  p_led : PROCESS(eth1g_reg_interrupt)
+  BEGIN
+    IF rising_edge(eth1g_reg_interrupt) THEN
+      app_led_red <= '0';
+      app_led_green <= NOT app_led_green;
+    END IF;
+  END PROCESS;
+
 
   --u_eth1g_master : ENTITY eth1g_lib.eth1g_master(beh)
   u_eth1g_master : ENTITY eth1g_lib.eth1g_master(rtl)
+  GENERIC MAP (
+    g_sim         => g_sim
+  )
   PORT MAP (
     mm_rst        => mm_rst,
     mm_clk        => mm_clk,
diff --git a/libraries/io/eth1g/src/vhdl/eth1g_master.vhd b/libraries/io/eth1g/src/vhdl/eth1g_master.vhd
index 79b15d00c8..e60ef6dd0f 100644
--- a/libraries/io/eth1g/src/vhdl/eth1g_master.vhd
+++ b/libraries/io/eth1g/src/vhdl/eth1g_master.vhd
@@ -43,6 +43,9 @@ USE work.eth1g_mem_pkg.ALL;
 
   
 ENTITY eth1g_master IS
+  GENERIC (
+    g_sim         : BOOLEAN := FALSE        -- when true speed up led toggling in simulation
+  );
   PORT (
     mm_rst        : IN  STD_LOGIC;
     mm_clk        : IN  STD_LOGIC;
@@ -114,7 +117,7 @@ ARCHITECTURE rtl OF eth1g_master IS
   TYPE t_state IS (s_rst,
                    s_wr_demux_0, s_wr_demux_1, s_wr_demux_2, s_rd_demux_0, s_rd_demux_1, s_rd_demux_2, 
                    s_wr_config_0, s_wr_config_1, s_wr_config_2, s_wr_config_3, s_wr_control_0,
-                   s_rd_tse_rev, s_wr_tse_if_mode, s_wr_tse_control, s_wr_tse_promis_en, s_wr_tse_mac_0, s_wr_tse_mac_1, s_wr_tse_tx_ipg_len, s_wr_tse_frm_len,
+                   s_rd_tse_rev, s_wr_tse_if_mode, s_rd_tse_control, s_rd_tse_status, s_wr_tse_control, s_wr_tse_promis_en, s_wr_tse_mac_0, s_wr_tse_mac_1, s_wr_tse_tx_ipg_len, s_wr_tse_frm_len,
                    s_wr_tse_rx_section_empty, s_wr_tse_rx_section_full, s_wr_tse_tx_section_empty, s_wr_tse_tx_section_full,
                    s_wr_tse_rx_almost_empty, s_wr_tse_rx_almost_full, s_wr_tse_tx_almost_empty, s_wr_tse_tx_almost_full, 
                    s_wait_interrupt_1, s_wait_interrupt_0, s_rd_payload, s_wr_payload, s_wr_control, s_eth_continue);
@@ -226,20 +229,25 @@ BEGIN
   ram_rd_valid <= lat_ram_vec(c_mem_ram_rd_latency);
 
   
-  p_comb : PROCESS (r, reg_miso, ram_miso, tse_miso, reg_interrupt, mm_init, reg_rd_valid, ram_rd_valid)
+  p_comb : PROCESS (r.state, reg_miso, ram_miso, tse_miso, reg_interrupt, mm_init, reg_rd_valid, ram_rd_valid)
     VARIABLE v : t_reg;
     VARIABLE v_eth_control_word : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0);
   BEGIN
     -- default assignment
     v := r;
 
-    v.tse_mosi.wr := '0';
-    v.tse_mosi.rd := '0';
+    IF tse_miso.waitrequest = '0' THEN
+      v.tse_mosi.wr := '0';
+      v.tse_mosi.rd := '0';
+    END IF;
     v.reg_mosi.wr := '0';
     v.reg_mosi.rd := '0';
     v.ram_mosi.wr := '0';
     v.ram_mosi.rd := '0';
 
+    eth_mm_reg_status  <= c_eth_mm_reg_status_rst;
+    eth_mm_reg_control <= c_eth_mm_reg_control_rst;
+    
     CASE r.state IS
       WHEN s_rst =>
         v := (c_mem_mosi_rst, c_mem_mosi_rst, c_mem_mosi_rst, '1', '1', '0', 0, s_rst); -- reset all
@@ -250,6 +258,7 @@ BEGIN
       WHEN s_wr_demux_0   => proc_eth1g_mem_mm_bus_wr(c_eth_reg_demux_wi+0,   c_udp_port_en+c_udp_port_st0, v.reg_mosi); v.state := s_wr_demux_1;
       WHEN s_wr_demux_1   => proc_eth1g_mem_mm_bus_wr(c_eth_reg_demux_wi+1,   c_udp_port_en+c_udp_port_st1, v.reg_mosi); v.state := s_wr_demux_2;
       WHEN s_wr_demux_2   => proc_eth1g_mem_mm_bus_wr(c_eth_reg_demux_wi+2,   c_udp_port_en+c_udp_port_st2, v.reg_mosi); v.state := s_rd_demux_0;
+      --WHEN s_wr_demux_2   => proc_eth1g_mem_mm_bus_wr(c_eth_reg_demux_wi+2,   c_udp_port_en+c_udp_port_st2, v.reg_mosi); v.state := s_wr_config_0;
       WHEN s_rd_demux_0   =>  -- read back demux_0 settings
         IF lat_reg_rd = '0' THEN proc_eth1g_mem_mm_bus_rd(c_eth_reg_demux_wi+0, v.reg_mosi);
         ELSIF reg_rd_valid = '1' THEN v.state := s_rd_demux_1;
@@ -267,6 +276,7 @@ BEGIN
       WHEN s_wr_config_2  => proc_eth1g_mem_mm_bus_wr(c_eth_reg_config_wi+2,  src_ip,          v.reg_mosi); v.state := s_wr_config_3;
       WHEN s_wr_config_3  => proc_eth1g_mem_mm_bus_wr(c_eth_reg_config_wi+3,  c_udp_port_ctrl, v.reg_mosi); v.state := s_wr_control_0;
       WHEN s_wr_control_0 => proc_eth1g_mem_mm_bus_wr(c_eth_reg_control_wi+0, c_control_rx_en, v.reg_mosi); v.state := s_rd_tse_rev; 
+      --WHEN s_wr_control_0 => proc_eth1g_mem_mm_bus_wr(c_eth_reg_control_wi+0, c_control_rx_en, v.reg_mosi); v.state := s_wr_tse_if_mode; 
       
       -- -- start tse setup -- --
       WHEN s_rd_tse_rev =>
@@ -277,133 +287,121 @@ BEGIN
         v.state := s_wr_tse_if_mode;
 
       WHEN s_wr_tse_if_mode          => 
-        IF tse_miso.waitrequest = '1' THEN
-          v.tse_mosi.rd := '1';
-        ELSE
+        IF tse_miso.waitrequest = '0' THEN
           proc_eth1g_mem_mm_bus_wr(func_tech_tse_map_pcs_addr(16#28#), 16#0008#, v.tse_mosi); 
+          v.state := s_rd_tse_control;
+        END IF;
+
+      WHEN s_rd_tse_control      => 
+        IF tse_miso.waitrequest = '0' THEN
+          proc_eth1g_mem_mm_bus_rd(func_tech_tse_map_pcs_addr(16#00#), v.tse_mosi); 
+          v.state := s_rd_tse_status;
+        END IF;
+      
+      WHEN s_rd_tse_status      => 
+        IF tse_miso.waitrequest = '0' THEN
+          proc_eth1g_mem_mm_bus_rd(func_tech_tse_map_pcs_addr(16#02#), v.tse_mosi); 
           v.state := s_wr_tse_control;
         END IF;
 
       WHEN s_wr_tse_control          => 
-        IF tse_miso.waitrequest = '1' THEN
-          v.tse_mosi.wr := '1';
-        ELSE
-          proc_eth1g_mem_mm_bus_wr(func_tech_tse_map_pcs_addr(16#00#), 16#0140#, v.tse_mosi);  -- PSC control, Auto negotiate disable
-          --proc_eth1g_mem_mm_bus_wr(func_tech_tse_map_pcs_addr(16#00#), 16#1140#, v.tse_mosi);  -- PSC control, Auto negotiate enable
+        IF tse_miso.waitrequest = '0' THEN
+          IF g_sim = TRUE THEN
+            proc_eth1g_mem_mm_bus_wr(func_tech_tse_map_pcs_addr(16#00#), 16#0140#, v.tse_mosi);  -- PSC control, Auto negotiate disable
+          ELSE
+            proc_eth1g_mem_mm_bus_wr(func_tech_tse_map_pcs_addr(16#00#), 16#0140#, v.tse_mosi);  -- PSC control, Auto negotiate disable
+            --proc_eth1g_mem_mm_bus_wr(func_tech_tse_map_pcs_addr(16#00#), 16#1140#, v.tse_mosi);  -- PSC control, Auto negotiate enable
+          END IF;  
           v.state := s_wr_tse_promis_en; 
         END IF;
 
       WHEN s_wr_tse_promis_en        =>
-        IF tse_miso.waitrequest = '1' THEN
-          v.tse_mosi.wr := '1';
-        ELSE
+        IF tse_miso.waitrequest = '0' THEN
           v.tse_psc_access := '0';
-          IF c_promis_en = FALSE THEN proc_eth1g_mem_mm_bus_wr(16#008#, 16#0100004B#, v.tse_mosi);  -- MAC control
-          ELSE                        proc_eth1g_mem_mm_bus_wr(16#008#, 16#0100005B#, v.tse_mosi); END IF;
+          IF c_promis_en = FALSE THEN
+            proc_eth1g_mem_mm_bus_wr(16#008#, 16#0100004B#, v.tse_mosi);  -- MAC control
+          ELSE
+            proc_eth1g_mem_mm_bus_wr(16#008#, 16#0100005B#, v.tse_mosi);
+          END IF;
           v.state := s_wr_tse_mac_0; 
         END IF;
 
       WHEN s_wr_tse_mac_0            => 
-        IF tse_miso.waitrequest = '1' THEN
-          v.tse_mosi.wr := '1';
-        ELSE
+        IF tse_miso.waitrequest = '0' THEN
           proc_eth1g_mem_mm_bus_wr(16#00C#, src_mac_0, v.tse_mosi); -- MAC_0
           v.state := s_wr_tse_mac_1; 
         END IF;
 
       WHEN s_wr_tse_mac_1            => 
-        IF tse_miso.waitrequest = '1' THEN
-          v.tse_mosi.wr := '1';
-        ELSE
+        IF tse_miso.waitrequest = '0' THEN
           proc_eth1g_mem_mm_bus_wr(16#010#, src_mac_1, v.tse_mosi); -- MAC_1 <-- SRC_MAC
           v.state := s_wr_tse_tx_ipg_len;
         END IF;
 
       WHEN s_wr_tse_tx_ipg_len       => 
-        IF tse_miso.waitrequest = '1' THEN
-          v.tse_mosi.wr := '1';
-        ELSE
+        IF tse_miso.waitrequest = '0' THEN
           proc_eth1g_mem_mm_bus_wr(16#05C#, 16#0000000C#, v.tse_mosi);  -- TX_IPG_LENGTH <-- interpacket gap = 12
           v.state := s_wr_tse_frm_len;
         END IF;
       
       WHEN s_wr_tse_frm_len          => 
-        IF tse_miso.waitrequest = '1' THEN
-          v.tse_mosi.wr := '1';
-        ELSE
+        IF tse_miso.waitrequest = '0' THEN
           --proc_eth1g_mem_mm_bus_wr(16#014#, 16#000005EE#, v.tse_mosi);   -- FRM_LENGTH <-- receive max frame length = 1518      
           proc_eth1g_mem_mm_bus_wr(16#014#, 16#0000233A#, v.tse_mosi);   -- FRM_LENGTH <-- receive max frame length = 9018
           v.state := s_wr_tse_rx_section_empty;
         END IF;
       
       WHEN s_wr_tse_rx_section_empty => 
-        IF tse_miso.waitrequest = '1' THEN
-          v.tse_mosi.wr := '1';
-        ELSE
+        IF tse_miso.waitrequest = '0' THEN
           proc_eth1g_mem_mm_bus_wr(16#01C#, c_tech_tse_rx_fifo_depth-16, v.tse_mosi);  -- RX_SECTION_EMPTY <-- default FIFO depth - 16, >3
           v.state := s_wr_tse_rx_section_full;
         END IF;
       
       WHEN s_wr_tse_rx_section_full  => 
-        IF tse_miso.waitrequest = '1' THEN
-          v.tse_mosi.wr := '1';
-        ELSE
+        IF tse_miso.waitrequest = '0' THEN
           proc_eth1g_mem_mm_bus_wr(16#020#, 16, v.tse_mosi);   -- RX_SECTION_FULL  <-- default 16
           v.state := s_wr_tse_tx_section_empty;
         END IF;
       
       WHEN s_wr_tse_tx_section_empty => 
-        IF tse_miso.waitrequest = '1' THEN
-          v.tse_mosi.wr := '1';
-        ELSE
+        IF tse_miso.waitrequest = '0' THEN
           proc_eth1g_mem_mm_bus_wr(16#024#, c_tech_tse_tx_fifo_depth-16, v.tse_mosi);  -- TX_SECTION_EMPTY <-- default FIFO depth - 16, >3
           v.state := s_wr_tse_tx_section_full;
         END IF;
       
       WHEN s_wr_tse_tx_section_full  => 
-        IF tse_miso.waitrequest = '1' THEN
-          v.tse_mosi.wr := '1';
-        ELSE
+        IF tse_miso.waitrequest = '0' THEN
           proc_eth1g_mem_mm_bus_wr(16#028#, 16, v.tse_mosi);  -- TX_SECTION_FULL  <-- default 16, >~ 8 otherwise no tx
           v.state := s_wr_tse_rx_almost_empty;
         END IF;
       
       WHEN s_wr_tse_rx_almost_empty  => 
-        IF tse_miso.waitrequest = '1' THEN
-          v.tse_mosi.wr := '1';
-        ELSE
+        IF tse_miso.waitrequest = '0' THEN
           proc_eth1g_mem_mm_bus_wr(16#02C#, 8, v.tse_mosi);   -- RX_ALMOST_EMPTY  <-- default 8
           v.state := s_wr_tse_rx_almost_full;
         END IF;
       
       WHEN s_wr_tse_rx_almost_full   => 
-        IF tse_miso.waitrequest = '1' THEN
-          v.tse_mosi.wr := '1';
-        ELSE
+        IF tse_miso.waitrequest = '0' THEN
           proc_eth1g_mem_mm_bus_wr(16#030#, 8, v.tse_mosi);  -- RX_ALMOST_FULL   <-- default 8
           v.state := s_wr_tse_tx_almost_empty;
         END IF;
       
       WHEN s_wr_tse_tx_almost_empty  => 
-        IF tse_miso.waitrequest = '1' THEN
-          v.tse_mosi.wr := '1';
-        ELSE
+        IF tse_miso.waitrequest = '0' THEN
           proc_eth1g_mem_mm_bus_wr(16#034#, 8, v.tse_mosi);  -- TX_ALMOST_EMPTY  <-- default 8
           v.state := s_wr_tse_tx_almost_full;
         END IF;
       
       WHEN s_wr_tse_tx_almost_full   => 
-        IF tse_miso.waitrequest = '1' THEN
-          v.tse_mosi.wr := '1';
-        ELSE
+        IF tse_miso.waitrequest = '0' THEN
           proc_eth1g_mem_mm_bus_wr(16#038#, c_tech_tse_tx_ready_latency+3, v.tse_mosi);   -- TX_ALMOST_FULL   <-- default 3
-          v.state := s_wait_interrupt_1; v.tse_init := '0';
+          v.state := s_wait_interrupt_1;
+          v.tse_init := '0';
         END IF;
 
       -- -- start control loop -- --
       WHEN s_wait_interrupt_1 => 
-        eth_mm_reg_status  <= c_eth_mm_reg_status_rst;
-        eth_mm_reg_control <= c_eth_mm_reg_control_rst;
         IF reg_interrupt = '1' THEN
           IF lat_reg_rd = '0' THEN proc_eth1g_mem_mm_bus_rd(c_eth_reg_status_wi+0, v.reg_mosi); -- read status register to read the status
           ELSIF reg_rd_valid = '1' THEN 
@@ -444,8 +442,8 @@ BEGIN
         END IF;
       
       WHEN s_wr_control   => 
-      v_eth_control_word := func_eth_mm_reg_control(eth_mm_reg_control);
-      proc_eth1g_mem_mm_bus_wr(c_eth_reg_control_wi+0, TO_UINT(v_eth_control_word), v.reg_mosi);  v.state := s_eth_continue;
+        v_eth_control_word := func_eth_mm_reg_control(eth_mm_reg_control);
+        proc_eth1g_mem_mm_bus_wr(c_eth_reg_control_wi+0, TO_UINT(v_eth_control_word), v.reg_mosi);  v.state := s_eth_continue;
       WHEN s_eth_continue => proc_eth1g_mem_mm_bus_wr(c_eth_reg_continue_wi, 0, v.reg_mosi);  v.state := s_wait_interrupt_1;  -- write continue register to make the ETH module continue
       WHEN OTHERS => NULL;
     END CASE;
-- 
GitLab