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