如果我有以下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
取值NUL
,test_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
不会更改结果。
答案 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上被指责)。