|
|
  |
Работе по фронтам не клокового входа, чем черевато? |
|
|
|
Jan 4 2014, 16:46
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Эм... и вот теперь вопрос на миллион  Как забить констраин между сигналом и выходом? Проблема вот в чем по MAIN_CLK и событию DataRedy защелкивается передаваемое значение в регистр DataOut а по SPI_CLK оно выдавливается наружу естественно нет никакой связи между MAIN_CLK и SPI_CLK, я сам слежу за времянкой в этом месте (SPI клоки не появляются пока данные гарантированно не попадут в регистр, там пауза несколько клоков) Теперь, когда я задаю времянку появления данных после фронта клока SPI в эту времянку входит полный путь от данных до выхода на ружу, а мне надо чтобы учитывалось только от DataOut до выхода, от фронта SPI_CLK. То есть как бы не учитывать время сохранения данных в DataOut, можно это как то в констраине описать? Не руками же вычитать время по логам и смотреть получилось или нет?
|
|
|
|
|
Jan 4 2014, 17:41
|
Местный
  
Группа: Участник
Сообщений: 230
Регистрация: 29-08-09
Пользователь №: 52 094

|
Цитата(Golikov A. @ Jan 4 2014, 18:57)  если написать констраины на сигналы, время выставления данных относительно этого входа, то в случае их выполнения все будет хорошо? То есть разницы не будет между сигналом с клокового и не клового входов?
Правильно ли что сигналы не различимы кроме сложности соблюдения констраинов? Не обязательно. Но есть вероятность. Цитата(Golikov A. @ Jan 4 2014, 20:46)  Эм... и вот теперь вопрос на миллион  Как забить констраин между сигналом и выходом? Проблема вот в чем по MAIN_CLK и событию DataRedy защелкивается передаваемое значение в регистр DataOut а по SPI_CLK оно выдавливается наружу естественно нет никакой связи между MAIN_CLK и SPI_CLK, я сам слежу за времянкой в этом месте (SPI клоки не появляются пока данные гарантированно не попадут в регистр, там пауза несколько клоков) Теперь, когда я задаю времянку появления данных после фронта клока SPI в эту времянку входит полный путь от данных до выхода на ружу, а мне надо чтобы учитывалось только от DataOut до выхода, от фронта SPI_CLK. То есть как бы не учитывать время сохранения данных в DataOut, можно это как то в констраине описать? Не руками же вычитать время по логам и смотреть получилось или нет? Можно поставить промежуточный регистр на spi-клоке и выдавать данные наружу из него. И времянку от него задать.
|
|
|
|
|
Jan 4 2014, 18:55
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата(o_khavin @ Jan 4 2014, 21:41)  Не обязательно. Но есть вероятность. и высока ли вероятность? Цитата(o_khavin @ Jan 4 2014, 21:41)  Можно поставить промежуточный регистр на spi-клоке и выдавать данные наружу из него. И времянку от него задать. ну собственно так и есть. Есть промежуточный регистр, вопрос как такой констраин пишется? я вообще в них не силен, а в таких специфических и подавно.
|
|
|
|
|
Jan 4 2014, 19:36
|
Местный
  
Группа: Свой
Сообщений: 462
Регистрация: 20-01-06
Пользователь №: 13 399

