|
Обконстрейнить асинхронный 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, 10:20
|

я только учусь...
     
Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839

|
Цитата(andrew_b @ Dec 12 2014, 08: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. а почему Вы не хотите сделать EMIF и подключить к одному порту двупортовой памяти/фифо? Со вторым портом Вы работаете на своей частоте... возможно еще выделить дополнительно еще пару пинов для обмена готовности данных у FPGA и DSP... Таким образом, блок работы EMIF работает в своем тактовом домене и данные Вы забираете практически без задержек... Чем память хороша, тем что Вы можете забирать нужные типы данных по соответствующим адресам, например сигнал готовности: "00" данные забирать с 0 адреса по 127 адрес "01" данные забирать с 128 адреса по 156 адрес "10" данные забирать с 157 адреса по 200 адрес "11" данные забирать с 158 адреса по 256 адрес
--------------------
If it doesn't work in simulation, it won't work on the board.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Dec 12 2014, 11:41
|

я только учусь...
     
Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839

|
Цитата(andrew_b @ Dec 12 2014, 13:13)  Немного не понял. Вы предлагаете вместо россыпи регистров использовать банк памяти? А как тогда их писать? Со стороны FPGA регистры обновляются независимо друг от друга. А у памяти вход один. Знаю, что геморно (извиняюсь за слово), но в FPGA значения регистров, нужно будет последовательно записывать в память по нужным адресам. Создать типа паралельно-последовательного устройства, которое забирет с паралельных регистров (учитывая все переходы из разных тактовых доменов) данные и запишет последовательно по нужным адресам в память... Запись/чтение в/из память/памяти можно сделать на более высокой частоте - для повышения быстродействия... Как-то так.... PS Можно попробовать увеличить двупортовую память в два раза и сделать типа двойной буферизации, т.е. пока например процессор считывает информацию, FPGA записывает новую информацию и наоборот... Быстродейстаие должно увеличиться....
--------------------
If it doesn't work in simulation, it won't work on the board.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
Сообщений в этой теме
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 Bad0512 Цитата(andrew_b @ Dec 12 2014, 12:37) Дож... Dec 12 2014, 12:10 SM Еще, вдогонку.
В Вашем, конкретном примере, есть ... Dec 12 2014, 13:06 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|