Инициализирую ROM
(«Телесистемы»: Конференция «Языки описания аппаратуры (VHDL и др.))

миниатюрный аудио-видеорекордер mAVR

Отправлено zlyh 01 декабря 2006 г. 11:37

(Verilog-ников тоже интересно послушать.)

Написал модуль ROM


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
);
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;
signal ROM : rom_t;

begin

DO <= ROM(TO_INTEGER(ADR));

end architecture ROM_arch;

Теперь хочу проинициализировать сигнал ROM. Но эту инициализацию параметризировать.
Я помню что такая вещь всё ещё остаётся implementation specific, но хочется чего нибудь
поуниверсальнее.

Самое простое (и для моделирования это точно работает) в том же модуле объявить
константу (или функцию) и присвить её.


constant ROMinit_c : rom_t := (
0 => RESIZE(O"0", DataWidth_g),
1 => RESIZE(O"1", DataWidth_g),
others => RESIZE(O"7", DataWidth_g)
);
signal ROM : rom_t := ROMinit_c;

А вот теперь хочу передать эту константу извне...
Объявляем generic. В декларации я обязан объявить её тип, и тип должен быть известен. Описывать
array внутри generic я уже не могу. Использовать тип rom_t не могу, т.к. он далеко внутри.

Создаю package и этот array-ный тип описываю в package.


library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

package mypckg is
type rom_t is array (natural range <>) of unsigned;
end package mypckg;

Только вот не могу я объявить ...(natural range <>) of unsigned т.к. "Element of array type is unconstrained."
Тип unsigned он уже массив сам по себе.
Я могу сказать ...(natural range <>) of unsigned(DataWidth_g-1 downto 0);
Т.е. одну размерность я параметризировал. В package она не ограничена и в конкретном использовании я
подставлю конкретный диапазон, но что делать со второй? Её я обязан ограничить внутри package.

Или константу инициалиции объявить как 2-мерный массив, а внутри ROM написать функцию
преобразования 2мерного массива в одномерный массив одномерных массивов?
Или проще передать имя файла а внутри ROM написать функцию чтения из файла и присвоение
его содержимого в ROMinit_c?

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа
Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
URL изображения: 
если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
что получится, если сложить 4 и 4 ?


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание