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

 
 
> Констрейнты при переходе из одного клокового домена в другой., (Как правильно установить)
Amper25
сообщение Aug 4 2008, 19:01
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 215
Регистрация: 10-04-07
Пользователь №: 26 929



Вообщем, такая ситуация.

Есть источник входных данных, который по своему клоку(CLK_WR) выдает 8 бит. Есть выходной, так сказать "потребитель", который эти же данные принимает, но уже со своим клоком(CLK_RD).
Данные от источника идут не сплошным потоком, а частями, пакетами.

Для передачи между ними, я использовал FPGA-шную встроенную SRAM(буфер так сказать). Входные данные записываются в этот буфер. Затем, когда он заполнится(пакет принят), я устанавливаю спец. флаг и принимающая часть по этому флагу, начинает читать из буфера и по окончании чтения сбрасывает флаг. По сброшенному флагу, "источник данных" начинает запись в буфер следующий пакет.

Проблема в том, что кроме передачи пакета, надо также передавать спец. число с адресом этого пакета.
Я cделал так: 1.vhdl

Сигналы '1' на входах FLAG_SET и FLAG_CLR имеют длительность в 5-10 периодов WR_CLK, так что однозначно распознаются. Да и сам пакет передается без искажений и наложения одного пакета на другой.

Проблема состоит в том, что время от времени, портится значение PKT_ADDR_OUT.
То есть при переходе от одного CLK домена в другой, сигналы FLAG_POLL и PKT_ADDR_OUT передаются с разными задержками, в результате чего PKT_ADDR_OUT читается в тот момент, когда оно меняется.

Каким образом мне ограничить разницу во временах прихода флага и данных? Какие из constraints за это отвечают?

Среда разработки: Quartus, используется "classic timing analiser"

ЗЫ: хотел добавить, что проблема именно с constraints а не с логикой работы системы, так как если менять другие блоки, которые совершенно не связаны с даным, при компиляции, расположение на кристалле меняется, и проблема то проявляется то исчезает. То есть дело именно в разводке.

Сообщение отредактировал Amper25 - Aug 4 2008, 18:57
Прикрепленные файлы
Прикрепленный файл  1.vhdl.txt ( 1.12 килобайт ) Кол-во скачиваний: 81
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Amper25
сообщение Aug 4 2008, 19:25
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 215
Регистрация: 10-04-07
Пользователь №: 26 929



Это все понятно, но из-зи спцификы девайса который я делаю, пакет должен полностью помещатся в буфере, так как нет никакой гарантии, что он будет читаться в тот момент когда записывается.(выходное устройство может быть занято)
Если в этот буфер добавить еще запись адреса пакета, то размер еще увеличится(что не есть хорошо, так как RAM и так в притык).

Мне нужен совет как правильно ввести временные ограничения на сигналы.
В первом временном домене, устанавливается PKT_ADDR, и такт спустя FLAG_POLL. Во втором домене когда TAKT_POLL = '1', сигнал в PKT_ADDR еще не успевает установится в требуемое значение, так как временные ограничения не установлены. (То есть разница задержми сигналов TAKT_POLL и PKT_ADDR больше одного такта первого домена)

Сообщение отредактировал Amper25 - Aug 4 2008, 19:26
Go to the top of the page
 
+Quote Post
des00
сообщение Aug 5 2008, 02:29
Сообщение #3


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

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



Цитата(Amper25 @ Aug 4 2008, 14:25) *
Мне нужен совет как правильно ввести временные ограничения на сигналы.
В первом временном домене, устанавливается PKT_ADDR, и такт спустя FLAG_POLL. Во втором домене когда TAKT_POLL = '1', сигнал в PKT_ADDR еще не успевает установится в требуемое значение, так как временные ограничения не установлены. (То есть разница задержми сигналов TAKT_POLL и PKT_ADDR больше одного такта первого домена)



ИМХО не правильно вы сделали, у вас все почему то формируется в одном домене CLK_WR и совершенно не учтен домен CLK_RD.

Как уже вам сказали воспользуйтесь синхронизаторами и простейшим механизмом handshake.

Т.е. сигнал установки из домена передающей стороны, защелкивает адрес и через синхронизаторы возводит флаг ready на приемной стороне и флаг busy на передающей.

Сигнал сброса из приемной стороны сбрасывает флаг ready на приемной стороне и через синхронизаторы сбрасывает флаг busy на передающей.

Синхронизаторы вводят задержку в 2-5 тактов частоты, за это время сигнал из адресного регистра устаканиться в новом домене, ну для надежности можете еще set_max_delay сделать.

Если адрес это адрес в этой памяти, откуда нужно взять пакет, то я бы сделал асинхронный flip-flop ram buffer. Т.е. всю логику адреса зашил бы в него, при этом можно дробить память на 2^N буферов.
Делается он не сложно, достаточно хорошо работает. Если не получиться, пишите. вышлю код.

