|
|
  |
Чтение данных из CPU в FPGA, vhdl |
|
|
|
Nov 23 2009, 14:27
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(Shivers @ Nov 23 2009, 06:40)  Это не бред, а помехоустойчивость. Если CKOUT - синхронный клок, то можно защелки и сразу ставить, бесспорно. Но если асинхронный, то двойная классическая схема синхронизация обязательна, иначе будете ловить все помехи на шине. В частности, в мостовых схемах асинхронных магистральных интерфейсов без этого никуда - внешний тактовый сигнал и сплошные схемы синхронизации. Опять же оговорюсь, этот кусок кода предназначен для помехоустойчивости, стабильности и хорошей времянки. Минусы емкость, ну и т.д. - писал выше. Вы одно с другим путаете. Может быть в асинхронных магистральных интерфейсах вы и правы. Но тут стоит проц, на его шине висит фпга, Шина параллельная, синхронная, работающая в асинхронном режиме (расстояние между процом и фпга не выше ~10см). CLKOUT определяет на шине все. Если посмотрите внимательно на картинку то видно что проц выдерживает и setup/hold самостоятельно. Еще раз при работе от CLKOUT (source-synchronus) синхронизаторы ставить вообще смысла нет, адрес/данные это мултицикл, нужно только вырезать фазу сигнала записи/чтения. А при работе на клоке фпга в асинхронном режиме, ставить синхронизаторы как это делаете вы тоже смысла не имеет, т.к. проц опять же выдерживает setup/hold. Смысла в синхронизаторах на адресе/данных нет. А насчет времянки повторю еще раз это мультицикловые пути, правильно пропишите констрейны и проблем не будет.
--------------------
|
|
|
|
|
Nov 23 2009, 14:49
|

Знающий
   
Группа: Свой
Сообщений: 680
Регистрация: 11-02-08
Из: Msk
Пользователь №: 34 950

|
Цитата(des00 @ Nov 23 2009, 17:27)  Вы одно с другим путаете. Может быть в асинхронных магистральных интерфейсах вы и правы. Но тут стоит проц, на его шине висит фпга, Шина параллельная, синхронная, работающая в асинхронном режиме (расстояние между процом и фпга не выше ~10см). CLKOUT определяет на шине все. Если посмотрите внимательно на картинку то видно что проц выдерживает и setup/hold самостоятельно. Еще раз при работе от CLKOUT (source-synchronus) синхронизаторы ставить вообще смысла нет, адрес/данные это мултицикл, нужно только вырезать фазу сигнала записи/чтения. А при работе на клоке фпга в асинхронном режиме, ставить синхронизаторы как это делаете вы тоже смысла не имеет, т.к. проц опять же выдерживает setup/hold. Смысла в синхронизаторах на адресе/данных нет.
А насчет времянки повторю еще раз это мультицикловые пути, правильно пропишите констрейны и проблем не будет. Я выше написал, что согласен насчет не-нужности двукаскадных схем синхронизаций для УЖЕ синхронного интерфейса. Тем не менее, первый каскад защелок кмк все равно надо ставить, даже если пути - малтисайкл. Точнее не так - Если исходить из концепции простоты дизайна и нацеливаться на low power asic, то можно сразу ставить защелки с использованием незащелкнутых управляющих сигналов - т.е. делать простой интерфейс "как на россыпи". Но! Если требуется стабильная и быстродействующая прошивка для ПЛИС, или же мы боремся со снижением нагрузки на цепи в асике, то имеет смысл ставить один(1) каскад d-триггеров на весь входной интерфейс, и уже потом разгребать всю логику внутри. Преимущества уже указаны - снижение нагрузки на цепи. С большой нагрузкой может и мальтисайкл 3 не спасти, а про разброс времянки от_разводки_к_разводке я и вовсе молчу. По крайней мере, отлаживая модель для PCI я добивался большей производительности именно введением дополнительных d-триггеров. Впрочем, в PCI еще и адрес/данные мультиплексированы, немного сложнее ситуация. Итого, я с самого начала не опровергаю правильность первого кода, просто указал на возможную альтернативу более синхронной реализации, со своими + и - ессно. А картинку смотрел невнимательно, сразу не понял, что интерфейс синхронный, каюсь.
|
|
|
|
|
Nov 23 2009, 15:04
|

Знающий
   
Группа: Свой
Сообщений: 680
Регистрация: 11-02-08
Из: Msk
Пользователь №: 34 950

