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

如何使用VHDL创建xored环形振荡器,vhdl,trng,Vhdl,Trng,我想创建使用多个逆变器的异或振荡器。振荡器和逆变器的数量应在通用规范中定义。我已经完成了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_chai

我想创建使用多个逆变器的异或振荡器。振荡器和逆变器的数量应在通用规范中定义。我已经完成了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;
发电机环形振荡器:
对于i in 1到NUM_逆变器-1生成

osc_链(i)默认情况下,VHDL假定零延迟元素。因此,振荡频率将为1/0=误差(无限大)。这将导致“达到最大迭代次数”错误

因此,您必须手动配置组件延迟,方法是在x ns
之后添加
,然后分配

osc_chain(i)<= not osc_chain(i-1) after 10 ns;
osc_链(i)'0');
开始
gen_inv:为0到2中的i生成

我不明白这个问题。你有一个振荡器的代码,为什么你不能把它放在一个实体/架构中并多次实例化呢?
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;