From 60206e72c69266effa776e99f827aace110d0a02 Mon Sep 17 00:00:00 2001
From: "Wesley W. Terpstra" <w.terpstra@gsi.de>
Date: Wed, 2 Nov 2011 18:11:14 +0100
Subject: [PATCH] It is now possible to much more clearly state how async and
 sync differ.

Signed-off-by: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
---
 modules/wishbone/wb_crossbar/xwb_crossbar.vhd | 53 +++++++------------
 1 file changed, 20 insertions(+), 33 deletions(-)

diff --git a/modules/wishbone/wb_crossbar/xwb_crossbar.vhd b/modules/wishbone/wb_crossbar/xwb_crossbar.vhd
index f7d344c4..5b7798aa 100644
--- a/modules/wishbone/wb_crossbar/xwb_crossbar.vhd
+++ b/modules/wishbone/wb_crossbar/xwb_crossbar.vhd
@@ -71,11 +71,11 @@ architecture rtl of xwb_crossbar is
   signal master_oe : t_wishbone_master_out_array(g_num_slaves downto 0);
   signal virtual_ERR : std_logic;
   
-  -- synchronous signals:
-  signal previous : matrix;             -- Previously connected pairs
+  signal matrix_old : matrix; -- Registered connection matrix
+  signal matrix_new : matrix; -- The new values of the matrix
 
-  -- (a)synchronous signals (depending on generic):
-  signal granted : matrix;  -- The connections to form this cycle selected previous bus
+  -- Either matrix_old or matrix_new, depending on g_registered
+  signal granted : matrix;
   
   procedure main_logic(
     signal granted  : out matrix;
@@ -228,24 +228,21 @@ begin
       virtual_ERR <= master_oe(g_num_slaves).CYC and master_oe(g_num_slaves).STB;
     end if;
   end process virtual_error_slave;
-
-  -- If async determine granted devices
-  granted_matrix : if not g_registered generate
-    main_logic(granted, slave_i, previous);
-  end generate;
-
-  granted_driver : if g_registered generate
-    process(clk_sys_i)
-    begin
-      if rising_edge(clk_sys_i) then
-        if rst_n_i = '0' then
-          granted <= (others => (others => '0'));
-        else
-          main_logic(granted, slave_i, granted);
-        end if;
+  
+  -- Copy the matrix to a register:
+  main : process(clk_sys_i)
+  begin
+    if rising_edge(clk_sys_i) then
+      if rst_n_i = '0' then
+        matrix_old <= (others => (others => '0'));
+      else
+        matrix_old <= matrix_new;
       end if;
-    end process;
-  end generate;
+    end if;
+  end process main;
+  
+  -- Is the crossbar combinatorial or registered
+  granted <= matrix_old when g_registered else matrix_new;
 
   -- Make the slave connections
   slave_matrix : for slave in g_num_slaves downto 0 generate
@@ -257,16 +254,6 @@ begin
     master_logic(slave_o(master), master_ie, granted, master);
   end generate;
 
-  -- Store the current grant to the previous registers
-  main : process(clk_sys_i)
-  begin
-    if rising_edge(clk_sys_i) then
-      if rst_n_i = '0' then
-        previous <= (others => (others => '0'));
-      else
-        previous <= granted;
-      end if;
-    end if;
-  end process main;
-  
+  -- The main crossbar logic:
+  main_logic(matrix_new, slave_i, matrix_old);
 end rtl;
-- 
GitLab