Мур 1 7 сентября, 2017 Опубликовано 7 сентября, 2017 · Жалоба Есть задача расщепить адресное пространство на 3 одинаковых модуля, чтобы внутреннее содержимое можно было видеть без пробелов. У меня есть решение, но оно имеет 3 слоя логики. Подумалось, что можно сделать быстрее по быстродействию при помощи ПЗУ. Однако нарвался на сообщение "Multiple declarations of unsigned included via multiple use clauses;" library IEEE; use IEEE.STD_LOGIC_1164.ALL; use ieee.numeric_std.all; use ieee.std_logic_arith.all; entity CS_ROM is Port ( ADR_INP : in STD_LOGIC_VECTOR (5 downto 0); CS_INP : in STD_LOGIC; ADR_OUT : out STD_LOGIC_VECTOR (4 downto 0); CS_OUT : out STD_LOGIC_VECTOR (2 downto 0)); end CS_ROM; architecture Behavioral of CS_ROM is type ram_type is array (63 downto 0) of std_logic_vector (7 downto 0); signal RAM : ram_type; -- signal bus_b: std_logic_vector(7 downto 0); begin mem: for i in 1 to 63 generate RAM <= conv_std_logic_vector(conv_integer(i/3),5) & conv_std_logic_vector(conv_integer(i rem 3),3); end generate mem; process (ADR_INP, CS_INP) begin ADR_OUT <= RAM(to_integer(unsigned(ADR_INP)))(7 downto 3) when CS_INP = '1' else "00000"; CS_OUT <= RAM(to_integer(unsigned(ADR_INP)))(2 downto 0) when CS_INP = '1' else "111"; -- bus_b <= RAM(to_integer(unsigned(ADR_INP))) when CS_INP = '1' else -- "00000111"; -- ADR_OUT <= bus_b(7 downto 3); -- CS_OUT <= bus_b(2 downto 0); end process; end Behavioral; Как обойти преграду? Спасибо за любые наводки! :tort: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 7 сентября, 2017 Опубликовано 7 сентября, 2017 · Жалоба Есть задача расщепить адресное пространство на 3 одинаковых модуля, чтобы внутреннее содержимое можно было видеть без пробелов. У меня есть решение, но оно имеет 3 слоя логики. Подумалось, что можно сделать быстрее по быстродействию при помощи ПЗУ. Однако нарвался на сообщение "Multiple declarations of unsigned included via multiple use clauses;" Как обойти преграду? Спасибо за любые наводки! :tort: Не проще сделать 2 старших разряда счётчика/адреса как управляющий сигнал для мультиплексора, выбора модуля памяти. И мультиплексор тоже сделать синхронным, возможно мультиплексор и не понадобиться, если сделать разрешение работы модулей по двум старшим разрядам шины адреса. В итоге получаем запись/чтение за два такта, но зато повышается быстродействие. Здесь не забываем сделать pipeline=2 для шины данных и Ареса. Или если все в одном блоке памяти просто выше указанным способом разделить на 4 части адресное пространство. Тогда при чтении/записи данных в память вы делаете сразу в двух старших разрядах предустановку с каким адресным пространством работаетете... разрядность счётчика адреса на два разряда меньше, чем разрядность адресной шины. Два старших разряда к счётчику добавляем операцией конкатинации Или шину данных увеличить в 3 раза, тогда вы будете читать/писать данные сразу для трёх модулей Да и возьмите из темплате нормальное описание для блочной памяти. Логику управления сделайте уровнем выше... Пользуйтесь генериком для задания разрядности шин и package. Очень удобно, это просто совет Память можно инициализировать изначально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Мур 1 8 сентября, 2017 Опубликовано 8 сентября, 2017 · Жалоба Не проще сделать ... Вопрос не в том как сделать проще, а в том, как сгенерировать содержимое ПЗУ, что решает эту проблему на раз... ТЗ менять нельзя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 8 сентября, 2017 Опубликовано 8 сентября, 2017 · Жалоба Вопрос не в том как сделать проще, а в том, как сгенерировать содержимое ПЗУ, что решает эту проблему на раз... ТЗ менять нельзя. 64 значения можно просто прописать как массив чисел... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
el.d 0 8 сентября, 2017 Опубликовано 8 сентября, 2017 · Жалоба Однако нарвался на сообщение "Multiple declarations of unsigned included via multiple use clauses;" Не совсем уверен, но мне кажется это потому, что вы одновременно используете numeric_std и std_logic_arith, хотя везде предупреждают не использовать их вместе... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 8 сентября, 2017 Опубликовано 8 сентября, 2017 · Жалоба Как обойти преграду? Спасибо за любые наводки! :tort: Во-первых, как уже сказали, не использовать одновременно numeric_std и std_logic_arith. Второй вообще никогда не использовать. Но дело не в этом. Дело в mem: for i in 1 to 63 generate RAM <= conv_std_logic_vector(conv_integer(i/3),5) & conv_std_logic_vector(conv_integer(i rem 3),3); end generate mem; Этот код -- более короткая запись следующего: RAM <= conv_std_logic_vector(conv_integer(1/3),5) & conv_std_logic_vector(conv_integer(1 rem 3),3); RAM <= conv_std_logic_vector(conv_integer(2/3),5) & conv_std_logic_vector(conv_integer(2 rem 3),3); RAM <= conv_std_logic_vector(conv_integer(3/3),5) & conv_std_logic_vector(conv_integer(3 rem 3),3); ... RAM <= conv_std_logic_vector(conv_integer(63/3),5) & conv_std_logic_vector(conv_integer(63 rem 3),3); В результате получаем множественные драйвера для RAM. Вам нужно добавить индекс: mem: for i in 1 to 63 generate RAM (i) <= conv_std_logic_vector(conv_integer(i/3),5) & conv_std_logic_vector(conv_integer(i rem 3),3); end generate mem; Но тут остаётся неопределённым RAM (0). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Мур 1 8 сентября, 2017 Опубликовано 8 сентября, 2017 · Жалоба 64 значения можно просто прописать как массив чисел... Собственно я так и сделал в итоге. Нет времени, увы.. Во-первых, как уже сказали, не использовать одновременно numeric_std и std_logic_arith. Второй вообще никогда не использовать. Вам нужно добавить индекс: Но тут остаётся неопределённым RAM (0). Отлично! Спасибо! Я как всегда зевнул в спешке... Вернусь как освобожусь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться