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

 
 
> Nios II обращение к внешней памяти как к массиву
Dootch
сообщение Aug 29 2015, 02:12
Сообщение #1


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

Группа: Свой
Сообщений: 76
Регистрация: 12-02-10
Из: Хабаровск
Пользователь №: 55 441



Доброго времени суток.
В процессе работы возник следующий вопрос:
В квартусе создаю Simple Dual-Port RAM (dual clock), прямо из темплейта.

CODE
-- Quartus II VHDL Template
-- Simple Dual-Port RAM with different read/write addresses and
-- different read/write clock

library ieee;
use ieee.std_logic_1164.all;

entity simple_dual_port_ram_dual_clock is

generic
(
DATA_WIDTH : natural := 32;
ADDR_WIDTH : natural := 6
);

port
(
rclk : in std_logic;
wclk : in std_logic;
raddr : in natural range 0 to 2**ADDR_WIDTH - 1;
waddr : in natural range 0 to 2**ADDR_WIDTH - 1;
data : in std_logic_vector((DATA_WIDTH-1) downto 0);
we : in std_logic := '1';
q : out std_logic_vector((DATA_WIDTH -1) downto 0)
);

end simple_dual_port_ram_dual_clock;

architecture rtl of simple_dual_port_ram_dual_clock is

-- Build a 2-D array type for the RAM
subtype word_t is std_logic_vector((DATA_WIDTH-1) downto 0);
type memory_t is array(2**ADDR_WIDTH-1 downto 0) of word_t;

-- Declare the RAM signal.
signal ram : memory_t;

begin

process(wclk)
begin
if(rising_edge(wclk)) then
if(we = '1') then
ram(waddr) <= data;
end if;
end if;
end process;

process(rclk)
begin
if(rising_edge(rclk)) then
q <= ram(raddr);
end if;
end process;

end rtl;


Запись в память производит отдельный автомат со своим клоком.
Есть ли возможность подключить память к процессору таким образом, чтобы объявить ее обычным const unsigned int ARRAY[2**ADDR_WIDTH - 1] и читать из нее как из обычного массива?
Моя цель - это отдельный сбор данных с АЦП в память в хардваре, и отдельная асинхронная математическая обработка этих же данных в софтваре.

Сообщение отредактировал Dootch - Aug 29 2015, 02:23
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение Aug 29 2015, 03:40
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
В квартусе создаю Simple Dual-Port RAM (dual clock), прямо из темплейта.

как показала практика фигово он это создает, лучше явно через мегафункцию описать....

Цитата
Есть ли возможность подключить память к процессору таким образом, чтобы объявить ее обычным const unsigned int ARRAY[2**ADDR_WIDTH - 1] и читать из нее как из обычного массива?

можно. Надо 1 подключить эту память к шине через подходящий переходник (это должен быть готовый модуль).
Переходник выделит вашей памяти адресное пространство и дальше у вас 2 пути
1. это создать указатель unsigned int *MyPointer = MEM_ADDR; и обращаться в память через MyPointer[i] = 10 или *MyPointer = 10; *(MyPointer + i) = 10;
2. это создать переменную массив, и договориться с линкером чтобы он ее разместил точно в этой памяти, тогда будет точно ваш вариант const unsigned int ARRAY[2**ADDR_WIDTH - 1], как в ниосе договариваться с линкером надо читать.... но это уже нюансы.

То есть основная ваша задача это через переходник подключить память к шине и выдать ей адресное пространство.

Но по мне это надо делать со стороны НИОСА, то есть делать модуль памяти для него через встроенный IP core генератор (или как там он у квартуса называется), а уж потом к нему цеплятся периферией, может даже через еще какие то стандартные блоки...
Go to the top of the page
 
+Quote Post
Dootch
сообщение Aug 29 2015, 04:23
Сообщение #3


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

Группа: Свой
Сообщений: 76
Регистрация: 12-02-10
Из: Хабаровск
Пользователь №: 55 441



Цитата(Golikov A. @ Aug 29 2015, 07:40) *
можно. Надо 1 подключить эту память к шине через подходящий переходник (это должен быть готовый модуль).
Переходник выделит вашей памяти адресное пространство и дальше у вас 2 пути
1. это создать указатель unsigned int *MyPointer = MEM_ADDR; и обращаться в память через MyPointer[i] = 10 или *MyPointer = 10; *(MyPointer + i) = 10;
2. это создать переменную массив, и договориться с линкером чтобы он ее разместил точно в этой памяти, тогда будет точно ваш вариант const unsigned int ARRAY[2**ADDR_WIDTH - 1], как в ниосе договариваться с линкером надо читать.... но это уже нюансы.

То есть основная ваша задача это через переходник подключить память к шине и выдать ей адресное пространство.

Но по мне это надо делать со стороны НИОСА, то есть делать модуль памяти для него через встроенный IP core генератор (или как там он у квартуса называется), а уж потом к нему цеплятся периферией, может даже через еще какие то стандартные блоки...


Спасибо за разъяснение, думаю вариант со стороны Nios действительно лучше. Нашел на альтеровском форуме вот это. Думаю как раз похожий случай.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 12:25
Рейтинг@Mail.ru


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