Jump to content
    

Работе по фронтам не клокового входа

Вы всерьез думаете, что по задумке ТС весь дизайн ФПГА тактируется от SPI? :biggrin:

 

Хотел бы я посмотреть комплексный проект, тактируемый только от SPI клока :)

Share this post


Link to post
Share on other sites

Эм... и вот теперь вопрос на миллион:( Как забить констраин между сигналом и выходом?

 

Проблема вот в чем

 

по MAIN_CLK и событию DataRedy защелкивается передаваемое значение в регистр DataOut

 

а по SPI_CLK оно выдавливается наружу

 

естественно нет никакой связи между MAIN_CLK и SPI_CLK, я сам слежу за времянкой в этом месте (SPI клоки не появляются пока данные гарантированно не попадут в регистр, там пауза несколько клоков)

 

Теперь, когда я задаю времянку появления данных после фронта клока SPI в эту времянку входит полный путь от данных до выхода на ружу, а мне надо чтобы учитывалось только от DataOut до выхода, от фронта SPI_CLK. То есть как бы не учитывать время сохранения данных в DataOut, можно это как то в констраине описать? Не руками же вычитать время по логам и смотреть получилось или нет?

 

 

Share this post


Link to post
Share on other sites

если написать констраины на сигналы, время выставления данных относительно этого входа, то в случае их выполнения все будет хорошо? То есть разницы не будет между сигналом с клокового и не клового входов?

 

Правильно ли что сигналы не различимы кроме сложности соблюдения констраинов?

 

Не обязательно. Но есть вероятность.

 

Эм... и вот теперь вопрос на миллион:( Как забить констраин между сигналом и выходом?

 

Проблема вот в чем

 

по MAIN_CLK и событию DataRedy защелкивается передаваемое значение в регистр DataOut

 

а по SPI_CLK оно выдавливается наружу

 

естественно нет никакой связи между MAIN_CLK и SPI_CLK, я сам слежу за времянкой в этом месте (SPI клоки не появляются пока данные гарантированно не попадут в регистр, там пауза несколько клоков)

 

Теперь, когда я задаю времянку появления данных после фронта клока SPI в эту времянку входит полный путь от данных до выхода на ружу, а мне надо чтобы учитывалось только от DataOut до выхода, от фронта SPI_CLK. То есть как бы не учитывать время сохранения данных в DataOut, можно это как то в констраине описать? Не руками же вычитать время по логам и смотреть получилось или нет?

Можно поставить промежуточный регистр на spi-клоке и выдавать данные наружу из него. И времянку от него задать.

Share this post


Link to post
Share on other sites

Не обязательно. Но есть вероятность.

и высока ли вероятность?

 

Можно поставить промежуточный регистр на spi-клоке и выдавать данные наружу из него. И времянку от него задать.

 

ну собственно так и есть. Есть промежуточный регистр, вопрос как такой констраин пишется? я вообще в них не силен, а в таких специфических и подавно.

 

 

Share this post


Link to post
Share on other sites

Волею судеб так получилось что spi клок пришелся на не клоковый вход.

Чем грозит использование его в конструкциях вида

Ничем не грозит, поскольку ни в одном более-менее серьезном проекте никто как тактовый сигнал его использовать не будет. Выделяйте фронт (на внутренней более высокой частоте) и используйте его как "строб".

Share this post


Link to post
Share on other sites

Ничем не грозит, поскольку ни в одном более-менее серьезном проекте никто как тактовый сигнал его использовать не будет. Выделяйте фронт (на внутренней более высокой частоте) и используйте его как "строб".

 

Расскажете как выделить 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

 

может я чего пишу не верно?

 

Share this post


Link to post
Share on other sites

тут вам не констрейн писать надо, и междоменный переход. Например, регистр данных, как и счетчик бит, тактируется клоком SPI, по окончании приема от этого же клока устанавливается признак того, что данное принято, и этот признак через пару синхронизаторов уходит в основной домен. как он дошел до основного домена, точнее его изменение с 0 на 1, данные следует защелкнуть в регистр в основном домене, и отправить их дальше куда следует. Возможно, если планируется непрерывный прием, еще нужен теневой регистр в SPI домене, а то и FIFO.

 

а констрейны - объявить домены асинхронными, и всё. Между ними никаких констрейнов. Констренить только входы данных относительно SPI клока - а это классический SDC-констрейн set_output_delay/set_input_delay

Share this post


Link to post
Share on other sites

вся синхронизация имеется, это понятно и это реализовано...

 

объявить асинхронные домены - это я думаю осилю (хотя если скажете какие буквы жать точно буду рад).

 

теперь нужен последний шаг, объяснить синтезатору за чем важно следить, собственно следить надо вот за чем:

 

по падающему клоку я выставляю данные, а защелкиваются они по восходящему

если 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....

 

как его уговорить то? Или я чего то не то написал?

 

 

 

Share this post


Link to post
Share on other sites

-------------- покрутил еще----------------

вот если написать

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 МГц на выход. Вход вроде бы выходит.

 

Share this post


Link to post
Share on other sites

-------------- покрутил еще----------------

вот если написать

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 дальше...

Share this post


Link to post
Share on other sites

да вот получилось 6.9 до bufg и дальше 1, это slow path

Вы крайне неудачно расположили эту ножку на ПЛИС...

А много на ней сидит? Если влезет на ~1/4 кристалла, то можно попробовать ее как локальный клок прописать/

Edited by Corner

Share this post


Link to post
Share on other sites

это был не я:) у нас разделения труда%)....

 

на этой ноге сидит только 2 сдвиговых регистра SPI

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

 

как сделать такое колдунство как локальный клок? Что-то мне кажется эту ногу вообще не надо тащить на буферы, или без этого в плис не бывает? может вообще все проще написать

 

always @(spi_clk)
begin
   if(spi_clk == 1'b1) //UP

   else //down

end

или так еще хуже?

Share this post


Link to post
Share on other sites

теперь новое устройство и первый SPI решил переписать на прием-передачу, чтобы он одновременно передавал и принимал. И вот тут все сломалось. По какой - то причине то ли передача то ли прием сдвигается на 1 бит, причем в моделсиме все четко, а в железе кирдык. Первый проект разводился в нескольких модификациях и SPI всегда работали без сбоя, а тут на пустом кристалле (пока добавил 4 модуля) ничего не работает...

 

Мне казалось что использовать клоковым сигнал с неклокового входа будет грозить тем что модули на этом сигнале в разных частях кристала будут работать с разными задержками, и потому использовать его для 1 модуля в целом безопасно.

На самом деле использование не клоковой ножки ничем не грозит, если именно сам автомат SPI разводится нормально. Если он тормозит, то надо на глобальную цепь перекинуть, как уже говорили, через global или bufg. Но вряд ли тормозит именно автомат SPI, это локальная структура и связи короткие. Считаю, что использовать такт SPI безопасно в автомате SPI при одном условии - клок "хороший", без "дребезга". Если нет гарантии - то не годится.

 

Если данные между тактовыми доменами перебрасывать параллельной шиной через регистры, то есть одно условие непропуска данных - данные на передачу должны быть готовы заранее, так, чтобы до прихода первого такта SPI выводимые данные уже были в сдвиговом регистре.

 

А про констрейны - это способ конфигурировать синтезатор и временной анализатор. Скорее даже только второй инструмент. То есть несинхронный дизайн должен анализироваться верно, поэтому констрейны позволяют исключить из анализа пути между несинхронными сигналами. Естественно, цепи междоменной синхронизации должны присутствовать аппаратно.

Share this post


Link to post
Share on other sites

тормозит именно SPI

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

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...