Digital entropy source based on on jitter between multiple, digital ring oscillators. The entropy source is used in the TRNG as one of several entropy sources feeding the mixer.
The digital oscillators are created using adders. The carry out from the adder are inverted and fed back into the adder as carry in. In combination with operand values we basically get an inverted signal (the carry out) that toggles reapeatedly. By having the operands externally defined, synthesis tools in general will not optimize them away.
The carry out signal is sampled with a clock that toggles at a much slower rate than the intrinsic toggle rate of the carry out signal. In a modern FPGA, the toggle rate may be 400+ MHz while the sample rate might be 10 kHz. This sample time allows the differences in intrinsic toggle frequency between separate oscillators to drift apart after sampling.
The entropy source contains 32 separate oscillators. The outputs from the oscillators are XOR-combined to create a single entropy bit. Entropy bits are collected into 32-bit words which are provided to entropy consumers.
The entropy source has been implemented, tested and shown to produce good quality entropy (using the ent estimation tool etc) in Altera Cyclone-IV and Cyclone-V devices as well as in Xilinx Spartan-6.
The Xilinx synthesis tool will try to optimize the combinational loop away. (More specifically, it claims that the oscillator sample registers will have a fixed value.). There is therefore an attribute in the source code to force the tool to preserve the register.