Vhdl 使用integer';将整数转换为字符串时出错;形象

Vhdl 使用integer';将整数转换为字符串时出错;形象,vhdl,Vhdl,我的VHDL代码有问题。函数integer的映像无法正常工作。在项目的顶部,我将一个实体(region_engine)称为两个“generate”,代码如下: 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.t

我的VHDL代码有问题。函数integer的映像无法正常工作。在项目的顶部,我将一个实体(region_engine)称为两个“generate”,代码如下:

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;
我通过数字I传递索引I和j,数字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*编号i+k和4*编号j+m 应具有从0到15的范围。但是如果我尝试用modelsim altera模拟代码,这些值与我期望的值不匹配,特别是值4*number_I-4*number_j被置为零。 相反,如果我在字符串中输入数字I,数字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是否有问题


感谢您的帮助。

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

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;
在另一种情况下,您看到用于数字_i的值-2147483648的原因, 是由于 VHDL执行模型,因此具有最低整数值(
integer'low
), 也就是-2**31。因此,
integer'image
给出了预期的结果

顺便说一句,使用标准IEEE软件包
数字标准和非标准
软件包(实际上是Synopsys专有的)
std\u logic\u arith
很可能 导致问题,例如,
unsigned
在这两种语言中都声明了。所以你可以考虑
删除所有的
std\u logic\u arith
,只使用
numeric\u std

在常量表达式中使用端口/信号,看起来它甚至不应该编译/细化。。。(真的,ModelSim没有抱怨吗??)@fru1tbat:VHDL-2002模式下的ModelSim可以为整数输入端口使用常量表达式,就像它也可以为
标准逻辑
端口接受
'1'和'0'
,事实上,与我相关的不是一个文本被分配到一个输入端口,而是在表达式
常量romfile\u weight:string:=。。。number_i…
number_i
是一个输入端口,即至少在分析时根本不是静态的。我很惊讶编译…@fru1tbat:这一点很好,而且ModelSim似乎给出了一个类似于
(vcom-1013)的警告,“romfile\u weight”的初始值取决于信号“number\u I”的值。