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

Двунаправленный мультиплексор

Необходимо реализовать двунаправленный мультиплексор...

То есть мне нужно переключать шину данных внешнего ОЗУ для полного доступа к ней поочередно то с ПЛИС, то с DSP подключенного к портам ПЛИС.

Не могу сообразить как это организовать.... Помогите новичку...

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


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

Нужен не мультиплексор, а арбитр. Посмотрите как сделан доступ в системах с общей шиной (например PCI, ISA).

 

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

 

А может одновременный доступ и не нужен? Тоесть работает один, а другой спит. Тогда проблемы вообще нет.

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


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

Организовать на 2-й ПЛИСке контроллер доступа к памяти с FIFO.

То есть ПЛИС и DSP подключены напрямую к контроллеру памяти который и занимается арбитражем и т.п.

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


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

Второй ПЛИС нет... уже плата так разведена...

А в проекте две памяти и поочередно идет обращение... т.е. ПЛИС память заполняет в это время с другой памятью работает DSP (производит обработку набранных отчетов).

В любой момент времени идет обращение или от ПЛИС к памяти или от DSP.

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


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

Второй ПЛИС нет... уже плата так разведена...

А в проекте две памяти и поочередно идет обращение... т.е. ПЛИС память заполняет в это время с другой памятью работает DSP (производит обработку набранных отчетов).

В любой момент времени идет обращение или от ПЛИС к памяти или от DSP.

 

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

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


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

То есть полностью брать всё управление с памятью на ПЛИС, а в ДСП выводить только по запросу данные.

Я правильно понял?

Если честно, думал об этом, но надеялся, что есть вариант полегче....

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


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

То есть полностью брать всё управление с памятью на ПЛИС, а в ДСП выводить только по запросу данные.

Я правильно понял?

Абсолютно правильно. Если ПЛИС позволяет можно кэш организовать

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


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

Если честно, думал об этом, но надеялся, что есть вариант полегче....
Если абстрагироваться от мультиплексора, то вы пытаетесь сделать шину проводников. Но тогда возникает вопрос, зачем эти проводники нужно реализовывать внутри ПЛИС? Не проще ли было их мимо нее бросить? Предложенная абстракция конечно же не отрицает необходимости наличия арбитра доступа к ОЗУ. Если только она не двухпортовая.

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


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

А дайте, пожалуйста, ссылку на простой арбитр. А то с таким не сталкивался.. даже если честно не понимаю, что это такое...

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


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

Если подходит такой вариант, то наиболее простым будет система взаимодействия через "запрос-подтверждение".

1. Мастер (ПЛИС или DSP) выставляет запрос на разрешение доступа к памяти

2. Если ОЗУ не занято, дается разрешение

3. На время действия запроса от одного мастера, разрешение второму мастеру не выдается, но ставится в ожидание.

4. После окончания сеанса с первым мастером, выдается разрешение второму.

Поскольку у Вас 2 ОЗУ, то и запросы-разрешения должны быть для них разные.

Бывает так, что один (оба) из мастеров не может (не могут) ждать. Тогда делаете по 2 буфера-посредника (облегчённое подобие кэш) на каждого мастера и записываете туда данные, которые надо скинуть в ОЗУ и/или предварительно "делаете заказ" на определённый блок ОЗУ, автомат буферов высставляет запрос и когда получает разрешение на доступ, сливает в ОЗУ записываемые данные из буфера записи и заполняет заказанными данными ОЗУ буфер чтения.

В более развитом варианте мастер может работать с ОЗУ как через буфер (для небольших и/или быстрых пакетов данных), так и напрямую - через запрос доступа (для больших и/или медленных пакетов данных).

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


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

Я, наверно, немного не так выразился. Задача такая..

Одновременно не может быть доступа к одной памяти... То есть процесс распараллелен - пока ПЛИС заполняет одну память ДСП обрабатывает другую.. Затем меняются.

И я сначало думал, что поставив мультиплексор все будет отлично работать... А вот и нет. С мультиплексором данные идут в одну сторону, то есть только на запись в ОЗУ (или Чтение). И вот я подумал, можно ли как-нибудь использовать ПЛИС, как проводник а не однонаправленный буфер.

 

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

 

RAM0_DQ <= SDR_DQ WHEN GATE = '1' ELSE DSP_DQ;

RAM1_DQ <= DSP_DQ WHEN GATE = '0' ELSE SDR_1_DQ;

 

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

 

Надеюсь, сейчас объяснил немного понятнее... Извиняйте, если совсем запутал....

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


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

Я, наверно, немного не так выразился. Задача такая..

Одновременно не может быть доступа к одной памяти... То есть процесс распараллелен - пока ПЛИС заполняет одну память ДСП обрабатывает другую.. Затем меняются.

И я сначало думал, что поставив мультиплексор все будет отлично работать... А вот и нет. С мультиплексором данные идут в одну сторону, то есть только на запись в ОЗУ (или Чтение). И вот я подумал, можно ли как-нибудь использовать ПЛИС, как проводник а не однонаправленный буфер.

 

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

 

RAM0_DQ <= SDR_DQ WHEN GATE = '1' ELSE DSP_DQ;

RAM1_DQ <= DSP_DQ WHEN GATE = '0' ELSE SDR_1_DQ;

 

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

 

Надеюсь, сейчас объяснил немного понятнее... Извиняйте, если совсем запутал....

Запросто. введите в эти уравнения еще и соответствующий сигнал записи/чтения в/из ОЗУ для управления направлением передачи через ПЛИС

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


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

И вот я подумал, можно ли как-нибудь использовать ПЛИС, как проводник а не однонаправленный буфер.

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

 

Проводник - он и есть однонаправленный буфер. Есть вход. Есть выход.

Под двунаправленным понимается двунаправленная шина. Реализация такой шины возможна только при наличии контактов 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;

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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