|
Работа с двухпортовой блочной памятью xilinx |
|
|
|
Oct 13 2014, 07:33
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
у true dual port памяти коллизий вообще быть не может, по определению, так как она внутри спроектирована так, чтобы обеспечивать работу на полностью асинхронных тактовых сигналах по обоим портам.
Единственное, что может быть, так это чтение из ячейки памяти в момент, когда запись в нее не окончена, но от таких случаев следует защищаться синхронизаторами снаружи, чтобы читающая сторона не могла знать о том, что записывающая записала данное, до тех пор, пока оно туда гарантировано не записано.
что касается Вашего случая, то зачем Вам true dual port? Когда у Вас одна сторона только читает, другая только пишет, и, докучи, все по одному клоку?
|
|
|
|
|
Oct 13 2014, 08:04
|
Знающий
   
Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650

|
Цитата(gotcha @ Oct 13 2014, 14:40)  Пардон, на порт B чтение и запись (отредактировал). Используется системный клок 50МГц, на A прямой вариант, а на B через инвертор.
Судя по xapp463, на чтение тоже возможна коллизия. Опишите плиз что вам в итоге надо получить, а то складывается некоторое впечатление что вы изобретаете велосипед, и, к примеру, обычная фифошка полностью удовлетворит отца русской демократии...
|
|
|
|
|
Oct 13 2014, 09:58
|
Частый гость
 
Группа: Свой
Сообщений: 115
Регистрация: 19-03-06
Пользователь №: 15 389

|
Цитата(andrew_b @ Oct 13 2014, 13:47)  Если память блочная, то лутов там нет вообще. В смысле луты под погику обработки записи\чтения, разной ширины портов, разного режима (WRITE_FIRST, READ_FIRST, NO_CHANGE) Т.е примитив еще какой-то логикой оборачивается? Цитата(andrew_b @ Oct 13 2014, 13:47)  И зачем инвертировать клок на втором порту? А как удовлетворить hold\setup time? Или читать за три такта?
Сообщение отредактировал gotcha - Oct 13 2014, 10:27
|
|
|
|
|
Oct 13 2014, 11:13
|
Частый гость
 
Группа: Свой
Сообщений: 115
Регистрация: 19-03-06
Пользователь №: 15 389

|
Цитата(SM @ Oct 13 2014, 14:32)  Инверсия клока УСУГУБЛЯЕТ удовлетворение требований по setup ровно вдвое. Так что, это еще вопрос - а стоит ли усложнять себе жизнь. ...может я и не прав, поэтому и появилась эта тема. Почему усугубляет? Рассмотрим работу FSM по тактам (полупериод 10нс) Передний фронт клока: выставляются адрес, управляющие сигналы (согласно ds312 минимал setup time 1.26нс). По заднему фронту: память начинает обрабатывать сигналы (минимал hold time 0.14нс). Данные из памяти появятся максимально через 2.82 нс, т.е. по переднему фронту можно читать. С другой стороны, при разгоне клока, критический путь не покажет реальные проблемы? Вы советуете читать за 3 такта? Легче читать результаты синтеза?
|
|
|
|
|
Oct 13 2014, 12:00
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Путь сигнала (допустим, что выход данных влияет на следующий вход данных или адреса) - Tco (clock-to-out) + Tsu = 2.82 нс + 1.26 нс = 4.08 нс. Если у Вас работа по фронту и у источника, и у приемника - то запас = 20 нс - 4.08 нс = 15.92 нс (на разводку и промежуточную логику). А если фронт-спад, то 10 нс-4.08нс = 5.92 нс. В данном конкретном случае это даже не вдвое жестче, а в 2.7 раз! Почти втрое жестче.
Про холды вообще забудьте, их PAR сам скорректирует, если путь вдруг слишком короткий и быстрый окажется.
---
Вдогонку... Работать на чтение по спаду есть смысл лишь в одном случае - если требуется эмулировать асинхронное ОЗУ, а есть только синхронное - то есть, считывать текущее записываемое данное из второго порта в том же такте, когда и происходит его же запись в первый порт. А иначе работа фронт-спад бессмысленна, и усугбляет временные соотношения, как я показал выше.
|
|
|
|
|
Oct 14 2014, 05:45
|
Частый гость
 
Группа: Свой
Сообщений: 115
Регистрация: 19-03-06
Пользователь №: 15 389

