如何在vhdl中将信号与零进行比较?

时间:2015-03-05 21:30:24

标签: comparison vhdl comparator

我有信号:

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时间呢?当然,我可以从报告的几个点做研究和测量时间,而不是进行回归,但可能有简单的方法吗?

1 个答案:

答案 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代码简单,易于修改和理解。