我有信号:
signal sig: std_logic_vector(N - 1 downto 0);
其中N在泛型中定义,并且可以从16到1024。
在代码中我需要将其与零进行比较:
if unsigned(sig) = 0 then
do somth
end if;
但我怎么知道这种比较器的延迟是多少? 我的设计工作在100 MHz,所以我需要制作一些分频器,这将跳过一些技巧来获得结果,类似的东西:
constant CHECK_TACKTS : natural := 100;
signal check : boolean;
signal wait_check_cntr: natural range 0 to CHECK_TACKTS;
-- states
when SOME_STATE=>
check <= unsigned(sig) = 0;
wait_check_cntr <= 0;
state <= CHECK_ZERO
when CHECK_ZERO =>
if wait_check_cntr = CHECK_TACKTS then
if check then
--do somth
end if;
else
wait_check_cntr <= wait_check_cntr + 1;
end if;
但是如何计算CHECK_TACKTS,如果我知道,那么计数器周期为10 ns?如果xilinx合成工具在luts上构建完整的比较树,似乎比较时间可以与log2(N)成比例,但是lut时间呢?当然,我可以从报告的几个点做研究和测量时间,而不是进行回归,但可能有简单的方法吗?
答案 0 :(得分:1)
在Xilinx上管理比较操作的最简单方法是让工具为您完成。你需要激活&#34;寄存器平衡&#34;选项和使用语法,如:
if rising_edge(clk) then
check_0 <= unsigned(sig) = 0;
check_1 <= check_0;
check <= check_1;
end if;
XST(或Vivado)将在三个周期(对于这种情况)分配比较操作。
如果您不想依赖综合工具,可以自行手动分割操作:
if rising_edge(clk) then
check_msb <= unsigned(sig'left downto sig'length/2) = 0;
check_lsb <= unsigned(sig'length/2-1 downto 0) = 0;
check <= check_msb and check_lsb;
end if;
这可能不是平衡比较的最佳方式,但VHDL代码简单,易于修改和理解。