Перейти к содержанию
    

ПЗУ как дешифратор

Есть задача расщепить адресное пространство на 3 одинаковых модуля, чтобы внутреннее содержимое можно было видеть без пробелов. У меня есть решение, но оно имеет 3 слоя логики.

Подумалось, что можно сделать быстрее по быстродействию при помощи ПЗУ. Однако нарвался на сообщение "Multiple declarations of unsigned included via multiple use clauses;" :help:

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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть задача расщепить адресное пространство на 3 одинаковых модуля, чтобы внутреннее содержимое можно было видеть без пробелов. У меня есть решение, но оно имеет 3 слоя логики.

Подумалось, что можно сделать быстрее по быстродействию при помощи ПЗУ. Однако нарвался на сообщение "Multiple declarations of unsigned included via multiple use clauses;" :help:

 

 

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

Не проще сделать 2 старших разряда счётчика/адреса как управляющий сигнал для мультиплексора, выбора модуля памяти.

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

Или если все в одном блоке памяти просто выше указанным способом разделить на 4 части адресное пространство. Тогда при чтении/записи данных в память вы делаете сразу в двух старших разрядах предустановку с каким адресным пространством работаетете... разрядность счётчика адреса на два разряда меньше, чем разрядность адресной шины. Два старших разряда к счётчику добавляем операцией конкатинации

Или шину данных увеличить в 3 раза, тогда вы будете читать/писать данные сразу для трёх модулей

 

Да и возьмите из темплате нормальное описание для блочной памяти. Логику управления сделайте уровнем выше... Пользуйтесь генериком для задания разрядности шин и package. Очень удобно, это просто совет Память можно инициализировать изначально.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не проще сделать ...

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

64 значения можно просто прописать как массив чисел...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Однако нарвался на сообщение "Multiple declarations of unsigned included via multiple use clauses;"

 

Не совсем уверен, но мне кажется это потому, что вы одновременно используете numeric_std и std_logic_arith, хотя везде предупреждают не использовать их вместе...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как обойти преграду? Спасибо за любые наводки! :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).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

64 значения можно просто прописать как массив чисел...

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

 

Во-первых, как уже сказали, не использовать одновременно numeric_std и std_logic_arith. Второй вообще никогда не использовать.

 

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

 

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

 

Отлично! Спасибо! Я как всегда зевнул в спешке... Вернусь как освобожусь

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...