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

 
 
 
Reply to this topicStart new topic
> Создание блока памяти RAM в ПЛИС, нужно оптимизировать
Sprite
сообщение May 24 2015, 11:03
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



Здравствуйте!
Пишу на ПЛИС блок памяти 16 ячеек по 16 бит (камень - epm570). От обычного (мегафункция "single 1-RAM PORT") отличается лишь тем, что имеет выходы данных по всем адресам (на рисунке обозначены как data_out1...data_out16).
Прикрепленное изображение

Вот описание этого элемента:
CODE
-- Quartus II VHDL Template

library ieee;
use ieee.std_logic_1164.all;

entity RAM_16x16 is

port
(
adr : IN STD_LOGIC_VECTOR (3 DOWNTO 0);
data_in : IN STD_LOGIC_VECTOR (15 DOWNTO 0);
wren : in std_logic;
clk : in std_logic;

data_cur : OUT STD_LOGIC_VECTOR (15 DOWNTO 0); --текущие данные
data_out1 : OUT STD_LOGIC_VECTOR (15 DOWNTO 0); --данные 1
data_out2 : OUT STD_LOGIC_VECTOR (15 DOWNTO 0); --данные 2
data_out3 : OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
data_out4 : OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
data_out5 : OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
data_out6 : OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
data_out7 : OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
data_out8 : OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
data_out9 : OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
data_out10 : OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
data_out11 : OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
data_out12 : OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
data_out13 : OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
data_out14 : OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
data_out15 : OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
data_out16 : OUT STD_LOGIC_VECTOR (15 DOWNTO 0) --данные 16
);

end entity;

architecture a_RAM_16x16 of RAM_16x16 is

--регистры хранения данных
SIGNAL data_1 : STD_LOGIC_VECTOR (15 DOWNTO 0);
SIGNAL data_2 : STD_LOGIC_VECTOR (15 DOWNTO 0);
SIGNAL data_3 : STD_LOGIC_VECTOR (15 DOWNTO 0);
SIGNAL data_4 : STD_LOGIC_VECTOR (15 DOWNTO 0);
SIGNAL data_5 : STD_LOGIC_VECTOR (15 DOWNTO 0);
SIGNAL data_6 : STD_LOGIC_VECTOR (15 DOWNTO 0);
SIGNAL data_7 : STD_LOGIC_VECTOR (15 DOWNTO 0);
SIGNAL data_8 : STD_LOGIC_VECTOR (15 DOWNTO 0);
SIGNAL data_9 : STD_LOGIC_VECTOR (15 DOWNTO 0);
SIGNAL data_10 : STD_LOGIC_VECTOR (15 DOWNTO 0);
SIGNAL data_11 : STD_LOGIC_VECTOR (15 DOWNTO 0);
SIGNAL data_12 : STD_LOGIC_VECTOR (15 DOWNTO 0);
SIGNAL data_13 : STD_LOGIC_VECTOR (15 DOWNTO 0);
SIGNAL data_14 : STD_LOGIC_VECTOR (15 DOWNTO 0);
SIGNAL data_15 : STD_LOGIC_VECTOR (15 DOWNTO 0);
SIGNAL data_16 : STD_LOGIC_VECTOR (15 DOWNTO 0);

begin

process (clk)
begin
if (rising_edge(clk)) then
if (wren='1') then

case adr is
when "0000" =>
data_1 <= data_in;
data_out1<=data_in;
when "0001" =>
data_2 <= data_in;
data_out2 <= data_in;
when "0010" =>
data_3 <= data_in;
data_out3 <= data_in;
when "0011" =>
data_4 <= data_in;
data_out4 <= data_in;
when "0100" =>
data_5 <= data_in;
data_out5 <= data_in;
when "0101" =>
data_6 <= data_in;
data_out6 <= data_in;
when "0110" =>
data_7 <= data_in;
data_out7 <= data_in;
when "0111" =>
data_8 <= data_in;
data_out8 <= data_in;
when "1000" =>
data_9 <= data_in;
data_out9 <= data_in;
when "1001" =>
data_10 <= data_in;
data_out10 <= data_in;
when "1010" =>
data_11 <= data_in;
data_out11 <= data_in;
when "1011" =>
data_12 <= data_in;
data_out12 <= data_in;
when "1100" =>
data_13 <= data_in;
data_out13 <= data_in;
when "1101" =>
data_14 <= data_in;
data_out14 <= data_in;
when "1110" =>
data_15 <= data_in;
data_out15 <= data_in;
when "1111" =>
data_16 <= data_in;
data_out16 <= data_in;

