]> jspc29.x-matter.uni-frankfurt.de Git - logicbox.git/commitdiff
latest Version of threshold FPGA - FLASH included
authorlocal account <adrian@lxhadeb07.gsi.de>
Thu, 22 Jun 2017 08:28:33 +0000 (10:28 +0200)
committerlocal account <adrian@lxhadeb07.gsi.de>
Thu, 22 Jun 2017 08:28:33 +0000 (10:28 +0200)
code/sedcheck.vhd

index 0c67d6f5d21d7b7e20390eec0c372c7c2770338b..4fb94f5d3f52a13231ebe725fad8c5b4efb8b55b 100644 (file)
-library ieee;
-use ieee.std_logic_1164.all;
-use ieee.numeric_std.all;
-
-library work;
-use work.trb_net_std.all;
-
-library ecp5um;
-use ecp5um.components.all;
-
-entity sedcheck is
-  port(
-    CLK        : in std_logic;
-    ERROR_OUT  : out std_logic;
-    
-    CONTROL_IN : in std_logic_vector(3 downto 0);
-    DEBUG      : out std_logic_vector(31 downto 0)
-    );
-end entity;
-
-
-architecture sed_arch of sedcheck is
-  component SEDFA
-    generic (
-      CHECKALWAYS : string :="DISABLED";
-      SED_CLK_FREQ : string :="3.5" ;
-      DEV_DENSITY : string :="2100L" 
-      );
-    port (
-      SEDSTDBY  : in std_logic;
-      SEDENABLE : in std_logic;
-      SEDSTART : in std_logic;
-      SEDFRCERR : in std_logic;
-      SEDERR : out std_logic;
-      SEDDONE : out std_logic;
-      SEDINPROG : out std_logic;
-      SEDCLKOUT : out std_logic
-      );
-  end component;  
-  type state_t is (IDLE, INIT_1, INIT_2, INIT_3, START_1, START_2, WAITACTIVE, WAITDONE);
-  signal state          : state_t;
-  signal state_bits     : std_logic_vector(3 downto 0);
-
-  signal sed_edge       : std_logic;
-  signal sed_clock_last : std_logic;
-
-  signal sed_clock      : std_logic;
-  signal sed_done       : std_logic;
-  signal sed_enable     : std_logic;
-  signal sed_error      : std_logic;
-  signal sed_inprogress : std_logic;
-  signal sed_start      : std_logic;
-
-  signal sed_clock_q      : std_logic;
-  signal sed_done_q       : std_logic;
-  signal sed_error_q      : std_logic;
-  signal sed_inprogress_q : std_logic;
-
-  signal status_i       : std_logic_vector(31 downto 0);
-  
-  signal run_counter    : unsigned(7 downto 0) := (others => '0');
-  signal error_counter  : unsigned(7 downto 0) := (others => '0');
-  signal timer          : unsigned(22 downto 0);
-  
-begin
-
-sed_clock_last <= sed_clock_q when rising_edge(CLK);
-sed_edge       <= sed_clock_q and not sed_clock_last when rising_edge(CLK);
-
-sed_clock_q      <= sed_clock when rising_edge(CLK);
-sed_done_q       <= sed_done when rising_edge(CLK);
-sed_inprogress_q <= sed_inprogress when rising_edge(CLK);
-sed_error_q      <= sed_error when rising_edge(CLK);
-
-
----------------------------------------------------------------------------
--- SED control state machine
----------------------------------------------------------------------------
-proc_ctrl : process begin
-  wait until rising_edge(CLK);
-  timer <= timer + 1;
-  case state is
-    when IDLE =>
-      sed_enable   <= '0';
-      sed_start    <= '0';
-      if CONTROL_IN(0) = '1' then
-        state      <= INIT_1;
-        timer      <= (0 => '1', others => '0');
-      end if;
-    when INIT_1 =>
-      sed_enable   <= '0';
-      sed_start    <= '0';
-      if timer(5 downto 0) = 0 then
-        state      <= INIT_2;
-      end if;
-    when INIT_2 =>
-      sed_enable   <= '1';
-      sed_start    <= '0';
-      if timer(5 downto 0) = 0 then
-        state      <= INIT_3;
-      end if;
-    when INIT_3 =>
-      sed_enable   <= '1';
-      sed_start    <= '0';
-      if timer(5 downto 0) = 0 then
-        state      <= START_1;
-      end if;
-    when START_1 =>
-      sed_enable   <= '1';
-      sed_start    <= '0';
-      if sed_edge = '1' then
-        state      <= START_2;
-      end if;
-    when START_2 =>      
-      sed_enable   <= '1';
-      sed_start    <= '1';
-      if sed_edge = '1' and sed_inprogress_q = '1' then
-        state      <= WAITACTIVE;
-      end if;
-    when WAITACTIVE =>
-      sed_enable   <= '1';
-      sed_start    <= '1';
-      if sed_edge = '1' and sed_done_q = '0' then
-        state      <= WAITDONE;
-      end if;
-    when WAITDONE =>
-      sed_enable   <= '1';
-      sed_start    <= '1';
-      if (sed_edge = '1' and sed_inprogress_q = '0' and sed_done_q = '1') then
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.numeric_std.all;\r
+\r
+library work;\r
+use work.trb_net_std.all;\r
+\r
+library ecp5um;\r
+use ecp5um.components.all;\r
+\r
+entity sedcheck is\r
+  port(\r
+    CLK        : in std_logic;\r
+    ERROR_OUT  : out std_logic;\r
+    \r
+    CONTROL_IN : in std_logic_vector(3 downto 0);\r
+    DEBUG      : out std_logic_vector(31 downto 0)\r
+    );\r
+end entity;\r
+\r
+\r
+architecture sed_arch of sedcheck is\r
\r
+  component SEDFA\r
+    generic (\r
+      CHECKALWAYS : string :="DISABLED";\r
+      SED_CLK_FREQ : string :="3.5" ;\r
+      DEV_DENSITY : string :="4300L" \r
+      );\r
+    port (\r
+      SEDSTDBY  : in std_logic;\r
+      SEDENABLE : in std_logic;\r
+      SEDSTART : in std_logic;\r
+      SEDFRCERR : in std_logic;\r
+      SEDERR : out std_logic;\r
+      SEDDONE : out std_logic;\r
+      SEDINPROG : out std_logic;\r
+      SEDCLKOUT : out std_logic\r
+      );\r
+  end component;  \r
\r
+  type state_t is (IDLE, INIT_1, INIT_2, INIT_3, START_1, START_2, WAITACTIVE, WAITDONE);\r
+  signal state          : state_t;\r
+  signal state_bits     : std_logic_vector(3 downto 0);\r
+\r
+  signal sed_edge       : std_logic;\r
+  signal sed_clock_last : std_logic;\r
+\r
+  signal sed_clock      : std_logic;\r
+  signal sed_done       : std_logic;\r
+  signal sed_enable     : std_logic;\r
+  signal sed_error      : std_logic;\r
+  signal sed_inprogress : std_logic;\r
+  signal sed_start      : std_logic;\r
+\r
+  signal sed_clock_q      : std_logic;\r
+  signal sed_done_q       : std_logic;\r
+  signal sed_error_q      : std_logic;\r
+  signal sed_inprogress_q : std_logic;\r
+\r
+  signal status_i       : std_logic_vector(31 downto 0);\r
+  \r
+  signal run_counter    : unsigned(7 downto 0) := (others => '0');\r
+  signal error_counter  : unsigned(7 downto 0) := (others => '0');\r
+  signal timer          : unsigned(22 downto 0);\r
+  \r
+begin\r
+\r
+sed_clock_last <= sed_clock_q when rising_edge(CLK);\r
+sed_edge       <= sed_clock_q and not sed_clock_last when rising_edge(CLK);\r
+\r
+sed_clock_q      <= sed_clock when rising_edge(CLK);\r
+sed_done_q       <= sed_done when rising_edge(CLK);\r
+sed_inprogress_q <= sed_inprogress when rising_edge(CLK);\r
+sed_error_q      <= sed_error when rising_edge(CLK);\r
+\r
+\r
+---------------------------------------------------------------------------\r
+-- SED control state machine\r
+---------------------------------------------------------------------------\r
+proc_ctrl : process begin\r
+  wait until rising_edge(CLK);\r
+  timer <= timer + 1;\r
+  case state is\r
+    when IDLE =>\r
+      sed_enable   <= '0';\r
+      sed_start    <= '0';\r
+      if CONTROL_IN(0) = '1' then\r
+        state      <= INIT_1;\r
+        timer      <= (0 => '1', others => '0');\r
+      end if;\r
+    when INIT_1 =>\r
+      sed_enable   <= '0';\r
+      sed_start    <= '0';\r
+      if timer(5 downto 0) = 0 then\r
+        state      <= INIT_2;\r
+      end if;\r
+    when INIT_2 =>\r
+      sed_enable   <= '1';\r
+      sed_start    <= '0';\r
+      if timer(5 downto 0) = 0 then\r
+        state      <= INIT_3;\r
+      end if;\r
+    when INIT_3 =>\r
+      sed_enable   <= '1';\r
+      sed_start    <= '0';\r
+      if timer(5 downto 0) = 0 then\r
+        state      <= START_1;\r
+      end if;\r
+    when START_1 =>\r
+      sed_enable   <= '1';\r
+      sed_start    <= '0';\r
+      if sed_edge = '1' then\r
+        state      <= START_2;\r
+      end if;\r
+    when START_2 =>      \r
+      sed_enable   <= '1';\r
+      sed_start    <= '1';\r
+      if sed_edge = '1' and sed_inprogress_q = '1' then\r
+        state      <= WAITACTIVE;\r
+      end if;\r
+    when WAITACTIVE =>\r
+      sed_enable   <= '1';\r
+      sed_start    <= '1';\r
+      if sed_edge = '1' and sed_done_q = '0' then\r
+        state      <= WAITDONE;\r
+      end if;\r
+    when WAITDONE =>\r
+      sed_enable   <= '1';\r
+      sed_start    <= '1';\r
+      if (sed_edge = '1' and sed_inprogress_q = '0' and sed_done_q = '1') then\r
         state       <= INIT_1;\r
