Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс. e-mail:jobsmp@pochta.ru |
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity ROM is
generic(DataWidth_g : in positive := 32;
AdrWidth_g : in positive := 10;
-- InitArr_g это и есть тот параметр (одномерный массив
-- бит) через который я передаю сюда начальное значение
InitArr_g : in unsigned
);
port (
ADR : in unsigned(AdrWidth_g-1 downto 0);
DO : out unsigned(DataWidth_g-1 downto 0)
);
end entity ROM;
architecture ROM_arch of ROM is
subtype datwidth_t is unsigned(DataWidth_g-1 downto 0);
constant romdepth_c : positive := 2**AdrWidth_g;
type rom_t is array (romdepth_c-1 downto 0) of datwidth_t;
-- преобразует одномерный массив во что надо
function ArrInit
(InitArr : in unsigned)
return rom_t is
variable ROM : rom_t := (others => (others => '0'));
constant InitArrLen_c : positive := InitArr'LENGTH;
variable k : integer := 0;
begin
for i in rom_t'RANGE loop
for j in datwidth_t'RANGE loop
k := i * datwidth_t'LENGTH + j;
ROM(i)(j) := InitArr(k);
end loop;
end loop;
return ROM;
end function ArrInit;
-- декларация константы
constant ROMinit_c : rom_t := ArrInit(InitArr_g);
-- собственно инициализация
signal ROM : rom_t;
begin
DO <= ROM(TO_INTEGER(ADR));
end architecture ROM_arch;
Что хорошо. Избежал дополнительных внешних деклараций (в своём package). Всё стандартно.
Ну и будет функция преобразования "человеческого" ROM-а в одномерный массив.
Наверно можно было и классический 2-х мерный массив сюда...
Синтезировать не пробовал.