|
Цитата(SM @ Nov 23 2009, 17:55)  Ну вы бы асики-то не приплетали... Там все на так, как в фпга, и вряд-ли товарищ на них нацелен. Кстати, что касается нагрузки в асиках, тоже все как когда. Бывает лучше триггер на входе посадить, а бывает - дерево буферов раскидать, раз на раз не приходится. Но к фпга это все равно отношения не имеет. Да в ПЛИС все то же самое, только вариантов влево-право меньше (что хуже, на самом деле). Если забито у цепи 20 нагрузок, то хоть об колено бейся, 21 не получишь(предположим, региональные клоки и пр. заняты). Приходится лишние триггера ставить, где можно. Или представьте, что входная защелка находится прямо в i/o пине и использует в качестве CE (или OE для бидира) внешний же сигнал - это какой route получится? Вот об этом я и писал выше Да и асик тут очень при чем получается: поскольку, отлаживается он всегда в ПЛИС, а модель писать приходится совсем не с учетом ПЛИСовских фенечек. И проблем решать приходится подчас целых две - чтобы и там и там времянка хорошая была. Тут мое твердое мнение, что модель для асика должна быть прогнана в ПЛИС на 100%, за исключением только лишь заказных блоков. Чем больше мест в коде отличаются дефайнами ПЛИС/асик, тем больше косяков потом может вылезти.
Сообщение отредактировал Shivers - Nov 23 2009, 15:10
|
|
|
|
|
Nov 23 2009, 20:45
|
Знающий
   
Группа: Свой
Сообщений: 654
Регистрация: 24-01-07
Из: Воронеж
Пользователь №: 24 737

|
Цитата(Shivers @ Nov 23 2009, 16:40)  Это не бред, а помехоустойчивость. Если CKOUT - синхронный клок, то можно защелки и сразу ставить, бесспорно. Но если асинхронный, то двойная классическая схема синхронизация обязательна, иначе будете ловить все помехи на шине. Вот это уж, извините, как раз бред. Для синхронного интерфейса двойная буферизация не нужна, а для асинхронного при таком захвате Код din_1d[7:0] <= d[7:0]; din_2d[7:0] <= din_1d[7:0]; будет масса проблем.
|
|
|
|
|
Nov 23 2009, 23:13
|
Частый гость
 
Группа: Участник
Сообщений: 118
Регистрация: 13-09-09
Пользователь №: 52 331

|
вот часть дизайна, которая перехватывает обращение к регистрам управления (cs=0, we=0, a=0). довольно часто происходят ложные срабатывания регистров - к ним не обращались, а они отрабатывают. как можно избавиться? синхронный вариант не предлагать. Код process(WE,CS,A) begin if CS='0' then if falling_edge(WE) then if A='0' then case D(15 downto 12) is --when "0000" => --R_D:=D(0); --when "0001" => --R_M<=D(1 downto 0); when "0010" => R_P<=D(0); when "0011" => R_X0<=D(8 downto 0); X<=D(8 downto 0); when "0100" => R_X1<=D(8 downto 0); when "0101" => R_Y0<=D(7 downto 0); Y<=D(7 downto 0); when "0110" => R_Y1<=D(7 downto 0); when "0111" => R_C<=D(7 downto 0); when others =>null; end case;
|
|
|
|
|
Nov 24 2009, 01:11
|

Знающий
   
Группа: Свой
Сообщений: 541
Регистрация: 11-04-05
Из: Москва
Пользователь №: 4 045

