首页 文章

VHDL信号分配混乱

提问于
浏览
0

我正在研究VHDL并遇到了一个我无法找到答案的问题 . 我理解下面的例子以及结果为7的原因:

architecture SIGN of EXAMPLE is
  signal TRIGGER, RESULT: integer := 0; 
  signal signal1: integer :=1;
  signal signal2: integer :=2;
  signal signal3: integer :=3;
begin

  process 
  begin
    wait on TRIGGER;
    signal1 <= signal2;
    signal2 <= signal1 + signal3;
    signal3 <= signal2;
    RESULT <= signal1 + signal2 + signal3;
  end process;

end SIGN;

但是,如果我将signal1放在灵敏度列表中会发生什么?还是所有的信号?

2 回答

  • 2

    首先,如果为进程创建了敏感性列表,则必须删除或注释掉 wait on TRIGGER 语句,因为具有敏感性列表的进程也不能具有 wait 语句 .

    如果 signal1 是过程敏感性列表,则该过程最初运行,然后只要 signal1 发生更改就重新运行 .

    默认值后或基于进程运行中的赋值的值适用于 signal1signal2signal3RESULT

    Default.:  1,  2,  3,  0
    First...:  2,  4,  2,  6
    Re-run 1:  4,  4,  4,  8
    Re-run 2:  4,  8,  4, 12
    

    请记住,信号分配在过程完成之后才会生效,基于增量循环仿真模型 .

    由于重新运行1和2之间的 signal1 没有变化,因此该进程不再运行,因此 RESULT 的值为12,从上次运行开始 .

    如果 signal1signal2 在过程灵敏度列表中,则每个过程运行将改变其中一个信号,因此过程将继续重新运行,直到达到模拟器增量循环迭代限制或 integer 数据将超出范围值类型,导致值没有进一步变化 .

  • 2

    你没有展示完整的例子以及你提出的改变,而是在挥手 .

    目前,为什么RESULT = 0?

    你为什么不模拟这一切?

    entity example is
    end entity;
    
    architecture SIGN of EXAMPLE is
    signal TRIGGER, RESULT: integer := 0; 
    signal signal1: integer :=1;
    signal signal2: integer :=2;
    signal signal3: integer :=3;
    begin
    process 
    begin
    wait on TRIGGER;
    signal1 <= signal2;
    signal2 <= signal1 + signal3;
    signal3 <= signal2;
    RESULT <= signal1 + signal2 + signal3;
    end process;
    monitor:
        process(RESULT)
        begin
            report "RESULT = " & integer'image(RESULT);
        end process;
    end SIGN;
    

    sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 0

    entity example is
    end entity;
    
    architecture SIGN of EXAMPLE is
    signal TRIGGER, RESULT: integer := 0; 
    signal signal1: integer :=1;
    signal signal2: integer :=2;
    signal signal3: integer :=3;
    begin
    process (signal1)
    begin
    -- wait on TRIGGER;
    signal1 <= signal2;
    signal2 <= signal1 + signal3;
    signal3 <= signal2;
    RESULT <= signal1 + signal2 + signal3;
    end process;
    monitor:
        process(RESULT)
        begin
            report "RESULT = " & integer'image(RESULT);
        end process;
    end SIGN;
    

    sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 0 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 6 sign.vhdl:21:9:@ 0ms: (报告说明):RESULT = 8 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 12

    entity example is
    end entity;
    
    architecture SIGN of EXAMPLE is
    signal TRIGGER, RESULT: integer := 0; 
    signal signal1: integer :=1;
    signal signal2: integer :=2;
    signal signal3: integer :=3;
    begin
    process (signal1, signal2, signal3)
    begin
    -- wait on TRIGGER;
    signal1 <= signal2;
    signal2 <= signal1 + signal3;
    signal3 <= signal2;
    RESULT <= signal1 + signal2 + signal3;
    end process;
    monitor:
        process(RESULT)
        begin
            report "RESULT = " & integer'image(RESULT);
        end process;
    end SIGN;
    

    sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 0 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 6 sign.vhdl:21:9:@ 0ms: (报告说明):RESULT = 8 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 12 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 16 sign.vhdl: 21:9:@ 0ms :(报告说明):RESULT = 24 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 32 sign.vhdl:21:9:@ 0ms :(报告说明):结果= 48 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 64 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 96 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 128 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 192 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 256符号 . vhdl:21:9:@ 0ms :(报告说明):RESULT = 384 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 512 sign.vhdl:21:9:@ 0ms :(报告说明) ):RESULT = 768 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 1024 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 1536 sign.vhdl:21:9 :@ 0ms :(报告说明):RESULT = 2048 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 3072 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 409 6 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 6144 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 8192 sign.vhdl:21:9:@ 0ms: (报告说明):RESULT = 12288 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 16384 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 24576 sign.vhdl: 21:9:@ 0ms :(报告说明):RESULT = 32768 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 49152 sign.vhdl:21:9:@ 0ms :(报告说明):结果= 65536 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 98304 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 131072 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 196608 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 262144 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 393216符号 . vhdl:21:9:@ 0ms :(报告说明):RESULT = 524288 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 786432 sign.vhdl:21:9:@ 0ms :(报告说明) ):RESULT = 1048576 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 1572864 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 2097152 sign.vhdl:21:9 :@ 0ms :(报告说明):RESULT = 3145728 sign.vhdl:21:9:@ 0ms :(报告说明):R ESULT = 4194304 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 6291456 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 8388608 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 12582912 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 16777216 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 25165824 sign . vhdl:21:9:@ 0ms :(报告说明):RESULT = 33554432 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 50331648 sign.vhdl:21:9:@ 0ms :(报告说明) ):RESULT = 67108864 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 100663296 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 134217728 sign.vhdl:21:9 :@ 0ms :(报告说明):RESULT = 201326592 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 268435456 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 402653184 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 536870912 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 805306368 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 1073741824 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 1610612736 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = -2147483648 sign.vhdl: 21:9:@0米s :(报告说明):RESULT = -1073741824 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 0 sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = -2147483648sign.vhdl:21:9:@ 0ms :(报告说明):RESULT = 0

    RESULTTRIGGER 添加到灵敏度列表会给出相同的答案 . 你能说出原因吗?

    值翻转实际上揭示了此VHDL实现中的错误 .

    IEEE标准1076-2008,5.2.3整数类型,5.2.3.1概述,第7 / -1993号,3.1.2整数类型,第7段(注释9.2参考文献在1992年的7.2中):

    为所有整数类型预定义相同的算术运算符(见9.2) . 如果执行这样的操作(特别是隐式转换)不能传递正确的结果(即,如果对应于数学结果的值不是整数类型的值)则是错误的 .

    “这是一个错误”没有留下没有正确结果的余地 . 对于超过INTEGER'HIGH的“”运算结果,模拟应该有一个错误 . 测试声明为INTEGER类型的信号子类型的边界是错误的 .

相关问题