diff --git a/modules/common/gc_ds182x_interface.vhd b/modules/common/gc_ds182x_interface.vhd index 27f2fa5944fd536f1c1043f9559d23e9e737dba4..05b3c5235a932219e43401b0d59d1647c48b4ece 100644 --- a/modules/common/gc_ds182x_interface.vhd +++ b/modules/common/gc_ds182x_interface.vhd @@ -36,7 +36,8 @@ use IEEE.NUMERIC_STD.all; --================================================================================================= entity gc_ds182x_interface is generic - (freq : integer := 40); -- clk frequency in MHz + (freq : integer := 40; -- clk_i frequency in MHz + g_USE_INTERNAL_PPS : boolean := false); port (clk_i : in std_logic; rst_n_i : in std_logic; @@ -98,11 +99,38 @@ architecture rtl of gc_ds182x_interface is signal shifted_header : std_logic_vector(7 downto 0); signal pre_init_p : std_logic; + signal pps_counter : unsigned(31 downto 0); + signal pps : std_logic; + --================================================================================================= -- architecture begin --================================================================================================= begin + gen_external_pps : if not g_USE_INTERNAL_PPS generate + pps <= pps_p_i; + end generate gen_external_pps; + + gen_internal_pps : if g_USE_INTERNAL_PPS generate + p_pps_gen : process(clk_i) + begin + if rising_edge(clk_i) then + if rst_n_i = '0' then + pps <= '0'; + pps_counter <= (others => '0'); + else + if pps_counter = g_CLOCK_FREQ_KHZ*1000-1 then + pps <= '1'; + pps_counter <= (others => '0'); + else + pps <= '0'; + pps_counter <= pps_counter + 1; + end if; + end if; + end if; + end process; + end generate gen_internal_pps; + -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- Serial data line in tri-state, when not writing data out onewire_b <= serial_id_out when i_serial_id_oe = '1' else 'Z'; @@ -112,7 +140,7 @@ begin pps_p_iDelay: process (clk_i) begin if rising_edge(clk_i) then - pps_p_d <= pps_p_i; + pps_p_d <= pps; end if; end process; @@ -133,48 +161,48 @@ begin end process; -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - op_fsm_states: process(state_op, pps_p_i, crc_ok) + op_fsm_states : process(state_op, pps, crc_ok) begin nxt_state_op <= READ_ID_OP; case state_op is when READ_ID_OP => - if pps_p_i = '1' and crc_ok = '1' then + if pps = '1' and crc_ok = '1' then nxt_state_op <= CONV_OP1; else nxt_state_op <= state_op; end if; when CONV_OP1 => - if pps_p_i = '1' then + if pps = '1' then nxt_state_op <= SKIP_ROM_OP1; else nxt_state_op <= state_op; end if; when SKIP_ROM_OP1 => - if pps_p_i = '1' then + if pps = '1' then nxt_state_op <= READ_TEMP_OP; else nxt_state_op <= state_op; end if; when READ_TEMP_OP => - if pps_p_i = '1' then + if pps = '1' then nxt_state_op <= SKIP_ROM_OP2; else nxt_state_op <= state_op; end if; when SKIP_ROM_OP2 => - if pps_p_i = '1' then + if pps = '1' then nxt_state_op <= CONV_OP2; else nxt_state_op <= state_op; end if; when CONV_OP2 => - if pps_p_i = '1' then + if pps = '1' then nxt_state_op <= SKIP_ROM_OP1; else nxt_state_op <= state_op; @@ -184,7 +212,7 @@ begin end process; -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - op_fsm_outputs:process(state_op, state_cm, crc_ok, pps_p_i, cm_only) + op_fsm_outputs : process(state_op, state_cm, crc_ok, pps, cm_only) begin header <= READ_ID_HEADER; bit_top <= ID_LGTH; diff --git a/modules/common/gencores_pkg.vhd b/modules/common/gencores_pkg.vhd index aef497750304294822d76219acd142de1f5fb8be..c380add0d2f22436f9afafa5fe028cde5a05d074 100644 --- a/modules/common/gencores_pkg.vhd +++ b/modules/common/gencores_pkg.vhd @@ -547,7 +547,8 @@ package gencores_pkg is ------------------------------------------------------------------------------ component gc_ds182x_interface is generic - (freq : integer := 40); + (freq : integer := 40; + g_USE_INTERNAL_PPS : boolean := false); port (clk_i : in std_logic; rst_n_i : in std_logic;