Modern CPLDs often have an internal state machine that configures the chip on power up. Not all of these shutdown the internal state machine clock after configuration is complete. Crosstalk from the internal clock/oscillator will modulate the output of a divider. IIRC the Coolrunner II chips shuts down its internal oscillator after powerup configuration is completed.
Similar crosstalk issues can occur with freerunning internal oscillators within some microcontrollers. Simpler microcontrollers have no internal oscillators and are thus better suited to precision timing applications. Bruce > On 01/05/2022 09:43 g...@hoffmann-hochfrequenz.de wrote: > > > Am 2022-04-30 21:33, schrieb Clint Jay: > > I think the reason the PICDiv is so well regarded is because of the > > specific chips used and the way the timers etc. are implemented in > > them. > > > > So, an alternate chip outside of the Microchip PIC range just might not > > be > > capable of the performance. > > For me, the alternate chip is a Xilinx Coolrunner II with the following > half page of VHDL code. For my board, there is also a phase comparator > on the chip, options for different OCXOs / more frequencies and space > for syncing an OCXO to an incoming 1 pps (not tested). > Just 1 pps generation should fit into an X2C32 (i.e. half the size), to > 200 MHz. > Pulse precision is like a 74LVC flip flop. > > Cheers, Gerhard > > > ---------------------------------------------------------------------------------- > -- Company: Hoffmann RF & DSP > -- Create Date: 09:09:37 08/08/2012 > -- Module Name: ppps1_generator - Behavioral > -- Target Devices: X2c64A-5VQ44 > -- Additional Comments: Free firmware under BSD license > ---------------------------------------------------------------------------------- > > library IEEE; > use IEEE.STD_LOGIC_1164.ALL; > use ieee.numeric_std.all; > > entity pps1_generator is > Port( > clk : in STD_LOGIC; > RunAt100MHz : in STD_LOGIC; > pps1_out : out STD_LOGIC; > ); > end pps1_generator; > > architecture Behavioral of pps1_generator is > signal tctr : integer range 0 to 99999999; > signal pw_ctr : integer range 0 to 199999; > signal cycle_done : boolean; > signal pw_done : boolean; > > function bool2sl(b : boolean) return std_logic is > begin > if b then > return '1'; > else > return '0'; > end if; > end function bool2sl; > > begin > u_div: process(clk) is > begin > if rising_edge(clk) then > cycle_done <= (tctr = 0); -- pipeline the comparator > > if cycle_done > then > if RunAt100MHz = '1' then -- reload > tctr <= 100000000 - 2; -- divide by 100 > Meg > else > tctr <= 10000000 - 2; -- divide by 10 > Meg > end if; > else > tctr <= tctr - 1; > end if; > > end if; -- rising_edge() > end process u_div; > > -- produce the standard 20 usec pulsewidth > > u_pulsewidth : process(clk) is > begin > if rising_edge(clk) then > if cycle_done then > if RunAt100MHz = '1' then > pw_ctr <= 19999; > else > pw_ctr <= 1999; > end if; > > elsif pw_ctr /= 0 then > pw_ctr <= pw_ctr - 1; > end if; > > pps1_out <= bool2sl(pw_ctr /= 0); > > end if; -- rising_edge() > end process u_pulsewidth; > > end Behavioral; > _______________________________________________ > time-nuts mailing list -- time-nuts@lists.febo.com -- To unsubscribe send an > email to time-nuts-le...@lists.febo.com > To unsubscribe, go to and follow the instructions there. _______________________________________________ time-nuts mailing list -- time-nuts@lists.febo.com -- To unsubscribe send an email to time-nuts-le...@lists.febo.com To unsubscribe, go to and follow the instructions there.