Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вс май 27, 2018 15:22

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: Процессорная система в ПЛИС (маленькие хитрости)
СообщениеДобавлено: Вс июн 24, 2012 07:54 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Речь не о тех системах, что генерируются автоматически в ISE или Quartus, a о системах, которые строятся вручную.

При таком построении требуется серьезное планирование схемы, чтобы не наглючить и в то же время иметь достаточный простор для возможности расширения системы, добавления устройств, памяти и т.д. и т.п.

Поэтому записываю здесь правила, которые принял для себя, чтобы они быть может, кому-то помогли начать это дело или использовать то что наработано по этим правилам.



1. Общая шина

Общая шина представляет из себя два набора сигналов:
1.1. - сигналы, используемые всеми устройствами - Адреса, управление чтением/записью, выходные данные процессора, синхронизация, сигналы сброса и прерываний;
1.2. - входы - входные данные, передаваемые в процессор из устройств. В обычных процессорных системах шина данных двунаправлена, но в ПЛИС двунаправленность на шинах не реализуется как надо, поэтому в процессоре используется две шины данных - одна на вход, другая на выход.

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

И вот здесь имеется одна возможность, как это сделать наилучшим (как мне кажется) образом.
Правила следующие:
a. каждое устройство имеет свои адреса, не пересекающиеся с адресами других устройств.
b. пока процессор не выставил нужный адрес и запрос чтения, на выход шины данных устройство выдает только нули.
c. данные на выход шины данных устройство выдает только в момент, когда ему это разрешено, совпадает адрес и выставлен сигнал разрешения чтения.
d. данные со всех устройств объединены в одну шину по схеме "или".

При соблюдении этих правил мультиплексор получится автоматически и с возможностью расширения.

В случае разделения шин данных для памяти и устройств (или иного более широкого разделения) шины формируются подобным же образом, только с использованием соответствующих сигналов адресов и разрешений.

2. Реализация Общей Шины.

Реализация как на HDL, так и в схеме должна иметь возможность быстрого расширения схемы, поэтому надо сделать так, чтобы при добавлении нового устройства в процессорную систему было достаточно только ее подключить к нужным точкам системы и подключение должно быть однообразным для всех устройств.

Чтобы так сделаю, делаю следующее.

1. первая часть Общей Шины (выходные сигналы процессора) подается на все устройства прямо.
2. Вторая часть Общей Шины объедниняется одним шинным многовходовым элементом "ИЛИ".

на VHDL этот элемент записывается одним оператором

di <= dev1.do or dev2.do or dev3.do .... or devN.do;

И в него добавлять новые выходы не сложно

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

3. Чтобы схема выглядела единообразно в элементе устройства можно сделать как вход, так и выход для первой части шины. На выход подается копия входа (без каких либо обработок). Тогда все элементы процессорной системы будут соединены в простую цепь, в которой от устройства к устройству ведутся две шины, выход первого устройства подключен ко входу процессора, а на вход шины последнего подается выходная шина процессора.

На прикрепленном рисунке видно, что схема процессорной системы построенной по таким принципам оказывается достаточно прозрачной и в то же время легко расширяемой.

Для упрощения картинки сигналы, подключаемые к самим устройствам, не показаны. Так же не показаны входные сигналы процессора, поступающие извне.


Вложения:
CPU_SYSTEM.GIF
CPU_SYSTEM.GIF [ 5.96 Кб | Просмотров: 9686 ]

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)

За это сообщение автора WingLion поблагодарил: VoidVolker
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Процессорная система в ПЛИС (маленькие хитрости)
СообщениеДобавлено: Вс июн 24, 2012 08:23 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
На VHDL подобная процессорная система будет выглядеть примерно так:

Код:
architecture ....

    signal reset, int : std_logic;
    signal ext_di : word;
    signal cpu : cpu_type;
    signal dev1 : device1_type;
    signal dev2 : device2_type;
    signal dev3 : device3_type;

