Перейти к содержанию
    

Надо нескольким процессам писАть в одну память.

Вообщем ситуация такая: Есть двухпортовая память. Создана Megawizard-ом из внутренней памяти циклона. С одного порта из нее читает данные видеоконтроллер. Тут все понятно. С другого порта в нее надо записывать данные, но процессов которые должны писать - несколько, допустим 20 штук, и каждому надо иногда записать в память по несколько байт по своим адресам. Как можно организовать доступ к одной памяти всем процессам? Напрашивается какой-то менеджер памяти, который по очереди разрешает каждому процессу писать в память, но что-то это как-то сложновато. Нет ли вариантов попроще? Может обьявить память как массив и обращаться к ней по индексу? Но пока не понятно как это сделать с двухпортовой памятью и как это будет работать если несколько процессов захотят писать одновременно. Как правильно решить такую задачу?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообщем ситуация такая: Есть двухпортовая память. Создана Megawizard-ом из внутренней памяти циклона. С одного порта из нее читает данные видеоконтроллер. Тут все понятно. С другого порта в нее надо записывать данные, но процессов которые должны писать - несколько, допустим 20 штук, и каждому надо иногда записать в память по несколько байт по своим адресам. Как можно организовать доступ к одной памяти всем процессам? Напрашивается какой-то менеджер памяти, который по очереди разрешает каждому процессу писать в память, но что-то это как-то сложновато. Нет ли вариантов попроще? Может обьявить память как массив и обращаться к ней по индексу? Но пока не понятно как это сделать с двухпортовой памятью и как это будет работать если несколько процессов захотят писать одновременно. Как правильно решить такую задачу?

 

Тут про очередь у кого то уже пробегало. Вот сохранил пример:

 

----------------------------------------------------------------------------------

-- Company:

-- Engineer:

--

-- Create Date: 11:35:41 09/06/2006

-- Design Name:

-- Module Name: drder - Behavioral

-- Project Name:

-- Target Devices:

-- trap versions:

-- Description:

--

-- Dependencies:

--

-- Revision:

-- Revision 0.01 - File Created

-- Additional Comments:

--

----------------------------------------------------------------------------------

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

 

---- Uncomment the following library declaration if instantiating

---- any Xilinx primitives in this code.

--library UNISIM;

--use UNISIM.VComponents.all;

 

entity drder is

Port ( clk : in STD_LOGIC;

a : in STD_LOGIC;

b : in STD_LOGIC;

c : in STD_LOGIC;

d : in STD_LOGIC;

------- test --------

--b_trap_test: out STD_LOGIC;

--c_trap_test: out STD_LOGIC;

--d_trap_test: out STD_LOGIC;

---------------------

z : out STD_LOGIC_vector(2 downto 0)

);

end drder;

 

architecture Behavioral of drder is

------------------------------------------------------------------------------------

signal b_trap : STD_LOGIC:='0';

signal c_trap : STD_LOGIC:='0';

signal d_trap : STD_LOGIC:='0';

------------------------------------------------------------------------------------

BEGIN ------------------------------------------------------------------------------

------------------------------------------------------------------------------------

 

--b_trap_test<=b_trap;

--c_trap_test<=c_trap;

--d_trap_test<=d_trap;

---------------------------

rr: process(clk)

begin

if clk'event and clk='1' then

----

if a='1' then

z<="000";

----

if b='1' then b_trap<='1';end if;

if c='1' then c_trap<='1';end if;

if d='1' then d_trap<='1';end if;

elsif b='1' or b_trap='1' then

z<="001";

----

b_trap<='0';

----

if c='1' then c_trap<='1';end if;

if d='1' then d_trap<='1';end if;

elsif c='1' or c_trap='1' then

z<="010";

----

c_trap<='0';

----

if d='1' then d_trap<='1';end if;

elsif d='1' or d_trap='1' then

z<="011";

----

d_trap<='0';

----

else

z<="111";

end if;

----

end if; -- clk

end process rr;

------------------------------------------------------------------------------------

END Behavioral; --------------------------------------------------------------------

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообщем ситуация такая: Есть двухпортовая память. Создана Megawizard-ом из внутренней памяти циклона. С одного порта из нее читает данные видеоконтроллер. Тут все понятно. С другого порта в нее надо записывать данные, но процессов которые должны писать - несколько, допустим 20 штук, и каждому надо иногда записать в память по несколько байт по своим адресам. Как можно организовать доступ к одной памяти всем процессам? Напрашивается какой-то менеджер памяти, который по очереди разрешает каждому процессу писать в память, но что-то это как-то сложновато. Нет ли вариантов попроще? Может обьявить память как массив и обращаться к ней по индексу? Но пока не понятно как это сделать с двухпортовой памятью и как это будет работать если несколько процессов захотят писать одновременно. Как правильно решить такую задачу?

http://www.asic-world.com/examples/verilog/arbiter.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С арбитром памяти я конечно сделаю, но что-то мне кажется что можно это сделать проще. В данном случае каждый процесс пишет только по своим адресам. Память не большая, допустим 1024 байт, и в данном случае её можно и из логических элементов собрать. И получается что на выходе каждого пишущего процесса будет по несколько регистров, в которые он пишет. А читающий процесс только читает все эти регистры, и обращаться к ним он должен по индексу, как к массиву. Должно ведь получиться если память обьявить как массив байтовых элементов? И без всяких арбитров и менеджеров памяти. Но на 1024 байта памяти придётся отдать 8192 триггеров. Жалко. А нельзя ли такой же фокус проделать с внутренней памятью? Чтобы не тратить л.е.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С арбитром памяти я конечно сделаю, но что-то мне кажется что можно это сделать проще. В данном случае каждый процесс пишет только по своим адресам. Память не большая, допустим 1024 байт, и в данном случае её можно и из логических элементов собрать. И получается что на выходе каждого пишущего процесса будет по несколько регистров, в которые он пишет. А читающий процесс только читает все эти регистры, и обращаться к ним он должен по индексу, как к массиву. Должно ведь получиться если память обьявить как массив байтовых элементов? И без всяких арбитров и менеджеров памяти. Но на 1024 байта памяти придётся отдать 8192 триггеров. Жалко. А нельзя ли такой же фокус проделать с внутренней памятью? Чтобы не тратить л.е.

если есть N-портовая память, то можно.

но обычно,почему то ;) так не делают :).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поразмышляв на эту тему пришел в выводу что мне не нужен арбитр-диспетчер памяти. Потому что и сама видеопамять мне не нужна. :-)

Видеконтроллер будет читать код символов не из памяти, а прямо с регистров-выходов процессов. Через бальшо-о-ой мультиплексор.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...