|
Обконстрейнить асинхронный EMIF |
|
|
|
Dec 12 2014, 06:37
|
Профессионал
    
Группа: Свой
Сообщений: 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.
|
|
|
|
|
 |
Ответов
|
Dec 12 2014, 12:10
|
Знающий
   
Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650

|
Цитата(andrew_b @ Dec 12 2014, 12:37)  Дожив до седых волос, понял, что не вполне понимаю как правильно обконстрейнить чтение по асинхронной шине. Не люблю асинхронные схемы, но "жизнь вынуждает написать бестселлер", поэтому нужно восполнить некоторый пробел. Дано: 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. Как бы я сделал : 1. Перетащил все выходы регистров в один домен. Тут важно убедиться что данные из регистров не изменятся "частично" вследствие того, что фронты чтения и записи асинхронны и могут совпасть. В некоторых случаях на эту ситуацию можно вообще забить (например если мы точно знаем, что писать в регистры новые данные в момент чтения точно никто не будет). Тут всё зависит от логики работы. Это всё очень похоже на классический mailbox. 2. Офигенных размеров выходной мультиплексор сделал бы обязательно синхронным, если не укладываемся в тайминги ввиду конских размеров мультиплексора - добавил бы мультициклы в это место. 3. В вашем EMIF интерфейсе наверняка должен быть сигнальчик RDY, позволяющий на некоторое время "затянуть" цикл чтения из "тормозных" слейвов. Можно тянуть цикл до тех пор, пока наш конский синхронный мультиплексор не выплюнет наружу данные, можно даже малость перестраховаться. 4. Ну и понятно, что фактически ваш асинхронный интерфейс превращается в синхронный. Кстати, если клоки от TI каким-то образом вдруг окажутся в ПЛИС - это может сильно облегчить жизнь.(мы же понимаем, что асинхронных интерфейсов на самом деле не существует, просто кто-то забыл или просто не захотел по какой-то причине тащить наружу клок).
|
|
|
|
|
Dec 12 2014, 13:06
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Еще, вдогонку.
В Вашем, конкретном примере, есть FROM UU0_D0 TO DSP_EMIFD_GRP 30 ns;
А он, в принципе то, и не особо нужен (хотя, и не мешает). Этот путь, даже если опутать дорожками всю FPGA изнутри, будет выдержан всегда, так как, Вы же наверняка не читаете данное, пока не прочитали, что данное готово, или ОНО не запросило прерывание. А когда оно его запросило, то по этому пути уже все дошло куда следует десять раз.
А вот основного - FROM EMIFA TO DSP_EMIFD_GRP XXXX ns; нету! Именно этот путь отвечает за настройку EMIF-а. ну и FROM EMIFCE TO DSP_EMIFD_GRP XXXX ns; и FROM EMIFOE TO DSP_EMIFD_GRP XXXX ns;
причем самый критичный, это последний. И по ним еще и MIN пути надо задать, чтобы HOLD TIME выдержать (Особенно, EMIFOE->EMIFD)! Наверняка там какое-то неотрицательное значение имеется в доке на EMIF. Причем, если MAX пути можно растянуть настройкой емифа, то MIN путь - соблюдать из даташит необходимо.
|
|
|
|
Сообщений в этой теме
andrew_b Обконстрейнить асинхронный EMIF Dec 12 2014, 06:37 SM А у Вас-то он синхронный? То есть, все это выставл... Dec 12 2014, 09:24 andrew_b Цитата(SM @ Dec 12 2014, 13:24) А у Вас-т... Dec 12 2014, 10:14  SM Цитата(andrew_b @ Dec 12 2014, 13:14) Рег... Dec 12 2014, 10:35 Torpeda Цитата(andrew_b @ Dec 12 2014, 10:37) В F... Dec 12 2014, 09:34 Maverick Цитата(andrew_b @ Dec 12 2014, 08:37) Дож... Dec 12 2014, 10:20 andrew_b Цитата(Maverick @ Dec 12 2014, 14:20) а п... Dec 12 2014, 11:13  Maverick Цитата(andrew_b @ Dec 12 2014, 13:13) Нем... Dec 12 2014, 11:41 monty Цитата(andrew_b @ Dec 12 2014, 13:37) Дож... Dec 16 2014, 06:23 andrew_b Цитата(monty @ Dec 16 2014, 10:23) Помнит... Dec 16 2014, 07:35  SM Цитата(andrew_b @ Dec 16 2014, 10:35) Тол... Dec 16 2014, 12:41 billidean Всем привет.
Посмотрев на автомат ТС мне представи... Dec 18 2014, 06:06 Maverick Цитата(billidean @ Dec 18 2014, 08:06) Вс... Dec 18 2014, 06:22
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|