-               timer       <= (0 => '1', others => '0');
-        run_counter <= run_counter + 1;
-        if sed_error_q = '1' then
-          error_counter <= error_counter + 1;
-        end if;
-      end if;
-  end case;
-  
-  if CONTROL_IN(0) = '0' or (timer = 0 and state /= IDLE) then
-    sed_enable <= '0';
-    state      <= IDLE;
-  end if;
-  
-end process;
-
----------------------------------------------------------------------------
--- Status Information
----------------------------------------------------------------------------
-state_bits <= x"8" when state = IDLE else
-              x"1" when state = INIT_1 else
-              x"2" when state = INIT_2 else
-              x"3" when state = INIT_3 else
-              x"4" when state = START_1 else
-              x"5" when state = START_2 else
-              x"6" when state = WAITACTIVE else
-              x"7" when state = WAITDONE else
---               x"9" when state = RESULT else
-              x"F";
-
-status_i(3 downto 0) <= state_bits;
-status_i(4)          <= sed_clock_q;
-status_i(5)          <= sed_enable;
-status_i(6)          <= sed_start;
-status_i(7)          <= sed_done_q;
-status_i(8)          <= sed_inprogress_q;
-status_i(9)          <= sed_error_q;
-status_i(10)         <= not sed_edge;
-status_i(15 downto 11) <= (others => '0');
-status_i(23 downto 16) <= std_logic_vector(run_counter)(7 downto 0);
-status_i(31 downto 24) <= std_logic_vector(error_counter)(7 downto 0);
-              
-ERROR_OUT <= sed_error;              
-DEBUG     <= status_i when rising_edge(CLK);
-
----------------------------------------------------------------------------
--- SED
----------------------------------------------------------------------------
-THE_SED : SEDFA
-  generic map(
-      CHECKALWAYS  => "DISABLED",
-      SED_CLK_FREQ   => "3.5",
-      DEV_DENSITY  => "2100L" 
-      )
-  port map(
-    SEDSTDBY  => '0',
-    SEDENABLE => sed_enable,
-    SEDSTART  => sed_start,
-    SEDFRCERR => '0',
-    SEDERR    => sed_error,
-    SEDDONE   => sed_done,
-    SEDINPROG => sed_inprogress,
-    SEDCLKOUT => sed_clock
-    );
-    
-    
-end architecture; 
+               timer       <= (0 => '1', others => '0');\r
+        run_counter <= run_counter + 1;\r
+        if sed_error_q = '1' then\r
+          error_counter <= error_counter + 1;\r
+        end if;\r
+      end if;\r
+  end case;\r
+  \r
+  if CONTROL_IN(0) = '0' or (timer = 0 and state /= IDLE) then\r
+    sed_enable <= '0';\r
+    state      <= IDLE;\r
+  end if;\r
+  \r
+end process;\r
+\r
+---------------------------------------------------------------------------\r
+-- Status Information\r
+---------------------------------------------------------------------------\r
+state_bits <= x"8" when state = IDLE else\r
+              x"1" when state = INIT_1 else\r
+              x"2" when state = INIT_2 else\r
+              x"3" when state = INIT_3 else\r
+              x"4" when state = START_1 else\r
+              x"5" when state = START_2 else\r
+              x"6" when state = WAITACTIVE else\r
+              x"7" when state = WAITDONE else\r
+--               x"9" when state = RESULT else\r
+              x"F";\r
+\r
+status_i(3 downto 0) <= state_bits;\r
+status_i(4)          <= sed_clock_q;\r
+status_i(5)          <= sed_enable;\r
+status_i(6)          <= sed_start;\r
+status_i(7)          <= sed_done_q;\r
+status_i(8)          <= sed_inprogress_q;\r
+status_i(9)          <= sed_error_q;\r
+status_i(10)         <= not sed_edge;\r
+status_i(15 downto 11) <= (others => '0');\r
+status_i(23 downto 16) <= std_logic_vector(run_counter)(7 downto 0);\r
+status_i(31 downto 24) <= std_logic_vector(error_counter)(7 downto 0);\r
+              \r
+ERROR_OUT <= sed_error;              \r
+DEBUG     <= status_i when rising_edge(CLK);\r
+\r
+---------------------------------------------------------------------------\r
+-- SED\r
+---------------------------------------------------------------------------\r
+THE_SED : SEDFA\r
+  generic map(\r
+      CHECKALWAYS  => "DISABLED",\r
+      SED_CLK_FREQ   => "3.5",\r
+      DEV_DENSITY  => "2100L" \r
+      )\r
+  port map(\r
+    SEDSTDBY  => '0',\r
+    SEDENABLE => sed_enable,\r
+    SEDSTART  => sed_start,\r
+    SEDFRCERR => '0',\r
+    SEDERR    => sed_error,\r
+    SEDDONE   => sed_done,\r
+    SEDINPROG => sed_inprogress,\r
+    SEDCLKOUT => sed_clock\r
+    );\r
+    \r
+    \r
+end architecture; \r