|
Цитата(SM @ Oct 13 2014, 16:00)  Путь сигнала (допустим, что выход данных влияет на следующий вход данных или адреса) - Tco (clock-to-out) + Tsu = 2.82 нс + 1.26 нс = 4.08 нс. Если у Вас работа по фронту и у источника, и у приемника - то запас = 20 нс - 4.08 нс = 15.92 нс (на разводку и промежуточную логику). А если фронт-спад, то 10 нс-4.08нс = 5.92 нс. В данном конкретном случае это даже не вдвое жестче, а в 2.7 раз! Почти втрое жестче.
Про холды вообще забудьте, их PAR сам скорректирует, если путь вдруг слишком короткий и быстрый окажется.
---
Вдогонку... Работать на чтение по спаду есть смысл лишь в одном случае - если требуется эмулировать асинхронное ОЗУ, а есть только синхронное - то есть, считывать текущее записываемое данное из второго порта в том же такте, когда и происходит его же запись в первый порт. А иначе работа фронт-спад бессмысленна, и усугбляет временные соотношения, как я показал выше. Тогда все операции проходят в 3 такта (60нс). А если надо быстрее, разгоняем клок и получаем те же жесткие условия, что за собой может потянуть изменения FSMок (введения хэндшейка, задержек). Если в проекте используется спад клока, хватает ли констрейнта на скважность (clock duty)?
|
|
|
|
|
Oct 14 2014, 10:03
|
Частый гость
 
Группа: Свой
Сообщений: 115
Регистрация: 19-03-06
Пользователь №: 15 389

|
Цитата(SM @ Oct 14 2014, 13:47)  Это с какого перепуга? Считать данное из памяти можно уже на следующем такте после записи. То есть, задержка = 1 такт. А если читать по спаду, то за счет ужесточения setup-времянок можно добиться задержки в 0 (ноль) тактов. Откуда три то? Первый тик: выставляем адрес, управляющие сигналы. Удовлетворяется setup time. Второй тик: память обрабатывает выставленные сигналы. Удовлетворяются: hold time, clock-to-out. Третий тик: забираем валидные данные.
|
|
|
|
|
Oct 14 2014, 10:14
|
Знающий
   
Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650

|
Цитата(SM @ Oct 14 2014, 16:47)  Это с какого перепуга? Считать данное из памяти можно уже на следующем такте после записи. То есть, задержка = 1 такт. А если читать по спаду, то за счет ужесточения setup-времянок можно добиться задержки в 0 (ноль) тактов. Откуда три то? Если речь идёт за блочную память,то транзитная задержка при одинаковых клоках на запись и чтение в принципе не может быть меньше 2 клоков(1 клок на запись и 1 клок на чтение). Все игрища с rising/falling edge приведут лишь к тому, что будут считаны "старые" данные, т.е. то, что там лежало до цикла записи. Кроме того, есть и ещё одна мелкая неприятность (речь идёт за Xilinx). Если задержка на чтение равна 1, то это означает что регистр в примитивах блочной памяти не используется (если бы был использован задержка увеличилась бы до 2 клоков). В этом случае времянка по выходу шины данных памяти сильно ухудшается(например 0.5нС при включенном регистре и 1.5нс без него).На высоких тактовых частотах это может быть критично.
|
|
|
|
|
Oct 16 2014, 15:22
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(Bad0512 @ Oct 14 2014, 14:14)  Если речь идёт за блочную память,то транзитная задержка при одинаковых клоках на запись и чтение в принципе не может быть меньше 2 клоков(1 клок на запись и 1 клок на чтение). Все игрища с rising/falling edge приведут лишь к тому, что будут считаны "старые" данные, т.е. то, что там лежало до цикла записи. Речь о том, что если писать по rising, а читать по falling (или наоборот) - можно получить эмуляцию асинхронной памяти, то есть, грубо говоря, защелки - считать данное, записанное в этом же цикле записи - то есть, за 1 такт. Собственно, я этим пользовался для эмуляции работы регистрового файла процессора, используя несколько блоков памяти, в которые запись делается по фронту, как положено, а чтение - по спаду (где адрес уже готов по фронту). Это как раз соответствует конвейерной задержке на 0 тактов. На высоких частотах, естественно, это сделать невозможно. Только на половинной от максимально допустимой.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|