【问题标题】:VHDL-2008 to_01 conversionVHDL-2008 to_01 转换
【发布时间】:2017-11-22 09:10:46
【问题描述】:

在 VHDL-2008 中使用 to_01 转换函数时,我遇到了一些意外行为。我的期望是可以清楚地解释为高或低的向量位分别映射到“1”和“0”。剩余的向量位应转换为“0”位。 但是,使用下面描述的代码,我将整个向量转换为全 '0'。

这种行为正确吗?或者这是模拟器软件(ALDEC Riviera-PRO)中的错误?

是否有任何符合我期望的 IEEE 函数,还是我必须编写自己的函数来实现?

library ieee;
use ieee.std_logic_1164.all;

entity test_to_01 is
end entity test_to_01;

architecture rtl of test_to_01 is
    signal s_test_in    : std_logic_vector(8 downto 0)  := "UX01ZWLH-";
    signal s_test_out   : std_logic_vector(8 downto 0);
begin
    s_test_out  <=  to_01(s_test_in);
end architecture rtl;

【问题讨论】:

  • to__01 function 对元数据(或“Z”)进行了测试。当找到任何它返回一个由(在这种情况下默认为'0')xmap参数组成的数组值。您可以下载 -2008 Supplemental Material,其中包含 IEEE 软件包的源代码,位于 zip 中,1076-2008_machine_readable/ieee/std_logic_1164-body.vhdl。您在 s_test_in 的初始值中有两次错误列出“Z”)。更新 - 指向 Jim 的来源,我注意到链接不正确。
  • to_X01 会将其他值映射到 X 而不是 0。

标签: vhdl


【解决方案1】:

观察到的行为是正确的行为。下面是关于这方面的一点历史。

在 2008 年,我们将所有强度降低操作传播到所有 std_logic 系列包。无论好坏,to_01 的历史实现都来自 numeric_std,并且完全按照现在的方式实现。以下是我在网上找到的较旧的实现:

function TO_01(S : SIGNED ; xmap : STD_LOGIC:= '0') return SIGNED is
variable RESULT: SIGNED(S'length-1 downto 0);
variable bad_element : boolean := FALSE;
alias xs : SIGNED(s'length-1 downto 0) is S;
begin
  for i in RESULT'range loop
    case xs(i) is
      when '0' | 'L' => RESULT(i):='0';
      when '1' | 'H' => RESULT(i):='1';
      when others => bad_element := TRUE;
      end case;
    end loop;
  if bad_element then
    assert NO_WARNING
      report "numeric_std.TO_01: Array Element not in {0,1,H,L}"
      severity warning;
    for i in RESULT'range loop
      RESULT(i) := xmap;        -- standard fixup
      end loop;
    end if;
  return RESULT;
  end TO_01;

VHDL WG 的主要指令之一是不破坏旧代码。在这种情况下,这个目标似乎提出了一个可能不太理想的实现。

如果您想要不同的东西,您可以随时将其提交给标准的下一次修订。它必须有一个不同的名称。请注意,我们目前正在关闭 VHDL-2018,因此这将是之后的修订版。

请注意,IEEE P1076 WG 是一个基于个人的工作组。这意味着有经验的用户(例如您自己)正在参与其中。通常,在标准修订中完成的工作量是巨大的。因此,我们总是需要更多积极的参与者。特别是在包装上工作。请参阅 eda-twiki.org 和 http://www.eda-twiki.org/cgi-bin/view.cgi/P1076/WebHome

【讨论】:

  • 您可以注意到 -2008 之前的 numeric_std function TO_01 (S: UNSIGNED; XMAP: STD_LOGIC := '0') return UNSIGNED (Id: T.1) 与 std_ulogic_vector 的 -2008 包 std_logic_1164 中的行为(在 OP 的问题中使用)相匹配。 -2008 中的 numeric_std TO_01 包调用 std_logic_1164 包中的 TO_01 用于有符号和无符号。行为符合预期。签名版本的原始行为将被视为不正确。
  • P1076.3 Rev. 1.7 (Nov. 23 1994) 以来已指定当前行为,该 P1076.3 Rev. 1.7 (Nov. 23 1994) 将于 1996 年发布。
  • 我无法从这个答案中得出为什么他的代码不起作用。
  • @JHBonarius 在代码(上面发布)中,如果有一个 UXZW- 那么它返回所有 XMAP 值,即 0 - 这与 OP 观察到的行为相关。所以是的,他观察到的值是正确的。
  • @user1155120 来自帖子,“无论好坏,to_01 的历史实现都来自 numeric_std,并且完全按照现在的方式实现。”是的,我本可以参考创建它的 1076.3 的精确版本,但我真的不认为这会给帖子添加任何有用的东西。
【解决方案2】:

我找到了解决方法:

s_test_out  <=  to_stdlogicvector(to_bitvector(s_test_in));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多