begin
    process (clk) begin
        if clk'event and clk = vcc then

             cpu <= MAIN_CPU(cpu,dev1.do,reset,int);
             dev1 <= MAIN_DEVICE1(dev1,cpu,dev2.do,reset,int);
             dev2 <= MAIN_DEVICE1(dev2,cpu,dev3.do,reset,int);
             dev3 <= MAIN_DEVICE1(dev3,cpu,ext_di,reset,int);

            end if;

        end if;
    end;

end;


Типы и функции, описывающие логику процессора и устройств подключаются в начале исходника vhdl библиотечными файлами.

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

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Процессорная система в ПЛИС (маленькие хитрости)
СообщениеДобавлено: Вс июн 24, 2012 09:22 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1253
Благодарил (а): 3 раз.
Поблагодарили: 16 раз.
О, вот это здорово. Очень интересно. Получается, вместо того, чтобы делать одну большую и сложную шины "процессор <-> девайсы" делаем две простых. При этом, все девайсы "слушают" входную шину от процессора в поисках команд только для них, а данные отправляют по общей шине данных только когда им разрешено.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Процессорная система в ПЛИС (маленькие хитрости)
СообщениеДобавлено: Вс июн 24, 2012 10:06 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Именно так! И при проектировании надо только правильно прописать адреса устройств. Ну, и не допускать ошибок в логике устройств, чтобы их данные не появлялись на шине не вовремя.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Процессорная система в ПЛИС (маленькие хитрости)
СообщениеДобавлено: Вс июн 24, 2012 10:57 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1253
Благодарил (а): 3 раз.
Поблагодарили: 16 раз.
А вот сам девайс не обязан быть в плисе, а может быть каким-то внешним устройством на плате или где-то еще?

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Процессорная система в ПЛИС (маленькие хитрости)
СообщениеДобавлено: Вс июн 24, 2012 11:16 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
В ПЛИС формально находится контроллер интерфейса с девайсом.
И это может быть как сложная схема так и просто набор портов.
А само устройство может быть как в ПЛИСе так и вне ее.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Процессорная система в ПЛИС (маленькие хитрости)
СообщениеДобавлено: Пн июн 25, 2012 12:14 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6314
Благодарил (а): 14 раз.
Поблагодарили: 99 раз.
Как вариант: все устройства имеют одинаковую входную шину со стороны процессора и сами декодируют адреса (что не запрещает "подсматривать" запись в другое устройство и даже писать в себя копию). Кроме того, каждый блок имеет вход cascade_in, к которому подключается следующий модуль в цепочке.

Код:
with conv_integer(addr) select
dio <= ext(encOut, 32) when BaseAddr + 20,
       cascade_in when others;


Если в системе появляется еще один периферийный модуль, его выход данных подключается к cascade_in предыдущего блока.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Процессорная система в ПЛИС (маленькие хитрости)
СообщениеДобавлено: Чт июн 28, 2012 18:39 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Хищник писал(а):
Как вариант: все устройства имеют одинаковую входную шину со стороны процессора и сами декодируют адреса (что не запрещает "подсматривать" запись в другое устройство и даже писать в себя копию). Кроме того, каждый блок имеет вход cascade_in, к которому подключается следующий модуль в цепочке.


это и нарисовано на картинке в первом посте :wink:
только DATA_IN вместо cascade_in

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Процессорная система в ПЛИС (маленькие хитрости)
СообщениеДобавлено: Чт июн 28, 2012 21:15 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6314
Благодарил (а): 14 раз.
Поблагодарили: 99 раз.
WingLion писал(а):
это и нарисовано на картинке в первом посте
только DATA_IN вместо cascade_in

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Процессорная система в ПЛИС (маленькие хитрости)
СообщениеДобавлено: Чт июн 28, 2012 21:38 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Хищник писал(а):
просто устройство, которое находится ближе к процессору, выставит свои данные, а не каскадируемые.



