реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> ПЗУ как дешифратор, Как лаконично описать модуль ROM?
Мур
сообщение Sep 7 2017, 19:31
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 753
Регистрация: 7-06-06
Из: Харьков
Пользователь №: 17 847



Есть задача расщепить адресное пространство на 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
Go to the top of the page
 
+Quote Post
Maverick
сообщение Sep 7 2017, 19:48
Сообщение #2


я только учусь...
******

Группа: Модераторы
Сообщений: 3 366
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(Мур @ 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. Очень удобно, это просто совет Память можно инициализировать изначально.


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
Мур
сообщение Sep 8 2017, 03:56
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 753
Регистрация: 7-06-06
Из: Харьков
Пользователь №: 17 847



Цитата(Maverick @ Sep 7 2017, 22:48) *
Не проще сделать ...

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

ТЗ менять нельзя.
Go to the top of the page
 
+Quote Post
Maverick
сообщение Sep 8 2017, 04:24
Сообщение #4


я только учусь...
******

Группа: Модераторы
Сообщений: 3 366
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



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

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

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


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
el.d
сообщение Sep 8 2017, 04:57
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 2-08-17
Пользователь №: 98 600



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


Не совсем уверен, но мне кажется это потому, что вы одновременно используете numeric_std и std_logic_arith, хотя везде предупреждают не использовать их вместе...
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Sep 8 2017, 07:05
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 800
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(Мур @ 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).
Go to the top of the page
 
+Quote Post
Мур
сообщение Sep 8 2017, 08:10
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 753
Регистрация: 7-06-06
Из: Харьков
Пользователь №: 17 847



Цитата(Maverick @ Sep 8 2017, 07:24) *
64 значения можно просто прописать как массив чисел...

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

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

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

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


Отлично! Спасибо! Я как всегда зевнул в спешке... Вернусь как освобожусь
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th September 2017 - 03:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01415 секунд с 7
ELECTRONIX ©2004-2016