我想使用多个逆变器创建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用作逆变器之间的信号。
答案 0 :(得分:0)
默认情况下,VHDL假设零延迟元素。结果,振荡频率将是1/0 =误差(无限大)。这将导致“达到最大迭代次数”错误
因此,您必须通过在作业中添加after x ns
来手动配置组件延迟。
osc_chain(i)<= not osc_chain(i-1) after 10 ns;
完整示例(延迟有一些变化):
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;
注意:要使环形振荡器工作,您需要奇数个反相器。