Если каскадировать по логике "или", то требование не вылезать на шину когда не нужно - имеет смысл.
А каскадирование мультиплексированием имеет недостаток в явно большем времени задержки распространения сигнала по цепи устройств.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Процессорная система в ПЛИС (маленькие хитрости)
СообщениеДобавлено: Чт июн 28, 2012 22:52 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6314
Благодарил (а): 14 раз.
Поблагодарили: 99 раз.
WingLion писал(а):
Если каскадировать по логике "или", то требование не вылезать на шину когда не нужно - имеет смысл.

Тогда уж надо это блок отдельно расписывать.
WingLion писал(а):
А каскадирование мультиплексированием имеет недостаток в явно большем времени задержки распространения сигнала по цепи устройств.

Если периферии немного, то это не становится узким местом. Пять-шесть устройств "начального уровня" вполне могут подключить к себе еще какое-нибудь ядро. По крайней мере, до 10 к ячеек частота после синтеза остается ровно такой же, если подцепить один-два новых модуля.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Процессорная система в ПЛИС (маленькие хитрости)
СообщениеДобавлено: Пт июн 29, 2012 04:53 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Хищник писал(а):
Тогда уж надо это блок отдельно расписывать.


Так же, как с мультиплексором, части каскада можно в подключаемых устройствах записывать:

Код:

-- в этой библиотеке вся логика устройства, кроме выходного каскада
USE device_lib.vhd;

entity ...
Port(
    clk : in node;
    cpu : in cpu_bus_type;
    cascade_in : in word; -- DATA_IN

    in_ports : in device_port_in_type;
    out_ports : out device_port_out_type;
);

architecture ...
  signal device : device_type;
  signal ena : node;
begin

-- где-то внутри device_main_function
--   if (cpu.addr < base_address or
--         cpu.addr > base_address + base_gap + 1) and
--         cpu.pre_read = '1' then
--       ena_out := '1';
--   else
--       ena_out := '0';
--   end if;
--   if ena_out = '1' then
--       device.data := datas;
--   else
--       device.data := (others => '0');
--   end if;

   data_out <= device.data or cascade_in;

    process (clk) begin
       if clk'event and clk = '1' then
           device <= device_main_function(device,cpu,in_ports);
           out_ports <= device.out_ports;
       end if;
    end process;

end;


Отмечу только, что логика data_out вне синхронного процесса, чтобы объединение по OR могло быть оптимизировано автоматом САПР-а и не вносило быстро нарастающей задержки. Получается подобие "монтажного или" на общей шине.

p.s. код написан (а не скопирован из vhd-файла) для принципиального понимания, а не для использования.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Процессорная система в ПЛИС (маленькие хитрости)
СообщениеДобавлено: Пт июн 29, 2012 20:06 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4917
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
очень не плохо было бы увидеть иллюстрации к описанному (графические), ну очень просится.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Процессорная система в ПЛИС (маленькие хитрости)
СообщениеДобавлено: Пт июн 29, 2012 20:13 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Единственная графическая иллюстрация, какую я придумал - в первом посте. Реально работающую в таком же виде нарисовать не получится, потому что тот же квартус не позволяет таскать на графической схеме такие шинные конгломераты, как cpu_type, которые и надо вести от процессора к устройствам. Кроме того, чтобы схема была полна, от устройств придется выводить порты, как на ввод, так и на вывод, которые "от балды" не придумываются. Короче, надо такую систему сначала нарисовать и запустить, а потом показывать, иначе, получится именно то, что получилось (картинка в первом посте), где сокращено все до предела.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Процессорная система в ПЛИС (маленькие хитрости)
СообщениеДобавлено: Сб июн 30, 2012 10:07 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6314
Благодарил (а): 14 раз.
Поблагодарили: 99 раз.
Если есть HDL, рисунок видится лишним.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB