|
|
  |
Создание блока памяти RAM в ПЛИС, нужно оптимизировать |
|
|
|
May 24 2015, 11:03
|

Частый гость
 
Группа: Участник
Сообщений: 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 для оформления больших сегментов кода (с) модератор
|
|
|
|
|
May 24 2015, 11:23
|
Гуру
     
Группа: Модераторы
Сообщений: 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
|
|
|
|
|
May 24 2015, 11:41
|

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

|
Цитата(iosifk @ May 24 2015, 17:23)  Есть только 2 вопроса: 1. Зачем нужно столько выходов? 2. Почему именно эта микросхема? 1. Выводы я планировал использовать в state-машине основной программы для получения каких-либо значений переменных (предварительно переданных с MCU). 2. Эта микросхема, потому что в проекте использовалась до этого (как вариант emp1270 или epm2210) и хотелось бы менять ее только в самом крайнем случае.
|
|
|
|
|
May 24 2015, 11:44
|

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

|
Цитата(_pv @ May 24 2015, 17:36)  если 16бит умножить на 16слов, сколько получится? и какую часть это будет составлять от 570 имеющихся триггеров? Согласен, не малую. Но эти данные я указал по максимуму, в реальности возможно будет меньше. Вопрос мой был по коду - с кодом все ОК?
|
|
|
|
|
May 24 2015, 12:00
|

Частый гость
 
Группа: Участник
Сообщений: 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 - не проблема. Основной вопрос был по коду - можно ли его оптимизировать или нет?
|
|
|
|
|
May 24 2015, 12:06
|

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

|
Цитата(des00 @ May 24 2015, 18:04)  нет. Спасибо, это я и хотел услышать. Тему можно считать закрытой.
|
|
|
|
|
May 24 2015, 12:16
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(Sprite @ May 24 2015, 15:00)  Данные можно читать, но для этого нужно выставлять адрес на считывание этих данных, и, если делать это в state-машине, то нужно под чтение адреса выделять одно состояние. В процессе работы планируется постоянная передача данных от MCU к ПЛИС, т.е. нужно еще и за синхронизацией доступа к памяти следить, когда можно просто вывести значения регистров на шины и получать в каждый момент нужное значение. Поправьте, если не прав. Неверно с самого начала... Посчитайте с какой скоростью MCU сможет выставлять данные и сопоставьте с тактовой внутри ПЛИС. Получится 1:10 или 1:100. А потом поищите термины "конвейер" и "латентность"... И не забудьте про "метастабильность"... Потом продолжим...
--------------------
www.iosifk.narod.ru
|
|
|
|
|
May 24 2015, 12:35
|

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

|
Цитата(iosifk @ May 24 2015, 18:16)  Неверно с самого начала... Посчитайте с какой скоростью MCU сможет выставлять данные и сопоставьте с тактовой внутри ПЛИС. Получится 1:10 или 1:100. А потом поищите термины "конвейер" и "латентность"... И не забудьте про "метастабильность"... Потом продолжим... Ну прямо напугали терминами ) А откуда Вы знаете какая тактовая частота CPU и ПЛИС в моем проекте и каков механизм обмена данными, чтобы так утверждать?
|
|
|
|
|
May 24 2015, 12:44
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(Sprite @ May 24 2015, 15:35)  Ну прямо напугали терминами ) А откуда Вы знаете какая тактовая частота CPU и ПЛИС в моем проекте и каков механизм обмена данными, чтобы так утверждать? Поверьте, знаю... Обычно, если речь идет о быстрых процессорах и шинах с гигабитными скоростями, то тогда никак не говорится о медленных CPLD... Да и те, кто с такими процессорами работает, не пишут в форум таких вопросов.. А значит, что речь идет о микроконтроллере. А они обычно работают от ПЗУ. И флэшь не работает быстрее, чем на 50 Мгц.. Да и то, обратная запись в память тормозит конвейер. А порты процессора - еще на порядок медленнее.. Получаем скорости - единицы Мгц...
--------------------
www.iosifk.narod.ru
|
|
|
|
|
May 24 2015, 15:32
|

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

|
Цитата(iosifk @ May 24 2015, 18:44)  Получаем скорости - единицы Мгц... Процесс идет на скорости 10кГц, поэтому времени на прием и обработку данных пока хватает. Цитата ЗЫ. data_curr у вас ест еще 10 лютов на бит, по возможности вам лучше найти другое решение для чтения памяти. Согласен, буду думать. В любом случае - всем спасибо за советы!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|