温度的变化、电压的波动等因素都会使晶振所输出的时钟发生抖动。因此,用一个时钟去采样另一个时钟驱动的信号,其采样值是不可预测的。异步采样电路的机理就是利用两个时钟之间相位和频率的不确定性,产生一个不可预测的序列。单比特异步采样电路的示意图如图2所示。图中有4个触发器(FF1、FF2、FF3、FF4)和两个时钟(clk、clks)。FF1、FF2由clks信号驱动,其中FF1是用于防止亚稳态出现的触发器,它的输入信号同步于clk的信号,FF2的输出信号则同步于clks的信号。FF3、FF4由clk信号驱动,其中FF3的作用和FF1类似,用于防止亚稳态的出现,它的输入信号同步于clks的信号;FF4的输出信号则同步于clk的信号。通过上述处理后,FF4的输出产生了一个随机序列,这个随机序列不同于同步电路产生的伪随机序列,其状态的转移同温度、电压等外界因素有关,是一个完全不可预测的随机序列。此外,异步采样电路对两个时钟之间的相位敏感,所以在电路板每次上电时所生成的序列也是不同的。
异步采样模块的VHDL实现如下:
--this process is triggered by clks
process(rst, clks)
begin
if rst=‘0’ then
ff1 <= (others=>‘0’);
ff2 <= (others=>‘0’);
elsif clks‘event and clks=‘1’ then
ff1 <= din; --din is the signal triggered by clk
ff2 <= ff1;
end if;
end process;
-- this process is triggered by clk
process(rst, clk)
begin
if rst=‘0’ then
ff3 <= (others=>‘0’);
ff4 <= (others=>‘0’);
elsif clk′event and clk=‘1’ then
ff3 <= ff2;
ff4 <= ff3;
end if;
end process;
dout <= ff4; -- dout is output random signal