Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ПЗУ как дешифратор
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Языки проектирования на ПЛИС (FPGA)
Мур
Есть задача расщепить адресное пространство на 3 одинаковых модуля, чтобы внутреннее содержимое можно было видеть без пробелов. У меня есть решение, но оно имеет 3 слоя логики.
Подумалось, что можно сделать быстрее по быстродействию при помощи ПЗУ. Однако нарвался на сообщение "Multiple declarations of unsigned included via multiple use clauses;" help.gif
Цитата
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.gif
Maverick
Цитата(Мур @ Sep 7 2017, 22:31) *
Есть задача расщепить адресное пространство на 3 одинаковых модуля, чтобы внутреннее содержимое можно было видеть без пробелов. У меня есть решение, но оно имеет 3 слоя логики.
Подумалось, что можно сделать быстрее по быстродействию при помощи ПЗУ. Однако нарвался на сообщение "Multiple declarations of unsigned included via multiple use clauses;" help.gif


Как обойти преграду? Спасибо за любые наводки! tort.gif

Не проще сделать 2 старших разряда счётчика/адреса как управляющий сигнал для мультиплексора, выбора модуля памяти.
И мультиплексор тоже сделать синхронным, возможно мультиплексор и не понадобиться, если сделать разрешение работы модулей по двум старшим разрядам шины адреса. В итоге получаем запись/чтение за два такта, но зато повышается быстродействие. Здесь не забываем сделать pipeline=2 для шины данных и Ареса.
Или если все в одном блоке памяти просто выше указанным способом разделить на 4 части адресное пространство. Тогда при чтении/записи данных в память вы делаете сразу в двух старших разрядах предустановку с каким адресным пространством работаетете... разрядность счётчика адреса на два разряда меньше, чем разрядность адресной шины. Два старших разряда к счётчику добавляем операцией конкатинации
Или шину данных увеличить в 3 раза, тогда вы будете читать/писать данные сразу для трёх модулей

Да и возьмите из темплате нормальное описание для блочной памяти. Логику управления сделайте уровнем выше... Пользуйтесь генериком для задания разрядности шин и package. Очень удобно, это просто совет Память можно инициализировать изначально.
Мур
Цитата(Maverick @ Sep 7 2017, 22:48) *
Не проще сделать ...

Вопрос не в том как сделать проще, а в том, как сгенерировать содержимое ПЗУ, что решает эту проблему на раз...

ТЗ менять нельзя.
Maverick
Цитата(Мур @ Sep 8 2017, 06:56) *
Вопрос не в том как сделать проще, а в том, как сгенерировать содержимое ПЗУ, что решает эту проблему на раз...

ТЗ менять нельзя.

64 значения можно просто прописать как массив чисел...
el.d
Цитата(Мур @ Sep 7 2017, 20:31) *
Однако нарвался на сообщение "Multiple declarations of unsigned included via multiple use clauses;"


Не совсем уверен, но мне кажется это потому, что вы одновременно используете numeric_std и std_logic_arith, хотя везде предупреждают не использовать их вместе...
andrew_b
Цитата(Мур @ Sep 7 2017, 22:31) *
Как обойти преграду? Спасибо за любые наводки! tort.gif

Во-первых, как уже сказали, не использовать одновременно 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).
Мур
Цитата(Maverick @ Sep 8 2017, 07:24) *
64 значения можно просто прописать как массив чисел...

Собственно я так и сделал в итоге. Нет времени, увы..

Цитата(andrew_b @ Sep 8 2017, 10:05) *
Во-первых, как уже сказали, не использовать одновременно numeric_std и std_logic_arith. Второй вообще никогда не использовать.

Вам нужно добавить индекс:

Но тут остаётся неопределённым RAM (0).


Отлично! Спасибо! Я как всегда зевнул в спешке... Вернусь как освобожусь
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.