|
Цитата(Golikov A. @ Jan 2 2014, 22:06)  Волею судеб так получилось что spi клок пришелся на не клоковый вход. Чем грозит использование его в конструкциях вида Ничем не грозит, поскольку ни в одном более-менее серьезном проекте никто как тактовый сигнал его использовать не будет. Выделяйте фронт (на внутренней более высокой частоте) и используйте его как "строб".
|
|
|
|
|
Jan 4 2014, 20:22
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата(Джеймс @ Jan 4 2014, 23:36)  Ничем не грозит, поскольку ни в одном более-менее серьезном проекте никто как тактовый сигнал его использовать не будет. Выделяйте фронт (на внутренней более высокой частоте) и используйте его как "строб". Расскажете как выделить 50 МГц клок на 100 МГц тактовой? Боюсь что для этого надо не меньше 200 МГц, а этого мне на 6 спартане добиться не удалось... Мне он нужен как тактовый только для сдвиговых регистров данных и только для этого. Вот какая странность, если задать констраин что SPI клок 100 МГц, все разводиться. А если указать что SPI клок 200 МГц, но данные должны быть готовы не позднее 8 мСек после фронта (за 2 мс до следующего обратного направления). Пишут клок констраин не выдержан, и минимум чего можно добиться это 12 мСек. Блин вот какого? ведь на 100 МГц, сигналы точно готовы до 10 мСек... как договориться? может кто пример правильного констраина написать? сигналы spi_in spi_out spi_clk регистры [8 : 0]spi_data_in_reg [8 : 0]spi_data_out_reg хочу чтобы с spi_in данные попадали в spi_data_in_reg не дольше чем через 5 нСек после восходящего сигнала клока spi_clk а данные из spi_data_out_reg попадали на spi_out не дольше чем через 5 нСек после падающего сигнала клока spi_clk может я чего пишу не верно?
|
|
|
|
|
Jan 4 2014, 21:19
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
тут вам не констрейн писать надо, и междоменный переход. Например, регистр данных, как и счетчик бит, тактируется клоком SPI, по окончании приема от этого же клока устанавливается признак того, что данное принято, и этот признак через пару синхронизаторов уходит в основной домен. как он дошел до основного домена, точнее его изменение с 0 на 1, данные следует защелкнуть в регистр в основном домене, и отправить их дальше куда следует. Возможно, если планируется непрерывный прием, еще нужен теневой регистр в SPI домене, а то и FIFO.
а констрейны - объявить домены асинхронными, и всё. Между ними никаких констрейнов. Констренить только входы данных относительно SPI клока - а это классический SDC-констрейн set_output_delay/set_input_delay
|
|
|
|
|
Jan 4 2014, 21:44
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
вся синхронизация имеется, это понятно и это реализовано... объявить асинхронные домены - это я думаю осилю (хотя если скажете какие буквы жать точно буду рад). теперь нужен последний шаг, объяснить синтезатору за чем важно следить, собственно следить надо вот за чем: по падающему клоку я выставляю данные, а защелкиваются они по восходящему если spi_clk имеет период 20 nSec, то синтезатор считает что данные могут стать валидными как раз за время чуть меньше 20 nSec к след фронту, а мне надо чтобы они стали валидными не позднее 10 nSec (и даже меньше), к след восходящему фронту. если сделать период 10 nSec это получилось автоматически, и все работает и разводиться, но зачем искусственно зажимать клок? Хочу клок с периодом 20 nSec и готовностью данных за 8 nSec я написал так Код NET "mem_spi_clk" TNM_NET = mem_spi_clk; TIMESPEC TS_mem_spi_clk = PERIOD "mem_spi_clk" 20 ns HIGH 50%; NET "mem_spi_clk" CLOCK_DEDICATED_ROUTE = FALSE; OFFSET = IN 8 ns VALID 16 ns BEFORE "mem_spi_clk" RISING; OFFSET = OUT 8 ns AFTER "mem_spi_clk" FALLING; казалось бы вот оно счастье, а вот фиг, OFFSET = OUT 8 ns AFTER "mem_spi_clk" FALLING; этот констраин не выполняется... хочет чуть ли не 12 nSec при этом схема с TIMESPEC TS_mem_spi_clk = PERIOD "mem_spi_clk" 10 ns HIGH 50%; разводиться, и констраин выполняется, то есть физически можно добиться время установки меньше 10 nSec.... как его уговорить то? Или я чего то не то написал?
|
|
|
|
|
Jan 5 2014, 16:48
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
это был не я  у нас разделения труда%).... на этой ноге сидит только 2 сдвиговых регистра SPI приемный и передающий. Причем они полностью изолированны от всего остального по времени, все данные для них могут быть готовы за много клоков до, и считаться через достаточно клоков после. как сделать такое колдунство как локальный клок? Что-то мне кажется эту ногу вообще не надо тащить на буферы, или без этого в плис не бывает? может вообще все проще написать Код always @(spi_clk) begin if(spi_clk == 1'b1) //UP
else //down end или так еще хуже?
|
|
|
|
|
Jan 5 2014, 17:01
|
Знающий
   
Группа: Свой
Сообщений: 781
Регистрация: 3-10-04
Из: Санкт-Петербург
Пользователь №: 768

|
Цитата(Golikov A. @ Jan 4 2014, 10:27)  теперь новое устройство и первый SPI решил переписать на прием-передачу, чтобы он одновременно передавал и принимал. И вот тут все сломалось. По какой - то причине то ли передача то ли прием сдвигается на 1 бит, причем в моделсиме все четко, а в железе кирдык. Первый проект разводился в нескольких модификациях и SPI всегда работали без сбоя, а тут на пустом кристалле (пока добавил 4 модуля) ничего не работает...
Мне казалось что использовать клоковым сигнал с неклокового входа будет грозить тем что модули на этом сигнале в разных частях кристала будут работать с разными задержками, и потому использовать его для 1 модуля в целом безопасно. На самом деле использование не клоковой ножки ничем не грозит, если именно сам автомат SPI разводится нормально. Если он тормозит, то надо на глобальную цепь перекинуть, как уже говорили, через global или bufg. Но вряд ли тормозит именно автомат SPI, это локальная структура и связи короткие. Считаю, что использовать такт SPI безопасно в автомате SPI при одном условии - клок "хороший", без "дребезга". Если нет гарантии - то не годится. Если данные между тактовыми доменами перебрасывать параллельной шиной через регистры, то есть одно условие непропуска данных - данные на передачу должны быть готовы заранее, так, чтобы до прихода первого такта SPI выводимые данные уже были в сдвиговом регистре. А про констрейны - это способ конфигурировать синтезатор и временной анализатор. Скорее даже только второй инструмент. То есть несинхронный дизайн должен анализироваться верно, поэтому констрейны позволяют исключить из анализа пути между несинхронными сигналами. Естественно, цепи междоменной синхронизации должны присутствовать аппаратно.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|