|
Констрейнты при переходе из одного клокового домена в другой., (Как правильно установить) |
|
|
|
Aug 4 2008, 19:01
|
Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
Aug 4 2008, 19:25
|
Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 5 2008, 02:29
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 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, а если не поддерживает (пакетный режим например) то вы учли возможный разбег фаз генераторов и частот в логике определения начала чтения фифо.
--------------------
|
|
|
|
|
Aug 5 2008, 11:55
|

я только учусь...
     
Группа: Модераторы
Сообщений: 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  И не могли бы Вы порекомендовать литературу или рассказать более подробно про handshake P. S. Просто знаю, что Вы работаете на Verilog (SystemVerilog)
--------------------
If it doesn't work in simulation, it won't work on the board.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Aug 6 2008, 05:44
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(Maverick @ Aug 5 2008, 06:55)  Извините, что вмешиваюсь, а можно выслать этот код и буду очень рад если он еще и на VHDL  И не могли бы Вы порекомендовать литературу или рассказать более подробно про handshake P. S. Просто знаю, что Вы работаете на Verilog (SystemVerilog) эти модули я как раз делал в своем VHDL ом "прошлом", так что вам везет %) в атаче 2 варианта синхронный с двойным буферированием и асинхронный с четверным, комментарии на русском, разобраться не сложно. также статья про handshake протоколы на стыках тактовых доменов. Удачи !!!
--------------------
|
|
|
|
|
Aug 6 2008, 06:53
|

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

|
Цитата(des00 @ Aug 6 2008, 08:44)  эти модули я как раз делал в своем VHDL ом "прошлом", так что вам везет %)
в атаче 2 варианта синхронный с двойным буферированием и асинхронный с четверным, комментарии на русском, разобраться не сложно. также статья про handshake протоколы на стыках тактовых доменов.
Удачи !!! Спасибо большое, за файлы! Поискал по форуму нашел про handshake http://electronix.ru/forum/index.php?showt...935&hl=FIFO , но все равно как то до конца не уяснил. А имеет ли значение, например, если эти частоты формируются внутри ПЛИС, например с помощью PLL, и не являются внешними, другими словами например "multiclock" проект в ПЛИС и для стыков тактовых доменов тоже нужен handshake? Т.е. handshake использовать всегда при работе на нескольких частотах или нет, чтобы избежать метастабильности?
--------------------
If it doesn't work in simulation, it won't work on the board.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Aug 6 2008, 11:26
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(Maverick @ Aug 6 2008, 01:53)  А имеет ли значение, например, если эти частоты формируются внутри ПЛИС, например с помощью PLL, и не являются внешними, другими словами например "multiclock" проект в ПЛИС и для стыков тактовых доменов тоже нужен handshake? Т.е. handshake использовать всегда при работе на нескольких частотах или нет, чтобы избежать метастабильности? Вопрос не совсем понял. я делаю так. 1. Если нужно передать большой поток данных, то естественно ставим асинхронное фифо, асинхронную память и т.д. 2. Если нужно передать флаг (статуса например) то тут проще сделать на синхронизаторах и handshake протоколе. Протокол здесь нужен только в том случае, если работа мастера и слейва зависит от этого флага (как в примере автора темы). 3. Если нужно передать одинарную чиселку, без подтверждения ее обработки то тут достаточно синхронизатора на валидность этой чиселки и регистра-защелкив домене источнике. Насчет синхронизаторов возможны варианты : 1. Если частоты синфазны (кратные частоты идущие с одного PLL) то на стыке можно поставить только логику выравнивания длительности стробов, данных + прописать констрейны перекоса клоков. 2. В противном случае сделаю как описано выше. Правда в 1 ом случае, если это не сломает вам логику(!!!) проще вколотить синхронизаторы и забыть, что клоки должны быть синфазные %)) Насчет метастабильности, не так страшен черт как его малютка. Внимательно разберитесь что это такое, как с этим бороться и когда с этим стоит бороться. метастабильность вызывает изменение асинхронного сигнала в момент работы. Если этот сигнал статический то никакой метастабильности не будет и бороть некого. Или если этот сигнал входит в формулу расчета как константа и вам не важно что несколько вычислений будут некорректны, при изменении этого параметра, то опять же бороть некого. Или ваш блок гарантировано не будет работать (например сброс лежит, разрешения нет) до того как этот сигнал устаканиться, то опять же бороть некого. Удачи !!!
--------------------
|
|
|
|
Сообщений в этой теме
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, 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|