【问题标题】:Bad conversion of integer into a string using integer'image使用 integer'image 将整数转换为字符串错误
【发布时间】:2014-08-29 20:20:49
【问题描述】:

我的 VHDL 代码有问题。函数 integer'image 无法正常工作。在项目的顶部,我用两个“生成”调用了一个实体(region_engine),代码如下:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_misc.all;
use ieee.numeric_std.all;
use std.textio.all;
.....

ENGINE_ROW:
for i in 1 to sqrt_REGIONS_NUMBER generate
begin
    ENGINES_COL:
    for j in 1 to sqrt_REGIONS_NUMBER generate
    begin
        ENGINE_REGION_inst: entity work.region_engine
            PORT MAP         
            ( CLOCK                 => CLOCK,
              RESET                 => RESET,
              HITDATA               => hitdata_region(4*(i-1)+j-1),
              DV                    => data_valid((i-1)*sqrt_REGIONS_NUMBER + j-1),
              BUSY_MAX              => busy_red,
              CLKEN                 => CLKEN_ACC,
              number_i              => (i-1),
              number_j              => (j-1),
              ECS_BUS               => ECS

          );
    end generate ENGINES_COL;
end generate ENGINE_ROW;

我通过number_i传递索引i和j,number_j定义为整数。这里的代码 区域引擎:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_misc.all;
use ieee.numeric_std.all;
use std.textio.all;

entity region_engine is
port
(
    CLOCK                   : in    std_logic;
    RESET               : in    std_logic;
    HITDATA                 : in    std_logic_vector(DATA_ENGINE-1 +4 downto 0);
    DV                      : in    std_logic;
    BUSY_MAX                : in    std_logic;
    CLKEN                   : in    std_logic; ---forse non serve
    number_i                : in    integer;
    number_j                : in    integer;
    ECS_BUS             : in    std_logic_vector(31 downto 0)   
);
end entity region_engine;
....

ENGINEs_row :
for k in 0 to 3 generate
begin
ENGINEs_col:
    for m in 0 to 3 generate

     constant romfile_weight : string := "E:\Work\LHCb_Tesi\enginetoy_IT_test_allweight\lut_engine\peso_it\weight_engine_" & integer'image(16*number + k) & ".hex";
     constant romfile_intersect : string := "E:\Work\LHCb_Tesi\enginetoy_IT_test_allweight\lut_engine\intersection_it_256\intersect_engine_" & integer'image(4*number_i + k) & "_" & integer'image((4*number_j + m)) &".hex";

begin

    engine_inst : entity work.engine
    GENERIC MAP
    (
        ENGINE_WEIGHT_FILE      => romfile_weight,
        ENGINE_INTERSECT_FILE   => romfile_intersect
    )
    PORT MAP
    (
        CLOCK               => CLOCK,
        RESET               => RESET,
        HITDATA         => c2(4*k + m)(DATA_ENGINE -1 downto 0),--HITDATA(i)(DATA_ENGINE -1 downto 0),--
        ACC_RESET       => acc_rst,--ed, --EE_delay,
        ACC_EN          => g,--e,--
        ECS_DATA            =>  ECS_BUS(DATA_ENGINE -1 downto 0),
        INTERSECT_ADD   =>  address(4*k +m),
        WRITE_EN            => w_en,--(i),
        ACC_ENG         => acc_16_eng(4*k + m)
    );
    end generate ENGINEs_col;       
end generate ENGINEs_row;       

我想向实体引擎传递一个名为 intersect_engine_x_y.hex 的文件。由于先前的索引范围,该值 4*number_i + k 和 4*number_j +m 应该有一个从 0 到 15 的范围。但是如果我尝试使用 modelsim-altera 模拟代码,这些值与我期望的值不匹配,特别是值 4*number_i - 4*number_j 被置为零。 相反,如果我输入字符串只是 number_i,number_j,如下所示

constant romfile_intersect : string := "E:\Work\LHCb_Tesi\enginetoy_IT_test_allweight\lut_engine\intersection_it_256\intersect_engine_" & integer'image(number_i) & "_" & integer'image((number_j)) &".hex";

我在modelsim中读到了这个字符串:

"E:\Work\LHCb_Tesi\enginetoy_IT_test_allweight\lut_engine\intersection_it_256\intersect_engine_-2147483648_-2147483648.hex" 

我不知道这种行为的原因,函数 integer'image 可能有问题吗?

感谢您的帮助。

【问题讨论】:

    标签: vhdl


    【解决方案1】:

    索引值 i 和 j 应该通过泛型传递给region_engine, 而不是端口,因此将实体更改为:

    entity region_engine is
      generic (
        NUMBER_I : integer;
        NUMBER_J : integer);
      port (
        CLOCK    : in std_logic;
        RESET    : in std_logic;
        DV       : in std_logic;
        BUSY_MAX : in std_logic;
        CLKEN    : in std_logic;            -- Force non serve
        ECS_BUS  : in std_logic_vector(31 downto 0));
    end entity region_engine;
    

    生成应相应更改为:

    ENGINE_ROW :
      for i in 1 to sqrt_REGIONS_NUMBER generate
      begin
        ENGINES_COL :
        for j in 1 to sqrt_REGIONS_NUMBER generate
        begin
          ENGINE_REGION_inst : entity work.region_engine
            generic map (
              NUMBER_I => (i-1),
              NUMBER_J => (j-1))
            port map (
              CLOCK    => CLOCK,
              RESET    => RESET,
              HITDATA  => hitdata_region(4*(i-1)+j-1),
              DV       => data_valid((i-1)*sqrt_REGIONS_NUMBER + j-1),
              BUSY_MAX => busy_red,
              CLKEN    => CLKEN_ACC,
              ECS_BUS  => ECS);
        end generate ENGINES_COL;
      end generate ENGINE_ROW;
    

    您在其他情况下看到用于 number_i 的值 -2147483648 的原因, 是 number_i 在使用时未初始化,因为 VHDL 执行模型,因此具有最低整数值 (integer'low), 这是-2**31。所以integer'image 给出了预期的结果。

    顺便说一句。使用标准 IEEE 包numeric_std 和非标准 包(实际上是 Synopsys 专有的)std_logic_arith 很可能 导致问题,例如unsigned 在两者中都声明了。所以你可以考虑 删除所有std_logic_arith,仅使用numeric_std

    【讨论】:

    • 在常量表达式中使用端口/信号似乎甚至不应该编译/详细说明...(真的,ModelSim 不会抱怨吗??)
    • @fru1tbat:VHDL-2002 模式下的 ModelSim 可以使用整数输入端口的常量表达式,就像它也可以接受 '1' and '0' 用于 std_logic 端口等。
    • 我关心的不是将文字分配给输入端口的事实 - 在表达式 constant romfile_weight : string := ... number_i ... 中,number_i 是输入端口,即根本不是静态的,至少在分析时.我很惊讶编译...
    • @fru1tbat:说得好,ModelSim 似乎给出了类似(vcom-1013) Initial value of "romfile_weight" depends on value of signal "number_i".的警告
    猜你喜欢
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2020-08-29
    相关资源
    最近更新 更多