|
Делал интерфейс с Блэкфином на Спартан 3. Использовал синхронный вариант + ARDY. Максимально быструю времянку получить цели не было. Что там на плате было не знаю - ваял удаленно, платы в глаза не видел. Претензий от заказчика не было. В коде из Вашего крайнего поста не совсем понятно, почему данные защелкиваются по спаду WE (или это инвертированный сигнал AWEn?). Также было бы нелишним занести (if CS='0') then в тело (if falling_edge(WE) then) тогда это будет разрешение записи в регистр, а у Вас в терминах ПЛИС это получается непонятно что (весь код не приведен). Если асинхронно, я бы делал так Код process(AWEn) begin if (AWEn'event and AWEn = '1') then if (CS='0' and A='0' and D(15 downto 12) = "0101") then Y<=D(7 downto 0); end if; ... end if; end process; Только при желаемых времянках (Tsetup=1clk, Twrite=1 clk, Thold =0 clk) нужно учитывать ИМХО, что например задержки от пинов CS, A, D(15:12) до триггеров должны быть не более 7,5 + (7,5 - 6) + 0,8 ns. Табличка с параметрами:
Эскизы прикрепленных изображений
--------------------
Дурак, занимающий высокий пост, подобен человеку на вершине горы - все ему кажется маленьким, а всем остальным кажется маленьким он сам. /Законы Мерфи/
|
|
|
|
|
Nov 24 2009, 02:37
|
Частый гость
 
Группа: Участник
Сообщений: 118
Регистрация: 13-09-09
Пользователь №: 52 331

|
Цитата(BSV @ Nov 24 2009, 05:11)  В коде из Вашего крайнего поста не совсем понятно, почему данные защелкиваются по спаду WE (или это инвертированный сигнал AWEn?). Также было бы нелишним занести (if CS='0') then в тело (if falling_edge(WE) then) тогда это будет разрешение записи в регистр, а у Вас в терминах ПЛИС это получается непонятно что (весь код не приведен). WE - обычный сигнал стробирования (активный 0) по фронту WE почему-то некорректно работает - скорее всего из-за того что данные уже недостоверны - нужно увеличивать Hold Time Цитата(BSV @ Nov 24 2009, 05:11)  Если асинхронно, я бы делал так Код process(AWEn) begin if (AWEn'event and AWEn = '1') then if (CS='0' and A='0' and D(15 downto 12) = "0101") then Y<=D(7 downto 0); end if; ... end if; end process; как быть если нужно опрашивать несколько регистров? номера регистров задаются в старших 4-х битах, остальные биты - содержимое Цитата(BSV @ Nov 24 2009, 05:11)  Только при желаемых времянках (Tsetup=1clk, Twrite=1 clk, Thold =0 clk) нужно учитывать ИМХО, что например задержки от пинов CS, A, D(15:12) до триггеров должны быть не более 7,5 + (7,5 - 6) + 0,8 ns. Табличка с параметрами: а вот это очень горько  хотелось бы Tsetup=1clk @133MHz ещё вопрос. как быть если нужно с одними и теме же объектами работать по фроту, спаду и уровню? vhdl ругается - пишит что не может имплементировать регистры вот полный процесс(откомментировал). процесс должен подсчитывать байты и вычислять адрес видеопамяти. увеличение по Х и У. когда A=1 и записывать в регистры когда A=0: Код process(WE) begin if falling_edge(WE) then --Обработка регистров if (CS='0' and A='0' and D(15 downto 12)="0000") then R_D<=D(0); end if; if (CS='0' and A='0' and D(15 downto 12)="0001") then R_M<=D(1 downto 0); end if; if (CS='0' and A='0' and D(15 downto 12)="0010") then R_P<=D(0); end if; if (CS='0' and A='0' and D(15 downto 12)="0011") then R_X0<=D(8 downto 0); X<=D(8 downto 0); end if; if (CS='0' and A='0' and D(15 downto 12)="0100") then R_X1<=D(8 downto 0); end if; if (CS='0' and A='0' and D(15 downto 12)="0101") then R_Y0<=D(7 downto 0); Y<=D(7 downto 0); end if; if (CS='0' and A='0' and D(15 downto 12)="0110") then R_Y1<=D(7 downto 0); end if; if (CS='0' and A='0' and D(15 downto 12)="0111") then R_C<=D(7 downto 0); end if; if (CS='0' and A='0' and D(15)='1') then R_RGB(conv_integer(R_C))<=D(14 downto 0); end if; --Вычисление адреса в видеопамяти WriteAddress=320*y+x if (CS='0' and A='1') then WriteAddress<=("101000000"*Y)+X; --вычисление адреса из старых координат if X=R_X1 then --новые координаты - X и Y увеличиваются, для следующего адреса X<=R_X0; if Y=R_Y1 then Y<=R_Y0; else Y<=Y+1; end if; else X<=X+1; end if; end if; end if; end process; смысл этого процесса в установке прямоугольной области (R_X0,R_Y0,R_X1,R_Y1) на дисплее для того чтобы потом слева-направа сверху-вниз записывать данные прошу покритиковать или дополнить
Сообщение отредактировал %-) - Nov 24 2009, 02:41
|
|
|
|
|
Nov 24 2009, 06:44
|
Частый гость
 
Группа: Участник
Сообщений: 118
Регистрация: 13-09-09
Пользователь №: 52 331

|
Цитата(SM @ Nov 24 2009, 08:55)  Еще констрейны покажите. Исходника мало. а что такое констрейны? только без смеха - впервые слышу это слово...
|
|
|
|
|
Nov 24 2009, 07:22
|
Частый гость
 
Группа: Участник
Сообщений: 118
Регистрация: 13-09-09
Пользователь №: 52 331

|
Цитата(SFx @ Nov 24 2009, 10:18)  констрейны - это ограничения, которые требуется выполнить синтезатору - мапперу, при компиляции проекта. они могут быть : 1. по частоте 2. по физическому местоположению цепи/блока/LE на кристалле 3. по задержке распространения сигнала по цепи где в Квартусе это указывается? пока просто создаю проект. пробовал оптимизацию optimal на speed менять - вышло только хуже
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|