Function 使用函数从阵列初始化ROM,合成错误(VHDL)
好的,我有一个ROM初始化函数的问题。 在我开始讨论这个问题之前,让我解释一下我的问题和代码的性质 我想做的是生成N个ROM,我必须将其用作运行匹配算法的模块的输入。 我的问题是,我有一个带有签名的文件(假设总共64个),我想根据生成的数量将其加载到不同的ROM中(在我的情况下为2次幂,例如8个ROM,每个ROM有8个签名) 我认为最好的方法是将整个文本文件加载到一个数组中(使用体系结构主体之外的函数),然后使用该数组(再次在函数中)将数据加载到一个更小的数组中,该数组将成为我的ROM 在我看来,合成器会忽略大阵列,因为我在我的架构中没有实际使用它 现在的问题是,由于第二个数组输入参数依赖于信号,合成器只会忽略它们,并将我的数组绑定到零(第57行) 有人知道还有什么方法可以让这个体系结构合成吗Function 使用函数从阵列初始化ROM,合成错误(VHDL),function,initialization,vhdl,rom,xilinx-ise,Function,Initialization,Vhdl,Rom,Xilinx Ise,好的,我有一个ROM初始化函数的问题。 在我开始讨论这个问题之前,让我解释一下我的问题和代码的性质 我想做的是生成N个ROM,我必须将其用作运行匹配算法的模块的输入。 我的问题是,我有一个带有签名的文件(假设总共64个),我想根据生成的数量将其加载到不同的ROM中(在我的情况下为2次幂,例如8个ROM,每个ROM有8个签名) 我认为最好的方法是将整个文本文件加载到一个数组中(使用体系结构主体之外的函数),然后使用该数组(再次在函数中)将数据加载到一个更小的数组中,该数组将成为我的ROM 在我看来
library ieee;
use ieee.std_logic_1164.all;
use IEEE.std_logic_signed.all;
use std.textio.all;
entity signatures_rom_partial is
generic(
data_width : integer := 160;
cycle_int : integer :=32;
rom_size : integer := 4
);
port ( clk : in std_logic;
reset : in std_logic;
readlne: in integer range 0 to cycle_int-1; -- user input for array data initialization
address: in integer range 0 to rom_size-1; -- address for data read
data: out std_logic_vector(data_width-1 downto 0) -- data output
);
end signatures_rom_partial;
architecture rom_arch of signatures_rom_partial is
type rom_type is array (0 to cycle_int-1) of bit_vector (data_width-1 downto 0); -- big array for all signatures, not used in arch
type test_type is array (0 to rom_size-1) of std_logic_vector (data_width-1 downto 0); -- smaller ROMs used in arch
--Read from file function--
----------------------------------------------------------------------------------------------------------
impure function InitRomFromFile (RomFileName : in string) return rom_type is --
file RomFile : text is in RomFileName; --
variable RomFileLine : line; --
variable rom : rom_type; --
--
begin --
for i in rom_type'range loop --
readline (RomFile, RomFileLine); --
read (RomFileLine, rom(i)); --
end loop; --
return rom; --
end function; --
----------------------------------------------------------------------------------------------------------
--Function for smaller ROM initialization--
----------------------------------------------------------------------------------------------------------
impure function initPartRom (rom : rom_type; readlne : integer) return test_type is --
variable test_array : test_type; --
--
begin --
for j in test_type'range loop --
test_array(j) := to_stdlogicvector(rom(j+readlne)); --
end loop; --
return test_array; --
end function; --
----------------------------------------------------------------------------------------------------------
constant rom : rom_type := InitRomFromFile("signatures_input.txt");
signal test_array : test_type := initPartRom(rom , readlne); --(LINE 57) SYNTHESIZER IGNORES THESE INPUT ARGUMENTS
begin
process(clk,reset)
begin
if reset='1' then
data<=(others=>'0');
elsif (clk'event and clk='1') then
data <= (test_array(address));
end if;
end process;
end rom_arch;
ieee库;
使用ieee.std_logic_1164.all;
使用IEEE.std\u logic\u signed.all;
使用std.textio.all;
实体签名是部分的
一般的(
数据宽度:整数:=160;
周长:整数:=32;
rom_大小:整数:=4
);
端口(时钟:在标准逻辑中;
复位:在标准逻辑中;
readlne:在整数范围0到循环\u int-1;--用于数组数据初始化的用户输入
地址:在0到rom_size-1的整数范围内;--数据读取地址
数据:输出标准逻辑向量(数据宽度-1到0)——数据输出
);
结束签名\u rom\u部分;
签名的体系结构rom_arch_rom_partial是
类型rom_type是位向量(数据_宽度-1向下到0)的数组(0到循环_int-1);--用于所有签名的大数组,不用于arch
类型测试类型是标准逻辑向量的数组(0到rom大小-1)(数据宽度-1到0);--arch中使用的较小ROM
--从文件读取函数--
----------------------------------------------------------------------------------------------------------
不纯函数InitRomFromFile(RomFileName:in string)返回的rom类型为--
文件RomFile:文本在RomFileName中--
变量行:行--
变量rom:rom_型--
--
开始--
对于“rom_类型”范围循环中的i--
读线(RomFile,RomFileLine)--
读取(RomFileLine,rom(i))--
端环--
返回rom--
末端功能--
----------------------------------------------------------------------------------------------------------
--用于较小ROM初始化的函数--
----------------------------------------------------------------------------------------------------------
不纯函数initPartRom(rom:rom\u类型;readlne:integer)返回测试\u类型为--
变量test_数组:test_类型--
--
开始--
用于测试_型“量程回路”中的j--
测试数组(j):=到标准逻辑采集器(rom(j+readlne))--
端环--
返回测试单元阵列--
末端功能--
----------------------------------------------------------------------------------------------------------
常量rom:rom_type:=InitRomFromFile(“signatures_input.txt”);
信号测试_数组:测试_类型:=initPartRom(rom,readlne)--(第57行)合成器忽略这些输入参数
开始
过程(时钟、复位)
开始
如果reset='1',则
数据“0”);
elsif(clk'事件和clk='1'),然后
数据使用Xilinx ISE(14.7),即使通过函数从外部文件读取初始数据,也可以合成ROM和RAM
唯一的要求是,读取函数必须在合成时可计算。对于您的代码,这是不正确的,因为在调用函数时,readlne
不是静态的。您应该将其更改为泛型而不是输入,并为每个其他ROM实例为此泛型分配不同的值。那么它应该按预期的那样工作
如何从(Xilinx).mem格式的文本文件中读取初始化数据的示例实现可以在命名空间中找到,或者我将转换您的“签名”