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

How to compare signal to zero in vhdl?

我有信号:

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; 

但是如果我知道计数器周期是 10 ns,我如何计算 CHECK_TACKTS?如果 xilinx synthes 工具在 luts 上构建完整的比较树,似乎比较时间可以与 log2(N) 成正比,但是 lut 时间呢?当然,我可以根据报告中的几个点进行研究和测量时间,而不是进行回归,但可能有更简单的方法吗?

在 Xilinx 上流水线化比较操作的最简单方法是让工具为您完成。您需要激活 "register balancing" 选项并使用如下语法:

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