如何使用 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 代码?