为什么VHDL属性调用需要进程?

时间:2012-07-24 09:07:33

标签: vhdl

如果我有以下VHDL-200X架构:

architecture my_arc of my_entity is
    signal test_char   : std_logic_vector(7 downto 0);
    signal test_char_c : character;
    signal test_char_i : integer;
begin
    test_char   <= "01001010";
    test_char_i <= to_integer(unsigned(test_char));
    test_char_c <= character'val(test_char_i);
end architecture my_arc;

...并模拟它(在Xilinx iSim 14.1中),即使test_char_c取值NULtest_char_i也不会从74的初始值发生变化。但是,如果我用以下内容替换架构中的最后一行:

    process(test_char_i)
    begin
        test_char_c <= character'val(test_char_i);
    end process;

...然后test_char_c接受我期望的值J

我认为如果右侧的任何信号发生变化,将同时更新裸信号分配。换句话说,它等同于对分配中涉及的所有信号都敏感的过程。

为什么test_char_c第一次没有更新?

修改:将test_char_i更改为natural不会更改结果。

2 个答案:

答案 0 :(得分:2)

在初始化时,test_char_i的值为integer'low,不会映射到character - Modelsim 10.0报告:

# ** Fatal: (vsim-3390) Result ?(-2147483648) of attribute 'VAL is out of range NUL (0) to 'ÿ' (255).
#    Time: 0 ns  Iteration: 0  Process: /my_entity/line__15 File: attr.vhd
# Fatal error in Architecture my_arc at attr.vhd line 15
# 

如果我将test_char_i设为natural,以便初始化为0,那么事情就会按预期工作(至少在Modelsim中,没有尝试过iSim)

答案 1 :(得分:0)

  

我认为如果右侧的任何信号发生变化,将同时更新裸信号分配。换句话说,它等同于对分配中涉及的所有信号敏感的过程。

那是对的。

  

为什么第一次没有更新test_char_c?

确实如此。

包含监控流程的Minimal, Complete, and Verifiable example将报告test_char_c上的所有值更新:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity my_entity is
end entity;

architecture my_arc of my_entity is
    signal test_char   : std_logic_vector(7 downto 0);
    signal test_char_c : character;
    signal test_char_i : natural; -- integer;
begin
    test_char   <= "01001010";
    test_char_i <= to_integer(unsigned(test_char));
    test_char_c <= character'val(test_char_i);

    process (test_char_c)
    begin
        report "test_char_c = " & character'image(test_char_c);
    end process;
end architecture my_arc;

注意对test_char_i声明的更改,以克服默认初始值(INTEGER&#39; LOW),导致Martin Thompson报告的绑定检查失败。

使用符合-1993标准的VHDL工具对其进行了分析,阐述和模拟:

  

ghdl -r my_entity
  ../../src/ieee/numeric_std-body.v93:2098:7:@0ms:(警告警告):NUMERIC_STD.TO_INTEGER:检测到元数值,返回0
  my_entity.vhdl:19:9:@ 0ms :(报告说明):test_char_c = nul
  my_entity.vhdl:19:9:@ 0ms :(报告说明):test_char_c =&#39; J&#39;

来自包numeric_std的断言警告是由test_char默认初始值&#34; UUUUUUUU&#34;引起的。

第一个报告的test_char_c值是您报告并发生的NUL,因为test_char_i的初始值为0(映射到NUL)。

第二个响应于test_char的并发简单信号分配,导致test_char_i的更新反过来导致test_char_c的更新(并恢复监视进程)。它将分配的位串反映为test_char,其值为x&#34; 4A&#34; (对应于角色&#39; J&#39;)。

如果不是显示的监视器进程,而是使用以下形式的断言语句:

    assert test_char_c /= NUL
        report "test_char_c = " & character'image(test_char_c);

您发现只显示第一个报表语句,因为评估了断言语句条件并且发现了false断言。

同样如果&#34; / =&#34;条件改为&#34; =&#34;只会显示第二个报告声明(显示&#39; J&#39;)。

如果没有提供MCVe,您的问题就无法重复(或者在当时新生的ISIM上被指责)。