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

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


Знающий
****

Группа: Свой
Сообщений: 815
Регистрация: 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
 
Start new topic
Ответов
andrew_b
сообщение Sep 8 2017, 07:05
Сообщение #2


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

Группа: Свой
Сообщений: 1 975
Регистрация: 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



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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 09:03
Рейтинг@Mail.ru


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