Цитата
Преимущество такого решения состоит в том, что сейчас Вам приходится дожидаться окончания заполнения памяти пакета, а в случае использования FIFO обработку пакета в другом тактовом домене можно будет начать практически сразу


ну это с учетом что приемник поддерживает режимы с WS, а если не поддерживает (пакетный режим например) то вы учли возможный разбег фаз генераторов и частот в логике определения начала чтения фифо.


--------------------
Go to the top of the page
 
+Quote Post
Maverick
сообщение Aug 5 2008, 11:55
Сообщение #4


я только учусь...
******

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



Цитата(des00 @ Aug 5 2008, 05:29) *
ИМХО не правильно вы сделали, у вас все почему то формируется в одном домене CLK_WR и совершенно не учтен домен CLK_RD.

Как уже вам сказали воспользуйтесь синхронизаторами и простейшим механизмом handshake.

Т.е. сигнал установки из домена передающей стороны, защелкивает адрес и через синхронизаторы возводит флаг ready на приемной стороне и флаг busy на передающей.

Сигнал сброса из приемной стороны сбрасывает флаг ready на приемной стороне и через синхронизаторы сбрасывает флаг busy на передающей.

Синхронизаторы вводят задержку в 2-5 тактов частоты, за это время сигнал из адресного регистра устаканиться в новом домене, ну для надежности можете еще set_max_delay сделать.

Если адрес это адрес в этой памяти, откуда нужно взять пакет, то я бы сделал асинхронный flip-flop ram buffer. Т.е. всю логику адреса зашил бы в него, при этом можно дробить память на 2^N буферов.
Делается он не сложно, достаточно хорошо работает. Если не получиться, пишите. вышлю код.



Извините, что вмешиваюсь, а можно выслать этот код и буду очень рад если он еще и на VHDL smile.gif И не могли бы Вы порекомендовать литературу или рассказать более подробно про handshake

P. S. Просто знаю, что Вы работаете на Verilog (SystemVerilog)


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
des00
сообщение Aug 6 2008, 05:44
Сообщение #5


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

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



Цитата(Maverick @ Aug 5 2008, 06:55) *
Извините, что вмешиваюсь, а можно выслать этот код и буду очень рад если он еще и на VHDL smile.gif И не могли бы Вы порекомендовать литературу или рассказать более подробно про handshake

P. S. Просто знаю, что Вы работаете на Verilog (SystemVerilog)


эти модули я как раз делал в своем VHDL ом "прошлом", так что вам везет %)

в атаче 2 варианта синхронный с двойным буферированием и асинхронный с четверным, комментарии на русском, разобраться не сложно.


также статья про handshake протоколы на стыках тактовых доменов.

Удачи !!!
Прикрепленные файлы
Прикрепленный файл  Buffer2D.vhd ( 5.58 килобайт ) Кол-во скачиваний: 270
Прикрепленный файл  aBuffer4D.vhd ( 7.32 килобайт ) Кол-во скачиваний: 132
Прикрепленный файл  PulseSyncronizer.vhd ( 1.74 килобайт ) Кол-во скачиваний: 182
Прикрепленный файл  async_signals.pdf ( 110.94 килобайт ) Кол-во скачиваний: 166
 


--------------------
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Amper25   Констрейнты при переходе из одного клокового домена в другой.   Aug 4 2008, 19:01
- - makc   В общем случае нужно использовать асинхронное FIFO...   Aug 4 2008, 19:01
- - Amper25   Мне пришлось использовать все таки не FIFO а двупо...   Aug 4 2008, 19:06
|- - makc   Цитата(Amper25 @ Aug 4 2008, 23:06) Мне п...   Aug 4 2008, 19:14
|- - Maverick   Цитата(des00 @ Aug 6 2008, 08:44) эти мод...   Aug 6 2008, 06:53
|- - des00   Цитата(Maverick @ Aug 6 2008, 01:53) А им...   Aug 6 2008, 11:26
|- - Maverick   Цитата(des00 @ Aug 6 2008, 14:26) Спаси...   Aug 6 2008, 11:44
- - Amper25   ЦитатаЕсли адрес это адрес в этой памяти, откуда н...   Aug 5 2008, 09:33
|- - makc   Цитата(Amper25 @ Aug 5 2008, 13:33) Я уст...   Aug 5 2008, 09:46
|- - des00   Цитата(Amper25 @ Aug 5 2008, 04:33) Да у ...   Aug 5 2008, 10:17
- - Amper25   ЦитатаВы ничего не сказали про свойства этих такто...   Aug 5 2008, 09:52
- - Amper25   Цитатаеще раз повторяю, у вас сделано не так (...   Aug 5 2008, 18:45


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

 


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


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