|
Констрейнты при переходе из одного клокового домена в другой., (Как правильно установить) |
|
|
|
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.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
Сообщений в этой теме
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   des00 Цитата(Maverick @ Aug 5 2008, 06:55) Изви... Aug 6 2008, 05:44    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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|