VHDL - 更新整数值以进行错误检查

时间:2016-01-22 02:31:06

标签: vhdl

我已经开始尝试让我的测试台为我做一些错误检查。在下面的模型中,我使用一个过程来检查两个值是否相等,如果是,则将布尔表达式更改为true。 问题在于它根本没有变化。它检查的整数值似乎没有在模拟中更新,但我在架构模型中添加了一个多路复用器以进行双重检查,它似乎响应了HOW_MANY的整数值的变化。模型和模拟如下

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;

ENTITY rt IS
PORT (oranges, apples   :   IN  std_logic_vector(3 DOWNTO 0);
        number              :   IN integer;
        pears                   :   OUT std_logic);
END ENTITY rt;

ARCHITECTURE struct OF rt IS
SIGNAL HOW_MANY : integer;
BEGIN
HOW_MANY <= to_integer(unsigned(apples) + unsigned(oranges));
pears <= '1' WHEN how_many = 2 ELSE
            '0';
END ARCHITECTURE struct;

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;

ENTITY test IS
END ENTITY test;

ARCHITECTURE io OF test IS
SIGNAL oranges, apples      :   std_logic_vector(3 DOWNTO 0);
SIGNAL number                  :     integer;
SIGNAL pears                  :   std_logic;
SIGNAL ERROR                  :   boolean := FALSE;
SIGNAL HOW_MANY            :   integer;
SIGNAL int_oranges        :   natural;
BEGIN
H1 : ENTITY work.rt(struct)
      PORT MAP (oranges, apples, number, pears);

oranges <= std_logic_vector(to_unsigned(int_oranges,4));
TESTER : PROCESS IS
BEGIN
    int_oranges <= 3;
    apples <= "0001";
    number <= 4;
        WAIT FOR 1 ns;
    int_oranges <= 7;
    apples <= "0001";
    number <= 4;
        WAIT FOR 1 ns;
    int_oranges <= 1;
    apples <= "0001";
    number <= 2;
        WAIT FOR 1 ns;
END PROCESS TESTER;

E_C : PROCESS (apples, int_oranges, number) IS
BEGIN
    ERROR <= number = HOW_MANY;
END PROCESS E_C;
END ARCHITECTURE io;

模拟

enter image description here

你可以看到HOW_MANY整数永远不会改变值和布尔值,但是梨的值std_logic值确实会改变。

干杯 d

2 个答案:

答案 0 :(得分:2)

您不会将how_many传递给实体rt的架构结构。

实体测试的架构io中的信号how_many未分配,并且没有提供初始值。

对于标量类型,这意味着默认初始值为T'LEFT或-2147483648,如波形上所示,显示test / HOW_MANY的值。

enter image description here

答案 1 :(得分:2)

@ User1155120已经回答了具体细节。

更多背景知识:VHDL是一种比通常所假设的语言更高级的语言,不仅是强类型语言,而且它以包和实体的形式为抽象和封装提供了非常好的工具。

具体来说,这里是&#34;实体&#34;是rt的公共接口,而体系结构是私有的:没有其他东西可以检查内部。在&#34; C&#34;术语就像它HOW_MANY信号被声明为static一样。在测试平台中声明的HOW_MANY信号是一个完全独立的信号,与rt.HOW_MANY没有连接。请注意,无法从顶层访问限定名称rt.HOW_MANY - 这会破坏抽象。

那么这对测试平台意味着什么呢?

传统上,测试一直在&#34;黑盒子&#34;每个实体的基础:设置其输入端口,检查其输出端口,即测试其公共接口,这是验证它是否符合其规范所需要做的全部工作。 (并使用经过单元测试的组件组装更大的设计)。

在VHDL-2008之前,没有能力打破抽象 - 并观察内部细节(可能在同一实体的不同架构之间有所不同),尽管您可以检查模拟器中的所有内部信号。波形输出。

VHDL-2008引入了语法,允许测试平台打破抽象,并允许通过&#34;外部名称&#34;直接访问内部信号。 ...请参阅此introduction from Doulos和此StackExchange Q&A

很明显,这很脆弱:更改架构中的一些内部细节,通常需要重写测试平台才能匹配。

我还没有找到它的好用...

您的模拟器是否支持VHDL-2008外部名称是另一回事:可能需要启用VHDL-2008编译,或者您可能需要联系工具供应商并提供添加功能的增强请求(或找到一个更好的工具。)