如何在 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 代码简单,易于修改和理解。
我有信号:
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 代码简单,易于修改和理解。