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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Чтение данных из CPU в FPGA, vhdl
des00
сообщение Nov 23 2009, 14:27
Сообщение #16


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(Shivers @ Nov 23 2009, 06:40) *
Это не бред, а помехоустойчивость. Если CKOUT - синхронный клок, то можно защелки и сразу ставить, бесспорно. Но если асинхронный, то двойная классическая схема синхронизация обязательна, иначе будете ловить все помехи на шине. В частности, в мостовых схемах асинхронных магистральных интерфейсов без этого никуда - внешний тактовый сигнал и сплошные схемы синхронизации. Опять же оговорюсь, этот кусок кода предназначен для помехоустойчивости, стабильности и хорошей времянки. Минусы емкость, ну и т.д. - писал выше.


Вы одно с другим путаете. Может быть в асинхронных магистральных интерфейсах вы и правы. Но тут стоит проц, на его шине висит фпга, Шина параллельная, синхронная, работающая в асинхронном режиме (расстояние между процом и фпга не выше ~10см). CLKOUT определяет на шине все. Если посмотрите внимательно на картинку то видно что проц выдерживает и setup/hold самостоятельно. Еще раз при работе от CLKOUT (source-synchronus) синхронизаторы ставить вообще смысла нет, адрес/данные это мултицикл, нужно только вырезать фазу сигнала записи/чтения. А при работе на клоке фпга в асинхронном режиме, ставить синхронизаторы как это делаете вы тоже смысла не имеет, т.к. проц опять же выдерживает setup/hold. Смысла в синхронизаторах на адресе/данных нет.

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


--------------------
Go to the top of the page
 
+Quote Post
Shivers
сообщение Nov 23 2009, 14:49
Сообщение #17


Знающий
****

Группа: Свой
Сообщений: 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 еще и адрес/данные мультиплексированы, немного сложнее ситуация.
Итого, я с самого начала не опровергаю правильность первого кода, просто указал на возможную альтернативу более синхронной реализации, со своими + и - ессно. А картинку смотрел невнимательно, сразу не понял, что интерфейс синхронный, каюсь.
Go to the top of the page
 
+Quote Post
SM
сообщение Nov 23 2009, 14:55
Сообщение #18


Гуру
******

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



Ну вы бы асики-то не приплетали... Там все на так, как в фпга, и вряд-ли товарищ на них нацелен. Кстати, что касается нагрузки в асиках, тоже все как когда. Бывает лучше триггер на входе посадить, а бывает - дерево буферов раскидать, раз на раз не приходится. Но к фпга это все равно отношения не имеет.
Go to the top of the page
 
+Quote Post
Shivers
сообщение Nov 23 2009, 15:04
Сообщение #19


Знающий
****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
SM
сообщение Nov 23 2009, 15:06
Сообщение #20


Гуру
******

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



Цитата(Shivers @ Nov 23 2009, 18:04) *
Если забито у цепи 20 нагрузок, то хоть об колено бейся, 21 не получишь(предположим, региональные клоки и пр. заняты).

Да получишь, без проблем. Ценой наносекунды-другой какой-то. Те же буфера деревом. Но к вопросу, уверен, отношения это ничего не имеет. Товарищу данные просто в массив писать. Там одна проволока до входа блока памяти.
Go to the top of the page
 
+Quote Post
dvladim
сообщение Nov 23 2009, 20:45
Сообщение #21


Знающий
****

Группа: Свой
Сообщений: 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];
будет масса проблем.
Go to the top of the page
 
+Quote Post
%-)
сообщение Nov 23 2009, 23:13
Сообщение #22


Частый гость
**

Группа: Участник
Сообщений: 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;
Go to the top of the page
 
+Quote Post
BSV
сообщение Nov 24 2009, 01:11
Сообщение #23


Знающий
****

Группа: Свой
Сообщений: 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. Табличка с параметрами:
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Дурак, занимающий высокий пост, подобен человеку на вершине горы - все ему кажется маленьким, а всем остальным кажется маленьким он сам. /Законы Мерфи/
Go to the top of the page
 
+Quote Post
%-)
сообщение Nov 24 2009, 02:37
Сообщение #24


Частый гость
**

Группа: Участник
Сообщений: 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. Табличка с параметрами:


а вот это очень горько sad.gif хотелось бы 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
Go to the top of the page
 
+Quote Post
des00
сообщение Nov 24 2009, 04:19
Сообщение #25


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(%-) @ Nov 23 2009, 20:37) *
а вот это очень горько sad.gif хотелось бы Tsetup=1clk @133MHz


делайте sourse-synchronus интерфейс, по другому на 133МГц при ваших времянках вы не получите стабильной работы. Или снижайте частоту интерфейса.


--------------------
Go to the top of the page
 
+Quote Post
SM
сообщение Nov 24 2009, 05:55
Сообщение #26


Гуру
******

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



Еще констрейны покажите. Исходника мало.
Go to the top of the page
 
+Quote Post
%-)
сообщение Nov 24 2009, 06:44
Сообщение #27


Частый гость
**

Группа: Участник
Сообщений: 118
Регистрация: 13-09-09
Пользователь №: 52 331



Цитата(SM @ Nov 24 2009, 08:55) *
Еще констрейны покажите. Исходника мало.


а что такое констрейны?

только без смеха - впервые слышу это слово...
Go to the top of the page
 
+Quote Post
SM
сообщение Nov 24 2009, 07:13
Сообщение #28


Гуру
******

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



Цитата(%-) @ Nov 24 2009, 09:44) *
а что такое констрейны?
только без смеха - впервые слышу это слово...


Описание требований по временным ограничениям к схеме, располагаемой внутри ПЛИС. Т.е. в Вашем случае должен быть create_clock для WE, раз по его edge работа, ну и всякие тем set_input_delay для остальных сигналов. Если используется timequest. А классик использовать не желательно.

Без четкого обконстреивания и отчета таймквеста о том, что все уложилось, это не заработает вообще.
Go to the top of the page
 
+Quote Post
SFx
сообщение Nov 24 2009, 07:18
Сообщение #29


Знающий
****

Группа: Свой
Сообщений: 758
Регистрация: 11-07-05
Из: Понаехал (Мск)
Пользователь №: 6 688



констрейны - это ограничения, которые требуется выполнить синтезатору - мапперу, при компиляции проекта.
они могут быть :
1. по частоте
2. по физическому местоположению цепи/блока/LE на кристалле
3. по задержке распространения сигнала по цепи
Go to the top of the page
 
+Quote Post
%-)
сообщение Nov 24 2009, 07:22
Сообщение #30


Частый гость
**

Группа: Участник
Сообщений: 118
Регистрация: 13-09-09
Пользователь №: 52 331



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


где в Квартусе это указывается?

пока просто создаю проект. пробовал оптимизацию optimal на speed менять - вышло только хуже sad.gif
Go to the top of the page
 
+Quote Post

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

 


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


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