end case;

else

case adr is
when "0000" =>
data_cur <= data_1;
when "0001" =>
data_cur <= data_2;
when "0010" =>
data_cur <= data_3;
when "0011" =>
data_cur <= data_4;
when "0100" =>
data_cur <= data_5;
when "0101" =>
data_cur <= data_6;
when "0110" =>
data_cur <= data_7;
when "0111" =>
data_cur <= data_8;
when "1000" =>
data_cur <= data_9;
when "1001" =>
data_cur <= data_10;
when "1010" =>
data_cur <= data_11;
when "1011" =>
data_cur <= data_12;
when "1100" =>
data_cur <= data_13;
when "1101" =>
data_cur <= data_14;
when "1110" =>
data_cur <= data_15;
when "1111" =>
data_cur <= data_16;
end case;

end if;
end if;
end process;

end a_RAM_16x16;

После компиляции этот блок занимает больше половины ресурсов ПЛИС.
Уважаемые гуру ПЛИС - можно ли оптимизировать этот код?
Причина редактирования: используйте codebox для оформления больших сегментов кода (с) модератор
Go to the top of the page
 
+Quote Post
iosifk
сообщение May 24 2015, 11:23
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Sprite @ May 24 2015, 14:03) *
Здравствуйте!
Пишу на ПЛИС блок памяти 16 ячеек по 16 бит (камень - epm570). От обычного (мегафункция "single 1-RAM PORT") отличается лишь тем, что имеет выходы данных по всем адресам (на рисунке обозначены как data_out1...data_out16).
Прикрепленное изображение


После компиляции этот блок занимает больше половины ресурсов ПЛИС.
Уважаемые гуру ПЛИС - можно ли оптимизировать этот код?

Есть только 2 вопроса:
1. Зачем нужно столько выходов?
2. Почему именно эта микросхема?



--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
_pv
сообщение May 24 2015, 11:36
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



если 16бит умножить на 16слов, сколько получится? и какую часть это будет составлять от 570 имеющихся триггеров?
Go to the top of the page
 
+Quote Post
Sprite
сообщение May 24 2015, 11:41
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



Цитата(iosifk @ May 24 2015, 17:23) *
Есть только 2 вопроса:
1. Зачем нужно столько выходов?
2. Почему именно эта микросхема?


1. Выводы я планировал использовать в state-машине основной программы для получения каких-либо значений переменных (предварительно переданных с MCU).
2. Эта микросхема, потому что в проекте использовалась до этого (как вариант emp1270 или epm2210) и хотелось бы менять ее только в самом крайнем случае.
Go to the top of the page
 
+Quote Post
iosifk
сообщение May 24 2015, 11:44
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Sprite @ May 24 2015, 14:41) *
1. Выводы я планировал использовать в state-машине основной программы для получения каких-либо значений переменных (предварительно переданных с MCU).
2. Эта микросхема, потому что в проекте использовалась до этого (как вариант emp1270 или epm2210) и хотелось бы менять ее только в самом крайнем случае.

по первому пункту - делаете неправильно, т.к. из памяти можно читать и по одной шине, а не по 16-ти...
по второму тоже... Ваш "крайний" случай уже почти наступил...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Sprite
сообщение May 24 2015, 11:44
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



Цитата(_pv @ May 24 2015, 17:36) *
если 16бит умножить на 16слов, сколько получится? и какую часть это будет составлять от 570 имеющихся триггеров?

Согласен, не малую. Но эти данные я указал по максимуму, в реальности возможно будет меньше. Вопрос мой был по коду - с кодом все ОК?
Go to the top of the page
 
+Quote Post
des00
сообщение May 24 2015, 11:52
Сообщение #7


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(Sprite @ May 24 2015, 18:03) *
Пишу на ПЛИС блок памяти 16 ячеек по 16 бит (камень - epm570).

если учесть, что в вашем чипе памяти нет, то вы потратите 16*16 = 256 тригеров, только под хранение информации. В любом случае. Меняйте архитектуру решения.


--------------------
Go to the top of the page
 
+Quote Post
Sprite
сообщение May 24 2015, 12:00
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



Цитата(iosifk @ May 24 2015, 17:44) *
по первому пункту - делаете неправильно, т.к. из памяти можно читать и по одной шине, а не по 16-ти...

