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

Posted

技术标签:

【中文标题】如何使用 VHDL 创建异或环形振荡器【英文标题】:how to create a xored ring oscillator using VHDL 【发布时间】:2018-06-17 15:20:54 【问题描述】:

我想使用多个反相器创建异或振荡器。振荡器和反相器的数量应通用定义。我已经完成了 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】:

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

因此,您必须手动配置组件延迟,方法是在您的分配中添加after x ns

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

更多信息可以在here和here找到。

完整示例(延迟有所不同):

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;

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

【讨论】:

以上是关于如何使用 VHDL 创建异或环形振荡器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Icarus Verilog 在 Verilog 中转换 VHDL 代码?

继电器是如何成为CPU的

如何在 VHDL 中使用“函数”从同一计算中返回多个变量?

VHDL标签在使用ctags + taglist的vim中效率不高

如何在 vhdl 中重置序列识别自动机中的变量?

如何将 vhdl 中的频率设置为 0.01 Hz?