如何使用VHDL创建一个xored环形振荡器

时间:2018-06-17 15:20:55

标签: vhdl trng

我想使用多个逆变器创建xored振荡器。振荡器和逆变器的数量应该通用定义。我已经完成了1个振荡器,但我不知道如何多次生成相同的振荡器并让它们进行滤波。 这是我的代码的一部分:

    gen_ring_oscillator:

    for i in 1 to NUM_INVERTER-1 generate

    osc_chain(i)<= not osc_chain(i-1);
    end generate;



ring_oscillator:process(osc_chain, en_oc, osc_reset)
begin 

    if (osc_reset = '1') then
        osc_chain(0) <= '0';

    elsif (en_oc = '1') then

        osc_chain(0) <=  osc_chain(NUM_INVERTER-1);
        ro_out <= osc_chain(NUM_INVERTER-1);


    end if;

end process;

我已经将osc_chain用作逆变器之间的信号。

1 个答案:

答案 0 :(得分:0)

默认情况下,VHDL假设零延迟元素。结果,振荡频率将是1/0 =误差(无限大)。这将导致“达到最大迭代次数”错误

因此,您必须通过在作业中添加after x ns来手动配置组件延迟。

osc_chain(i)<= not osc_chain(i-1) after 10 ns;

可以找到更多信息herehere

完整示例(延迟有一些变化):

library ieee;
use ieee.std_logic_1164.all;

entity ring_osc is
    port(clk_out : out std_logic);
end entity;

architecture rtl of ring_osc is
    signal osc_chain : std_logic_vector(2 downto 0) := (others => '0');
begin
    gen_inv: for i in 0 to 2 generate
        osc_chain(i) <= not osc_chain((i+1) mod 3) after (10 + i) * 1 ns;
    end generate;
    clk_out <= osc_chain(0);
end architecture;

enter image description here

注意:要使环形振荡器工作,您需要奇数个反相器。