我对 std_logic 类型的 don't care (
'-'
) 值的行为感到困惑。
当将 std_logic_vector 信号与一个或多个设置为“无关”的 std_logic_vector 常量进行比较时,它似乎不像我预期的那样工作,或者与直觉相反。
例如在下面的示例中,我假设
do_something
将以信号 "1101"
中的值 "1001"
和 s
执行,因此索引 2 中的位将被忽略,因为它是无关的:
signal s : std_logic_vector(3 downto 0);
constant C : std_logic_vector(s'range) := "1-01";
if s = C then
do_something;
end if;
但情况似乎并非如此。
在我的用例中,我可以通过不关心值来保持比较简单,因为我不必检查位索引 2 中具有不同值的组合。
应该如何使用 don't care 值,实际行为是什么?甚至拥有这个值的目的是什么?
使用等式关系 (=),在查看 VHDL Languange 参考手册 (“LRM”)(IEEE 标准 1076-2008)和第 16.8.2.4.4 子章时,比较将始终为 false 中的元逻辑值关系表达式:
如果等式 (=) 关系的一个操作数是一维数组,并且 该一维数组的一个元素是静态元逻辑值(这里是我的
和索引constant C
处的元素) ,综合工具应将整个等式关系解释为等同于布尔值 FALSE。2
我原来的代码永远不会执行
do_something;
部分:
signal s : std_logic_vector(3 downto 0);
constant C : std_logic_vector(s'range) := "1-01";
if s = C then -- Always FALSE!!!
do_something;
end if;
我的问题所需的功能可以通过 STD_MATCH 函数来实现。
在 VHDL Languange 参考手册中,还有一个子章节 16.8.3 称为 STD_MATCH 函数和预定义的匹配关系运算符。
它表示与无关值('-')相比,该值是正确的:
NUMERIC_STD 包定义了名为 STD_MATCH 的函数,该函数为无关值提供通配符匹配。每当 STD_MATCH 函数比较两个 STD_ULOGIC 值的实际参数时,它返回 TRUE 当且仅当:
- 两个值都不是元逻辑值或高阻抗值,并且值相同,或者
- 一个值为“0”,另一个为“L”,或者
- 一个值为“1”,另一个为“H”,或者
- 至少有一个值是无关值('-')。
并且我正在比较的值是 std_logic_vectors(数组)而不仅仅是单个 STD_LOGIC 值,当且仅当以下情况时 STD_MATCH 将返回 true:
- 操作数具有相同的长度,并且
- 应用于每对匹配元素的 STD_MATCH 返回 TRUE。
所以,我应该使用
std_match
函数(来自 numeric_std 包)来获得我期望的行为:
use ieee.numeric_std.all;
signal s : std_logic_vector(3 downto 0);
constant C : std_logic_vector(s'range) := "1-01";
if std_match(s, C) then
do_something;
end if;