From d2b71b651a191f96603385bce23d4112026a2b2d Mon Sep 17 00:00:00 2001
From: Dimitris Lampridis <dimitris.lampridis@cern.ch>
Date: Thu, 5 Mar 2020 16:51:49 +0100
Subject: [PATCH] [hdl] rewrite gc_sync_ffs to use gc_sync and edge detectors
 internally

Signed-off-by: Dimitris Lampridis <dimitris.lampridis@cern.ch>
---
 modules/common/gc_sync_ffs.vhd | 82 +++++++++++++---------------------
 1 file changed, 30 insertions(+), 52 deletions(-)

diff --git a/modules/common/gc_sync_ffs.vhd b/modules/common/gc_sync_ffs.vhd
index 1a1d08c4..d9e1ec9d 100644
--- a/modules/common/gc_sync_ffs.vhd
+++ b/modules/common/gc_sync_ffs.vhd
@@ -31,69 +31,53 @@ entity gc_sync_ffs is
     g_sync_edge : string := "positive");
   port(
     clk_i    : in  std_logic;   -- clock from the destination clock domain
-    rst_n_i  : in  std_logic;   -- reset
+    rst_n_i  : in  std_logic;   -- async reset
     data_i   : in  std_logic;   -- async input
     synced_o : out std_logic;   -- synchronized output
     npulse_o : out std_logic;   -- negative edge detect output
     ppulse_o : out std_logic);  -- positive edge detect output
 end entity gc_sync_ffs;
 
--- make Altera Quartus quiet regarding unknown attributes:
--- altera message_off 10335
-
 architecture arch of gc_sync_ffs is
 
-  signal sync0, sync1, sync2 : std_logic;
-
-  signal gc_sync_ffs_in : std_logic;
-
-  attribute shreg_extract          : string;
-  attribute shreg_extract of sync0 : signal is "no";
-  attribute shreg_extract of sync1 : signal is "no";
-  attribute shreg_extract of sync2 : signal is "no";
-
-  attribute keep          : string;
-  attribute keep of sync0 : signal is "true";
-  attribute keep of sync1 : signal is "true";
-
-  attribute rloc          : string;
-  attribute rloc of sync0 : signal is "X0Y0";
-  attribute rloc of sync1 : signal is "X0Y0";
-
-  attribute keep of gc_sync_ffs_in : signal is "true";
-
-  attribute keep_hierarchy         : string;
-  attribute keep_hierarchy of arch : architecture is "true";
-
-  -- synchronizer attribute for Vivado
-  attribute ASYNC_REG          : string;
-  attribute ASYNC_REG of sync0 : signal is "true";
-  attribute ASYNC_REG of sync1 : signal is "true";
-  attribute ASYNC_REG of sync2 : signal is "true";
+  signal sync, npulse, ppulse : std_logic;
 
 begin
 
-  -- rename data_i to something we can use as wildcard
-  -- in timing constraints
-  gc_sync_ffs_in <= data_i;
+  cmp_gc_sync : entity work.gc_sync
+    generic map (
+      g_sync_edge => g_sync_edge)
+    port map (
+      clk_i     => clk_i,
+      rst_n_a_i => rst_n_i,
+      d_i       => data_i,
+      q_o       => sync);
+
+  cmp_gc_posedge : entity work.gc_posedge
+    port map (
+      clk_i   => clk_i,
+      rst_n_i => rst_n_i,
+      data_i  => sync,
+      pulse_o => ppulse);
+
+  cmp_gc_negedge : entity work.gc_negedge
+    port map (
+      clk_i   => clk_i,
+      rst_n_i => rst_n_i,
+      data_i  => sync,
+      pulse_o => npulse);
 
   sync_posedge : if (g_sync_edge = "positive") generate
     process(clk_i, rst_n_i)
     begin
       if(rst_n_i = '0') then
-        sync0    <= '0';
-        sync1    <= '0';
-        sync2    <= '0';
         synced_o <= '0';
         npulse_o <= '0';
         ppulse_o <= '0';
       elsif rising_edge(clk_i) then
-        sync0    <= gc_sync_ffs_in;
-        sync1    <= sync0;
-        sync2    <= sync1;
-        synced_o <= sync1;
-        npulse_o <= sync2 and not sync1;
-        ppulse_o <= not sync2 and sync1;
+        synced_o <= sync;
+        npulse_o <= npulse;
+        ppulse_o <= ppulse;
       end if;
     end process;
   end generate sync_posedge;
@@ -102,19 +86,13 @@ begin
     process(clk_i, rst_n_i)
     begin
       if(rst_n_i = '0') then
-        sync0    <= '0';
-        sync1    <= '0';
-        sync2    <= '0';
         synced_o <= '0';
         npulse_o <= '0';
         ppulse_o <= '0';
       elsif falling_edge(clk_i) then
-        sync0    <= gc_sync_ffs_in;
-        sync1    <= sync0;
-        sync2    <= sync1;
-        synced_o <= sync1;
-        npulse_o <= sync2 and not sync1;
-        ppulse_o <= not sync2 and sync1;
+        synced_o <= sync;
+        npulse_o <= npulse;
+        ppulse_o <= ppulse;
       end if;
     end process;
   end generate sync_negedge;
-- 
GitLab