我正在尝试使用 LUT6 原语在 Xilinx Vivado 中实现和模拟环形振荡器。运行行为模拟时,它运行良好,由于增加了延迟,我可以看到信号每 5 ns 切换一次。为了进行功率仿真,我需要能够运行时序仿真。综合后和实现后时序仿真都会产生结果
X
,表明存在错误。
我也尝试了这个答案中的环形振荡器,并且我遇到了同样的问题,行为模拟有效,但时序模拟无效。约束文件应允许环形振荡器。 Vivado 中的目标语言是 Verilog,因为时序仿真仅适用于此。
RO_LUT_I0.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library UNISIM;
use UNISIM.VComponents.all;
entity RO_LUT_I0 is
Port (
EndAND : out STD_LOGIC
);
end RO_LUT_I0;
architecture rtl of RO_LUT_I0 is
--amount of ROs
constant size : integer := 2;
--input signal for specific LUT
signal I0 : std_logic_vector(0 to size - 1) := (others => '0');
--output signal
signal O : std_logic_vector(0 to size - 1);
--connect inputs to ground
signal I1 : std_logic := '0';
signal I2 : std_logic := '0';
signal I3 : std_logic := '0';
signal I4 : std_logic := '0';
signal I5 : std_logic := '0';
begin
--instantiation LUT
gen_LUT6: for i in 0 to size - 1 generate
LUT6_inst : LUT6
generic map (
INIT => X"0000000000000001") -- Only when every input is 0, produce 1. Otherwise produce 0.
port map (
O => O(i), -- LUT general output
I0 => I0(i), -- LUT input
I1 => I1, -- LUT input
I2 => I2, -- LUT input
I3 => I3, -- LUT input
I4 => I4, -- LUT input
I5 => I5 -- LUT input
);
end generate gen_LUT6;
-- End of LUT6_inst instantiation
--Create RO and combine into END gate
process(O)
variable TempAND : std_logic;
begin
--set output as input to create RO
I0 <= O after 1 ns;
--combine all
TempAND := '1';
for i in 0 to size - 1 loop
TempAND := TempAND and O(i);
end loop;
EndAND <= TempAND;
end process;
end rtl;
RO_LUT_I0_TB.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity RO_LUT_I0_TB is
end RO_LUT_I0_TB;
architecture sim of RO_LUT_I0_TB is
signal EndAND : STD_LOGIC := 'U';
begin
--DUT
i_RO_LUT_I0 : entity work.RO_LUT_I0(rtl) port map(
EndAND => EndAND);
process is
begin
wait;
end process;
end architecture;
RO_LUT_constr.xdc
set_property IOSTANDARD LVCMOS33 [get_ports EndAND]
set_property PACKAGE_PIN A2 [get_ports EndAND]
#Don't touch LUTS
set_property DONT_TOUCH TRUE [get_cells *LUT6*]
# Allow combinatorial loops for all nets
set_property ALLOW_COMBINATORIAL_LOOPS true [get_nets]
set_property SEVERITY {Warning} [get_drc_checks LUTLP-1]
set_property SEVERITY {Warning} [get_drc_checks NSTD-1]
TL;DR:这不是环形振荡器,并且您无法在“1ns 之后”进行合成。您应该阅读您的日志文件。
对于一个简单的问题来说,这里的内容太多了。我认为(如果我错了,请纠正我)您正在实例化 2 个 LUT,每个 LUT 都是一个逆变器。每个输入在“1ns 之后”的延迟后由其自己的输出驱动。两个逆变器未相互连接。模块输出为两个逆变器输出的AND。正确吗?
转储“1ns 后”。延迟必须由i+1
i-1
等,才能连接到下一个元素。您还必须处理结束条件以解决整个问题。您期望输入元素的初始化以某种方式“启动”环,以便它具有启动值。这适用于行为模拟,但它适用于综合吗?也许,也许不是。你需要检查一下。如果您得到 X