slog 0 18 июня, 2008 Опубликовано 18 июня, 2008 · Жалоба Вообщем ситуация такая: Есть двухпортовая память. Создана Megawizard-ом из внутренней памяти циклона. С одного порта из нее читает данные видеоконтроллер. Тут все понятно. С другого порта в нее надо записывать данные, но процессов которые должны писать - несколько, допустим 20 штук, и каждому надо иногда записать в память по несколько байт по своим адресам. Как можно организовать доступ к одной памяти всем процессам? Напрашивается какой-то менеджер памяти, который по очереди разрешает каждому процессу писать в память, но что-то это как-то сложновато. Нет ли вариантов попроще? Может обьявить память как массив и обращаться к ней по индексу? Но пока не понятно как это сделать с двухпортовой памятью и как это будет работать если несколько процессов захотят писать одновременно. Как правильно решить такую задачу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 18 июня, 2008 Опубликовано 18 июня, 2008 · Жалоба Вообщем ситуация такая: Есть двухпортовая память. Создана 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; -------------------------------------------------------------------- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Postoroniy_V 0 18 июня, 2008 Опубликовано 18 июня, 2008 · Жалоба Вообщем ситуация такая: Есть двухпортовая память. Создана Megawizard-ом из внутренней памяти циклона. С одного порта из нее читает данные видеоконтроллер. Тут все понятно. С другого порта в нее надо записывать данные, но процессов которые должны писать - несколько, допустим 20 штук, и каждому надо иногда записать в память по несколько байт по своим адресам. Как можно организовать доступ к одной памяти всем процессам? Напрашивается какой-то менеджер памяти, который по очереди разрешает каждому процессу писать в память, но что-то это как-то сложновато. Нет ли вариантов попроще? Может обьявить память как массив и обращаться к ней по индексу? Но пока не понятно как это сделать с двухпортовой памятью и как это будет работать если несколько процессов захотят писать одновременно. Как правильно решить такую задачу? http://www.asic-world.com/examples/verilog/arbiter.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slog 0 20 июня, 2008 Опубликовано 20 июня, 2008 · Жалоба С арбитром памяти я конечно сделаю, но что-то мне кажется что можно это сделать проще. В данном случае каждый процесс пишет только по своим адресам. Память не большая, допустим 1024 байт, и в данном случае её можно и из логических элементов собрать. И получается что на выходе каждого пишущего процесса будет по несколько регистров, в которые он пишет. А читающий процесс только читает все эти регистры, и обращаться к ним он должен по индексу, как к массиву. Должно ведь получиться если память обьявить как массив байтовых элементов? И без всяких арбитров и менеджеров памяти. Но на 1024 байта памяти придётся отдать 8192 триггеров. Жалко. А нельзя ли такой же фокус проделать с внутренней памятью? Чтобы не тратить л.е. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Postoroniy_V 0 22 июня, 2008 Опубликовано 22 июня, 2008 · Жалоба С арбитром памяти я конечно сделаю, но что-то мне кажется что можно это сделать проще. В данном случае каждый процесс пишет только по своим адресам. Память не большая, допустим 1024 байт, и в данном случае её можно и из логических элементов собрать. И получается что на выходе каждого пишущего процесса будет по несколько регистров, в которые он пишет. А читающий процесс только читает все эти регистры, и обращаться к ним он должен по индексу, как к массиву. Должно ведь получиться если память обьявить как массив байтовых элементов? И без всяких арбитров и менеджеров памяти. Но на 1024 байта памяти придётся отдать 8192 триггеров. Жалко. А нельзя ли такой же фокус проделать с внутренней памятью? Чтобы не тратить л.е. если есть N-портовая память, то можно. но обычно,почему то ;) так не делают :). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slog 0 23 июня, 2008 Опубликовано 23 июня, 2008 · Жалоба Поразмышляв на эту тему пришел в выводу что мне не нужен арбитр-диспетчер памяти. Потому что и сама видеопамять мне не нужна. :-) Видеконтроллер будет читать код символов не из памяти, а прямо с регистров-выходов процессов. Через бальшо-о-ой мультиплексор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться