source: firmware/FAD/FACT_FAD_lib/hdl/REFCLK_counter_behavior.vhd@ 18341

Last change on this file since 18341 was 11755, checked in by neise, 13 years ago
reinit of this svn repos .... it was all too messy deleted the old folders and restarted with FACT_FAD_lib only. (well and the testbenches)
File size: 2.5 KB
Line 
1--
2-- VHDL Architecture FACT_FAD_lib.REFCLK_counter.behavior
3--
4-- Created:
5-- by - dneise.UNKNOWN (E5B-LABOR6)
6-- at - 12:10:57 28.01.2011
7--
8-- using Mentor Graphics HDL Designer(TM) 2009.2 (Build 10)
9--
10LIBRARY ieee;
11USE ieee.std_logic_1164.all;
12use IEEE.NUMERIC_STD.ALL;
13
14library FACT_FAD_lib;
15use FACT_FAD_lib.fad_definitions.all;
16
17-- REFCLK counter counts rising edges on asynch REFCLK signal
18-- every ms a new value is returned.
19-- expected REFCLK frequency: up to 3.3MHz --> 12bit should be enough
20-- if the REFCLK id too low or too high, alarm outputs are generated
21
22ENTITY REFCLK_counter IS
23 PORT (
24 clk : in std_logic; -- 50MHz!
25 refclk_in : in std_logic; -- asychronous signal
26 counter_result : out std_logic_vector(11 downto 0) := (others => '0');
27
28 alarm_refclk_too_high : out std_logic := '1';
29 alarm_refclk_too_low : out std_logic := '1'
30 );
31END ENTITY REFCLK_counter;
32
33--
34ARCHITECTURE behavior OF REFCLK_counter IS
35 constant FREQ_UPPER_LIMIT : integer := 3000;
36 constant FREQ_LOWER_LIMIT : integer := 300;
37 constant TIMER_MAX : integer := 100000;
38
39 signal refclk_in_sr : std_logic_vector(1 downto 0) := "00";
40 signal gate_sr : std_logic_vector(1 downto 0) := "00";
41
42 signal gate : std_logic := '0';
43 signal time_sig : integer range 0 to TIMER_MAX-1; --2ms clock
44
45 signal counter : integer range 0 to 4095 :=0 ;
46BEGIN
47
48 process (clk)
49 begin
50 if rising_edge( clk ) then
51 refclk_in_sr <= refclk_in_sr(0) & refclk_in; -- synchronize REFCLK in
52 gate_sr <= gate_sr(0) & gate;
53 case gate_sr is
54 when "00" =>
55 when "01" => --rising edge
56 counter <= 0;
57 when "10" =>
58 counter_result <= std_logic_vector( to_unsigned(counter,12) );
59 if (counter < FREQ_LOWER_LIMIT ) then
60 alarm_refclk_too_low <= '1';
61 else
62 alarm_refclk_too_low <= '0';
63 end if;
64 if (counter > FREQ_UPPER_LIMIT ) then
65 alarm_refclk_too_high <= '1';
66 else
67 alarm_refclk_too_high <= '0';
68 end if;
69 when "11" =>
70 if (refclk_in_sr = "01") then
71 counter <= counter +1;
72 end if;
73 WHEN OTHERS =>
74 end case;
75 end if;
76end process;
77
78 -- timer proc; generates 1ms gate
79 gate_timer : process (clk)
80
81 begin
82 if rising_edge(clk) then
83 if (time_sig < TIMER_MAX-1) then
84 time_sig <= time_sig + 1;
85 else
86 time_sig <= 0;
87 end if;
88
89 if (time_sig = 0) then
90 gate <= '1';
91 end if;
92 if (time_sig = (TIMER_MAX/2)-1) then
93 gate <= '0';
94 end if;
95 end if;
96 end process gate_timer;
97
98END ARCHITECTURE behavior;
99
Note: See TracBrowser for help on using the repository browser.