LV26 0 January 4, 2014 Posted January 4, 2014 · Report post Вы всерьез думаете, что по задумке ТС весь дизайн ФПГА тактируется от SPI? Хотел бы я посмотреть комплексный проект, тактируемый только от SPI клока :) Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 January 4, 2014 Posted January 4, 2014 · Report post Эм... и вот теперь вопрос на миллион:( Как забить констраин между сигналом и выходом? Проблема вот в чем по MAIN_CLK и событию DataRedy защелкивается передаваемое значение в регистр DataOut а по SPI_CLK оно выдавливается наружу естественно нет никакой связи между MAIN_CLK и SPI_CLK, я сам слежу за времянкой в этом месте (SPI клоки не появляются пока данные гарантированно не попадут в регистр, там пауза несколько клоков) Теперь, когда я задаю времянку появления данных после фронта клока SPI в эту времянку входит полный путь от данных до выхода на ружу, а мне надо чтобы учитывалось только от DataOut до выхода, от фронта SPI_CLK. То есть как бы не учитывать время сохранения данных в DataOut, можно это как то в констраине описать? Не руками же вычитать время по логам и смотреть получилось или нет? Quote Share this post Link to post Share on other sites More sharing options...
o_khavin 0 January 4, 2014 Posted January 4, 2014 · Report post если написать констраины на сигналы, время выставления данных относительно этого входа, то в случае их выполнения все будет хорошо? То есть разницы не будет между сигналом с клокового и не клового входов? Правильно ли что сигналы не различимы кроме сложности соблюдения констраинов? Не обязательно. Но есть вероятность. Эм... и вот теперь вопрос на миллион:( Как забить констраин между сигналом и выходом? Проблема вот в чем по MAIN_CLK и событию DataRedy защелкивается передаваемое значение в регистр DataOut а по SPI_CLK оно выдавливается наружу естественно нет никакой связи между MAIN_CLK и SPI_CLK, я сам слежу за времянкой в этом месте (SPI клоки не появляются пока данные гарантированно не попадут в регистр, там пауза несколько клоков) Теперь, когда я задаю времянку появления данных после фронта клока SPI в эту времянку входит полный путь от данных до выхода на ружу, а мне надо чтобы учитывалось только от DataOut до выхода, от фронта SPI_CLK. То есть как бы не учитывать время сохранения данных в DataOut, можно это как то в констраине описать? Не руками же вычитать время по логам и смотреть получилось или нет? Можно поставить промежуточный регистр на spi-клоке и выдавать данные наружу из него. И времянку от него задать. Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 January 4, 2014 Posted January 4, 2014 · Report post Не обязательно. Но есть вероятность. и высока ли вероятность? Можно поставить промежуточный регистр на spi-клоке и выдавать данные наружу из него. И времянку от него задать. ну собственно так и есть. Есть промежуточный регистр, вопрос как такой констраин пишется? я вообще в них не силен, а в таких специфических и подавно. Quote Share this post Link to post Share on other sites More sharing options...
Джеймс 5 January 4, 2014 Posted January 4, 2014 · Report post Волею судеб так получилось что spi клок пришелся на не клоковый вход. Чем грозит использование его в конструкциях вида Ничем не грозит, поскольку ни в одном более-менее серьезном проекте никто как тактовый сигнал его использовать не будет. Выделяйте фронт (на внутренней более высокой частоте) и используйте его как "строб". Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 January 4, 2014 Posted January 4, 2014 · Report post Ничем не грозит, поскольку ни в одном более-менее серьезном проекте никто как тактовый сигнал его использовать не будет. Выделяйте фронт (на внутренней более высокой частоте) и используйте его как "строб". Расскажете как выделить 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 может я чего пишу не верно? Quote Share this post Link to post Share on other sites More sharing options...
SM 15 January 4, 2014 Posted January 4, 2014 · Report post тут вам не констрейн писать надо, и междоменный переход. Например, регистр данных, как и счетчик бит, тактируется клоком SPI, по окончании приема от этого же клока устанавливается признак того, что данное принято, и этот признак через пару синхронизаторов уходит в основной домен. как он дошел до основного домена, точнее его изменение с 0 на 1, данные следует защелкнуть в регистр в основном домене, и отправить их дальше куда следует. Возможно, если планируется непрерывный прием, еще нужен теневой регистр в SPI домене, а то и FIFO. а констрейны - объявить домены асинхронными, и всё. Между ними никаких констрейнов. Констренить только входы данных относительно SPI клока - а это классический SDC-констрейн set_output_delay/set_input_delay Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 January 4, 2014 Posted January 4, 2014 · Report post вся синхронизация имеется, это понятно и это реализовано... объявить асинхронные домены - это я думаю осилю (хотя если скажете какие буквы жать точно буду рад). теперь нужен последний шаг, объяснить синтезатору за чем важно следить, собственно следить надо вот за чем: по падающему клоку я выставляю данные, а защелкиваются они по восходящему если 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.... как его уговорить то? Или я чего то не то написал? Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 January 5, 2014 Posted January 5, 2014 · Report post -------------- покрутил еще---------------- вот если написать TIMESPEC TS_mem_spi_clk = PERIOD "mem_spi_clk" 10 ns HIGH 50%; FFSET = OUT 8 ns AFTER "mem_spi_clk" FALLING; то констраин опять не выполняется и опять говорит что ему надо 12 nSec это медленный путь, быстрый укладывается в 4 nSec вроде как.. медленный - это я так понимаю с запасиками в самых плохих температурных условиях? причем в медленном пути около 7 nSec отжирает путь клока, ох ох ох, не заводите клоки на не клоковые входы... Наверное получается не добиться мне от этой системы 50 МГц на выход. Вход вроде бы выходит. Quote Share this post Link to post Share on other sites More sharing options...
Corner 0 January 5, 2014 Posted January 5, 2014 · Report post -------------- покрутил еще---------------- вот если написать TIMESPEC TS_mem_spi_clk = PERIOD "mem_spi_clk" 10 ns HIGH 50%; FFSET = OUT 8 ns AFTER "mem_spi_clk" FALLING; то констраин опять не выполняется и опять говорит что ему надо 12 nSec это медленный путь, быстрый укладывается в 4 nSec вроде как.. медленный - это я так понимаю с запасиками в самых плохих температурных условиях? причем в медленном пути около 7 nSec отжирает путь клока, ох ох ох, не заводите клоки на не клоковые входы... Наверное получается не добиться мне от этой системы 50 МГц на выход. Вход вроде бы выходит. Если это ксайлинкс, то сажайте на bufg и не парьтесь. Будет 2... 3 нс до bufg и практически 0 дальше... Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 January 5, 2014 Posted January 5, 2014 · Report post да вот получилось 6.9 до bufg и дальше 1, это slow path Quote Share this post Link to post Share on other sites More sharing options...
Corner 0 January 5, 2014 Posted January 5, 2014 (edited) · Report post да вот получилось 6.9 до bufg и дальше 1, это slow path Вы крайне неудачно расположили эту ножку на ПЛИС... А много на ней сидит? Если влезет на ~1/4 кристалла, то можно попробовать ее как локальный клок прописать/ Edited January 5, 2014 by Corner Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 January 5, 2014 Posted January 5, 2014 · Report post это был не я:) у нас разделения труда%).... на этой ноге сидит только 2 сдвиговых регистра SPI приемный и передающий. Причем они полностью изолированны от всего остального по времени, все данные для них могут быть готовы за много клоков до, и считаться через достаточно клоков после. как сделать такое колдунство как локальный клок? Что-то мне кажется эту ногу вообще не надо тащить на буферы, или без этого в плис не бывает? может вообще все проще написать always @(spi_clk) begin if(spi_clk == 1'b1) //UP else //down end или так еще хуже? Quote Share this post Link to post Share on other sites More sharing options...
Tiro 0 January 5, 2014 Posted January 5, 2014 · Report post теперь новое устройство и первый SPI решил переписать на прием-передачу, чтобы он одновременно передавал и принимал. И вот тут все сломалось. По какой - то причине то ли передача то ли прием сдвигается на 1 бит, причем в моделсиме все четко, а в железе кирдык. Первый проект разводился в нескольких модификациях и SPI всегда работали без сбоя, а тут на пустом кристалле (пока добавил 4 модуля) ничего не работает... Мне казалось что использовать клоковым сигнал с неклокового входа будет грозить тем что модули на этом сигнале в разных частях кристала будут работать с разными задержками, и потому использовать его для 1 модуля в целом безопасно. На самом деле использование не клоковой ножки ничем не грозит, если именно сам автомат SPI разводится нормально. Если он тормозит, то надо на глобальную цепь перекинуть, как уже говорили, через global или bufg. Но вряд ли тормозит именно автомат SPI, это локальная структура и связи короткие. Считаю, что использовать такт SPI безопасно в автомате SPI при одном условии - клок "хороший", без "дребезга". Если нет гарантии - то не годится. Если данные между тактовыми доменами перебрасывать параллельной шиной через регистры, то есть одно условие непропуска данных - данные на передачу должны быть готовы заранее, так, чтобы до прихода первого такта SPI выводимые данные уже были в сдвиговом регистре. А про констрейны - это способ конфигурировать синтезатор и временной анализатор. Скорее даже только второй инструмент. То есть несинхронный дизайн должен анализироваться верно, поэтому констрейны позволяют исключить из анализа пути между несинхронными сигналами. Естественно, цепи междоменной синхронизации должны присутствовать аппаратно. Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 January 5, 2014 Posted January 5, 2014 · Report post тормозит именно SPI в частности из готового сдвигового регистра не получается вовремя доставить данные на выход, по падающему фронту регистр сдвигается, а к следующему поднимающемуся данные должны уже стоять, а так не выходит, не хватает 2-3 нСек... Quote Share this post Link to post Share on other sites More sharing options...