реклама на сайте
подробности

 
 
> Обконстрейнить асинхронный EMIF
andrew_b
сообщение Dec 12 2014, 06:37
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



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

Дано: DSP имени TI и FPGA имени Xilinx, соединённые шиной EMIF. EMIF асинхронный. Временные диаграммы чтения в приаттаченном рисунке.
Прикрепленное изображение


В FPGA имееется много регистров, формируемых в общем случае на разных клоках. Их надо читать процессором. То есть получается такой большой многоразрядный мультиплексор:
Код
process (EMIFA, D0, D1, D2)
begin
       -- для простоты тут регистра только три, реально их много больше
       case EMIFA is
              when A0 => D <= D0;
              when A1 => D <= D1;
              when A2 => D <= D2;
              when others => D <= (others => '0');
       end case;

       EMIFD <= D when (EMIFCE = '0' and EMIFOE = '0') else (others => 'Z');
end;


Вопрос в том, как всё это правильно обконстрейнить. Пока я обхожусь только указанием максимальной задержки от каждого из регистров до ножек микросхемы:
Код
# DSP read strobe: setup: 2 * 6 ns, strobe: 4 * 6 ns, hold: 2 * 6 ns

TIMEGRP DSP_EMIFD_GRP = PADS(EMIFD(*));

NET U00/D0(*) TPSYNC = UU0_D0;
TIMESPEC TS_UU0_D0 = FROM UU0_D0 TO DSP_EMIFD_GRP 30 ns;
# 30 нс -- это меньше чем setup+hold=36 нс.

Но видимо, этого недостаточно. Наверное, надо как-то учесть и EMIFA, и EMIFCE, и EMIFOE.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SM
сообщение Dec 12 2014, 09:24
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



А у Вас-то он синхронный? То есть, все это выставляется по какому-то клоку, и данные принимается по этому же клоку?
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Dec 12 2014, 10:14
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(SM @ Dec 12 2014, 13:24) *
А у Вас-то он синхронный? То есть, все это выставляется по какому-то клоку, и данные принимается по этому же клоку?

Регистры, которые надо читать, сидят в трёх клоковых доменах с некратными частотатми. Переносить их в один домен мне кажется несколько некрасивым. Кроме того, максимальная частота внутри ПЛИС примерно 65 МГц. Если работу с EMIF "привязать" к ней, то надо увеличивать setup/strobe/hold у EMIF и таким образом несколько его затормозить, чего не хотелось бы.

Цитата(Torpeda)
Для избежания чтения данных в момент их изменения, процесор должен получить сигнал готовности данных - например после обновления регистра FPGA выставляет запрос прерывания и держит данные, пока процесор не прочитает их.
А если таких регистров много, десяток-другой? На всех прерывания не напасёшься.
Go to the top of the page
 
+Quote Post
SM
сообщение Dec 12 2014, 10:35
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(andrew_b @ Dec 12 2014, 13:14) *
Регистры, которые надо читать, сидят в трёх клоковых доменах с некратными частотатми. Переносить их в один домен мне кажется несколько некрасивым. Кроме того, максимальная частота внутри ПЛИС примерно 65 МГц. Если работу с EMIF "привязать" к ней, то надо увеличивать setup/strobe/hold у EMIF и таким образом несколько его затормозить, чего не хотелось бы.


В таком случае, так:
1) Во всех трех доменах нужны синхронизаторы по два триггера на каждый из входных сигналов.
2) Для всех входных сигналов (адрес, данные, т.п.) во всех доменах указать set_input_delay так, чтобы Tsu у FPGA было бы меньше, чем период клока EMIF-а за минусом максимального Tco этих сигналов у EMIF и некоего маленького запаса.
3) Адрес и управление анализировать ТОЛЬКО когда EMIFOE с выхода синхронизатора стал активен. При этом, при таком set_input_delay, как описано в 2) есть 100% гарантия валидности адреса и остальных сигналов управления, так как они реально активизируются раньше, чем OE.
4) данные выдавать на выход, соответственно, на следующем клоке после анализа адреса. Для них установить какое-то определенное Tco.

Ну и EMIF запрограммировать так, чтобы гарантировать такую длительность OE, чтобы оно прошло через синхронизаторы во всех трех доменах (2.5 клока самого медленного домена), плюс еще 1 клок самого медленного домена на выдачу данных, плюс Tco из п.4)

Это вариант №1. синхронный внутри FPGA. Еще есть вариант №2, если внутри FPGA сделать асинхронную дешифрацию адреса и асинхронные флаги чтения. Но этот вариант не всегда реализуем, но более эффективен по скорости. Там все придется констрейнить через set_max_delay и set_min_delay.

В варианте номер 2 - строится асинхронный дешифратор адреса и мультиплексор с регистров ядра FPGA на выход данных. сигнал OE управляет непосредственно тристейтами выходных буферов. Все констрейнится через set_max_delay от входов адресов и CS-ов и до выхода данных, на какое то условное значение, физически реализуемое в проекте. И, соответственно этому настраивается EMIF.
Флаги, что произошло чтение соотв. регистра, реализуются с использованием сигнала OE (заднего его фронта) как клока, и сигналов дешифрации адреса, как разрешения установки флага. при этом задаются констрейны типа set_input_delay для адресов и CS-ов относительно OE. Эти флаги пропускаются в ядро FPGA через синхронизаторы из двух триггеров, и сбрасываются из ядра асинхронно, импульсами длиной в 1 клок соотв. клок-домена. Эти же флаги используются как сигнал READY EMIF-а, чтобы растянуть цикл, если он задумает читать данное раньше, чем ядро фпга его обновило (то есть, пока флаг в единице).
READY формируется асинхронно пропусканием соответствующих флагов согласно адресу читаемого регистра, и констрейнится так же, как данные.
Эти флаги нужны только таким регистрам, которые передают данные, которые же передают статусы, или являются управляющими (то есть, и пишутся только через EMIF, используя его же WE как клок), флагов и READY не требуют. Это вариант предпочтителен и по скорости, и по area, но многие имеют перед ним предрассудки - комплекс боязни асинхронных схем. На всякий случай, для READY можно описать еще и set_output_delay относительно клока OE.

Если вариант 2 непонятен из описания словами, могу нарисовать его на верилоге.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 13:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01399 секунд с 7
ELECTRONIX ©2004-2016