Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Двунаправленный мультиплексор
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
BuTeK
Необходимо реализовать двунаправленный мультиплексор...
То есть мне нужно переключать шину данных внешнего ОЗУ для полного доступа к ней поочередно то с ПЛИС, то с DSP подключенного к портам ПЛИС.
Не могу сообразить как это организовать.... Помогите новичку...
yuri_d
Нужен не мультиплексор, а арбитр. Посмотрите как сделан доступ в системах с общей шиной (например PCI, ISA).

Если DSP можно остановить на время при доступе к внешней памяти (с помощью сигнала ready, bus request/bus hold) то проблема легко решается.

А может одновременный доступ и не нужен? Тоесть работает один, а другой спит. Тогда проблемы вообще нет.
Omen_13
Организовать на 2-й ПЛИСке контроллер доступа к памяти с FIFO.
То есть ПЛИС и DSP подключены напрямую к контроллеру памяти который и занимается арбитражем и т.п.
BuTeK
Второй ПЛИС нет... уже плата так разведена...
А в проекте две памяти и поочередно идет обращение... т.е. ПЛИС память заполняет в это время с другой памятью работает DSP (производит обработку набранных отчетов).
В любой момент времени идет обращение или от ПЛИС к памяти или от DSP.
Maverick
Цитата(BuTeK @ Mar 27 2008, 08:32) *
Второй ПЛИС нет... уже плата так разведена...
А в проекте две памяти и поочередно идет обращение... т.е. ПЛИС память заполняет в это время с другой памятью работает DSP (производит обработку набранных отчетов).
В любой момент времени идет обращение или от ПЛИС к памяти или от DSP.


Сделай модуль с двунаправленными выводами и ПЛИС будет полностью работать с внешней памятью, а когда DSP потребуются данные из памяти то ПЛИС будет считывать эти данные из памяти и передавать в DSP. В простоях DSP ПЛИС будет заполнять память новыми данными. Правда здесь должна быть полная согласованость по времени с DSP. Другими словами, как раньше писалось, на ПЛИС организовываешь арбитр. Или надо было ставить двупортовую память для таких целей.
BuTeK
То есть полностью брать всё управление с памятью на ПЛИС, а в ДСП выводить только по запросу данные.
Я правильно понял?
Если честно, думал об этом, но надеялся, что есть вариант полегче....
Omen_13
Цитата
То есть полностью брать всё управление с памятью на ПЛИС, а в ДСП выводить только по запросу данные.
Я правильно понял?

Абсолютно правильно. Если ПЛИС позволяет можно кэш организовать
rezident
Цитата(BuTeK @ Mar 28 2008, 01:42) *
Если честно, думал об этом, но надеялся, что есть вариант полегче....
Если абстрагироваться от мультиплексора, то вы пытаетесь сделать шину проводников. Но тогда возникает вопрос, зачем эти проводники нужно реализовывать внутри ПЛИС? Не проще ли было их мимо нее бросить? Предложенная абстракция конечно же не отрицает необходимости наличия арбитра доступа к ОЗУ. Если только она не двухпортовая.
BuTeK
А дайте, пожалуйста, ссылку на простой арбитр. А то с таким не сталкивался.. даже если честно не понимаю, что это такое...
EvgenyNik
Если подходит такой вариант, то наиболее простым будет система взаимодействия через "запрос-подтверждение".
1. Мастер (ПЛИС или DSP) выставляет запрос на разрешение доступа к памяти
2. Если ОЗУ не занято, дается разрешение
3. На время действия запроса от одного мастера, разрешение второму мастеру не выдается, но ставится в ожидание.
4. После окончания сеанса с первым мастером, выдается разрешение второму.
Поскольку у Вас 2 ОЗУ, то и запросы-разрешения должны быть для них разные.
Бывает так, что один (оба) из мастеров не может (не могут) ждать. Тогда делаете по 2 буфера-посредника (облегчённое подобие кэш) на каждого мастера и записываете туда данные, которые надо скинуть в ОЗУ и/или предварительно "делаете заказ" на определённый блок ОЗУ, автомат буферов высставляет запрос и когда получает разрешение на доступ, сливает в ОЗУ записываемые данные из буфера записи и заполняет заказанными данными ОЗУ буфер чтения.
В более развитом варианте мастер может работать с ОЗУ как через буфер (для небольших и/или быстрых пакетов данных), так и напрямую - через запрос доступа (для больших и/или медленных пакетов данных).
BuTeK
Я, наверно, немного не так выразился. Задача такая..
Одновременно не может быть доступа к одной памяти... То есть процесс распараллелен - пока ПЛИС заполняет одну память ДСП обрабатывает другую.. Затем меняются.
И я сначало думал, что поставив мультиплексор все будет отлично работать... А вот и нет. С мультиплексором данные идут в одну сторону, то есть только на запись в ОЗУ (или Чтение). И вот я подумал, можно ли как-нибудь использовать ПЛИС, как проводник а не однонаправленный буфер.

Вот как было у меня

RAM0_DQ <= SDR_DQ WHEN GATE = '1' ELSE DSP_DQ;
RAM1_DQ <= DSP_DQ WHEN GATE = '0' ELSE SDR_1_DQ;

А нужно тоже самое только двунаправленное...

Надеюсь, сейчас объяснил немного понятнее... Извиняйте, если совсем запутал....
cupertino
Цитата(BuTeK @ Apr 3 2008, 12:12) *
Я, наверно, немного не так выразился. Задача такая..
Одновременно не может быть доступа к одной памяти... То есть процесс распараллелен - пока ПЛИС заполняет одну память ДСП обрабатывает другую.. Затем меняются.
И я сначало думал, что поставив мультиплексор все будет отлично работать... А вот и нет. С мультиплексором данные идут в одну сторону, то есть только на запись в ОЗУ (или Чтение). И вот я подумал, можно ли как-нибудь использовать ПЛИС, как проводник а не однонаправленный буфер.

Вот как было у меня

RAM0_DQ <= SDR_DQ WHEN GATE = '1' ELSE DSP_DQ;
RAM1_DQ <= DSP_DQ WHEN GATE = '0' ELSE SDR_1_DQ;

А нужно тоже самое только двунаправленное...

Надеюсь, сейчас объяснил немного понятнее... Извиняйте, если совсем запутал....
Запросто. введите в эти уравнения еще и соответствующий сигнал записи/чтения в/из ОЗУ для управления направлением передачи через ПЛИС
sazh
Цитата(BuTeK @ Apr 3 2008, 23:12) *
И вот я подумал, можно ли как-нибудь использовать ПЛИС, как проводник а не однонаправленный буфер.
А нужно тоже самое только двунаправленное...


Проводник - он и есть однонаправленный буфер. Есть вход. Есть выход.
Под двунаправленным понимается двунаправленная шина. Реализация такой шины возможна только при наличии контактов I/O и буфера для реализации ZZZZ состояния. Посмотрите структуру шинника 74245. Если управление избыточно, минимизируйте.
На базе таких шинников много чего через Плис прогнать можно. И никого не волнует Ваш протокол обмена по этой (этим) двунаправленной шине (шинам)

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity ap6 is
port
(
busa : inout std_logic_vector(7 downto 0);
busb : inout std_logic_vector(7 downto 0);
dir : in std_logic;
oe_n : in std_logic
);
end ap6;

Architecture rtl of ap6 is
begin
busa <= busb when (dir = '0' and oe_n = '0') else (others => 'Z');
busb <= busa when (dir = '1' and oe_n = '0') else (others => 'Z');
end rtl;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.