Данные можно читать, но для этого нужно выставлять адрес на считывание этих данных, и, если делать это в state-машине, то нужно под чтение адреса выделять одно состояние.
В процессе работы планируется постоянная передача данных от MCU к ПЛИС, т.е. нужно еще и за синхронизацией доступа к памяти следить, когда можно просто вывести значения регистров на шины и получать в каждый момент нужное значение. Поправьте, если не прав.

Цитата(des00 @ May 24 2015, 17:52) *
если учесть, что в вашем чипе памяти нет, то вы потратите 16*16 = 256 тригеров, только под хранение информации. В любом случае. Меняйте архитектуру решения.

16*16 - это по максимуму, заменить в крайнем случае epm570 на epm2210 - не проблема.
Основной вопрос был по коду - можно ли его оптимизировать или нет?
Go to the top of the page
 
+Quote Post
des00
сообщение May 24 2015, 12:04
Сообщение #9


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(Sprite @ May 24 2015, 20:00) *
Основной вопрос был по коду - можно ли его оптимизировать или нет?

нет.


--------------------
Go to the top of the page
 
+Quote Post
Sprite
сообщение May 24 2015, 12:06
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



Цитата(des00 @ May 24 2015, 18:04) *
нет.

Спасибо, это я и хотел услышать. Тему можно считать закрытой.
Go to the top of the page
 
+Quote Post
des00
сообщение May 24 2015, 12:09
Сообщение #11


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(Sprite @ May 24 2015, 20:06) *
Спасибо, это я и хотел услышать. Тему можно считать закрытой.

ЗЫ. data_curr у вас ест еще 10 лютов на бит, по возможности вам лучше найти другое решение для чтения памяти.


--------------------
Go to the top of the page
 
+Quote Post
iosifk
сообщение May 24 2015, 12:16
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Sprite @ May 24 2015, 15:00) *
Данные можно читать, но для этого нужно выставлять адрес на считывание этих данных, и, если делать это в state-машине, то нужно под чтение адреса выделять одно состояние.
В процессе работы планируется постоянная передача данных от MCU к ПЛИС, т.е. нужно еще и за синхронизацией доступа к памяти следить, когда можно просто вывести значения регистров на шины и получать в каждый момент нужное значение. Поправьте, если не прав.


Неверно с самого начала...
Посчитайте с какой скоростью MCU сможет выставлять данные и сопоставьте с тактовой внутри ПЛИС. Получится 1:10 или 1:100.
А потом поищите термины "конвейер" и "латентность"... И не забудьте про "метастабильность"...
Потом продолжим...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Sprite
сообщение May 24 2015, 12:35
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



Цитата(iosifk @ May 24 2015, 18:16) *
Неверно с самого начала...
Посчитайте с какой скоростью MCU сможет выставлять данные и сопоставьте с тактовой внутри ПЛИС. Получится 1:10 или 1:100.
А потом поищите термины "конвейер" и "латентность"... И не забудьте про "метастабильность"...
Потом продолжим...

Ну прямо напугали терминами )
А откуда Вы знаете какая тактовая частота CPU и ПЛИС в моем проекте и каков механизм обмена данными, чтобы так утверждать?
Go to the top of the page
 
+Quote Post
iosifk
сообщение May 24 2015, 12:44
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Sprite @ May 24 2015, 15:35) *
Ну прямо напугали терминами )
А откуда Вы знаете какая тактовая частота CPU и ПЛИС в моем проекте и каков механизм обмена данными, чтобы так утверждать?

Поверьте, знаю...
Обычно, если речь идет о быстрых процессорах и шинах с гигабитными скоростями, то тогда никак не говорится о медленных CPLD... Да и те, кто с такими процессорами работает, не пишут в форум таких вопросов..
А значит, что речь идет о микроконтроллере. А они обычно работают от ПЗУ. И флэшь не работает быстрее, чем на 50 Мгц.. Да и то, обратная запись в память тормозит конвейер. А порты процессора - еще на порядок медленнее.. Получаем скорости - единицы Мгц...



--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Sprite
сообщение May 24 2015, 15:32
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



Цитата(iosifk @ May 24 2015, 18:44) *
Получаем скорости - единицы Мгц...

Процесс идет на скорости 10кГц, поэтому времени на прием и обработку данных пока хватает.

Цитата
ЗЫ. data_curr у вас ест еще 10 лютов на бит, по возможности вам лучше найти другое решение для чтения памяти.

Согласен, буду думать.

В любом случае - всем спасибо за советы!
Go to the top of the page
 
+Quote Post

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

 


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


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