相比之下,std_logic 的行为并不关心

问题描述 投票:0回答:1

我对 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
1个回答
0
投票

使用等式关系 (=),在查看 VHDL Languange 参考手册 (“LRM”)(IEEE 标准 1076-2008)和第 16.8.2.4.4 子章时,比较将始终为 false 中的元逻辑值关系表达式:

如果等式 (=) 关系的一个操作数是一维数组,并且 该一维数组的一个元素是静态元逻辑值(这里是我的

constant C
和索引
2
处的元素) ,综合工具应将整个等式关系解释为等同于布尔值 FALSE。

我原来的代码永远不会执行

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;
© www.soinside.com 2019 - 2024. All rights reserved.