реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> последовательный интерфейс, между ПЛИС и МК
skilful
сообщение Sep 11 2012, 09:13
Сообщение #16


Частый гость
**

Группа: Свой
Сообщений: 186
Регистрация: 23-04-06
Из: Сочи
Пользователь №: 16 411



вот чтобы всяких пересинхронизаций не было -- и думал взять двухклоковое фифо.
ПЛИС работает с ним на своей частоте, МК -- на своей.

То что все прерывания асинхронны я понимаю.
Я не понимаю следующего (может быть повторюсь) -- из "фифо чтения" читает МК на малой частоте, а пишет ПЛИС на бОльшей частоте.
Когда ПЛИС запишет на бОльшей частоте сигнал "фифо не пустое" выставится, но он будет привязан к клоку ПЛИС.

Из описания мегафункции Альтеры:

rdempty -- If asserted, indicates that the dcfifo is empty and disables the rdreq port. Synchronized with rdclk

wrempty -- Indicates that the dcfifo is empty. Delayed version of rdempty that is synchronized with wrclk.
Generated from the rdempty signal with a single synchronization register added to synchronize it to the wrclk clock domain.


Насколько я понял Вы предлагаете завести сигнал wrempty на прерывание МК?

Еще я не понимаю про "ресинхронизаторы (2 тригера)". Как с этим работать?

До этого думал что все "разноклоковые процессы" синхронизируются в двухклоковых фифо или же через PLL

Go to the top of the page
 
+Quote Post
troiden
сообщение Sep 11 2012, 09:40
Сообщение #17


Частый гость
**

Группа: Свой
Сообщений: 108
Регистрация: 19-02-09
Из: Москва
Пользователь №: 45 069



Цитата(Torpeda @ Sep 11 2012, 13:12) *
Вот это как-то не очень понятно. О каких 40 тактах речь?
даём команду записи. Последний бит приходит на 40-м клоке. Где есчё 40 беруться для интерпретации?

Или вы предлагаете передавать фрейм из 40 бит + есчё дофига тактов клока на его интерпретацию?

Чуть подумав, 40 тактов превратилось в 16 - в случае, если за командой записи следует команда чтения.
Утрированно - пришла первая команда, на выходе контроллера выставились адрес, данные, признак операции и признак приема команды. Первые три будут там неизменны до окончания следующей команды записи либо до прихода адреса для чтения. А для этого надо как минимум 16 тактов. И да, дополнительные такты там есть sm.gif 3 байта данных - это 8 dummy + 16 бит данных. Сделано из-за чтения, для того чтобы можно было успеть пересинхронизироваться.

Цитата(Torpeda @ Sep 11 2012, 13:12) *
2) Правда на 100 МГц хана наступает и в вашем случае - при задани коректных STA констрейнов....

Зависит от кристалла. Шестой спартан 100 МГц примет без вопросов.

Цитата(Torpeda @ Sep 11 2012, 13:12) *
Да и связать асинхронные клок домены (SPI - остальная часть ПЛИС) тоже непросто.....

Отнюдь. См выше - у нас минимум 16 тактов стабильных данных. На внутреннюю частоту пересинхривается только признак приема команды, из него формируется импульс в один такт внутренней частоты, от которого и срабатывает дальнейшая логика.
Go to the top of the page
 
+Quote Post
skilful
сообщение Sep 11 2012, 10:05
Сообщение #18


Частый гость
**

Группа: Свой
Сообщений: 186
Регистрация: 23-04-06
Из: Сочи
Пользователь №: 16 411



Просимулировал в МоделСиме двухклоковую фифо (LPM_FIFO_DC)

Подал только клок записи. В процессе записи изменяется только wrempty. rdempty молчит.

Подал один и тот же клок на клоки чтения и записи. Сигнал wrempty изменяется при первой же записи.
Сигнал rdempty изменяется аж после 7 такта.

Значит пауза после получения прерывания все-таки нужна, если использовать двухклоковое фифо?

P.S. Примерно такой же декодер команд у меня и реализован:
1) адрес, бит записи/чтения -- 1 байт
2) дальше данные, которые игнорируются в случае чтения.


Go to the top of the page
 
+Quote Post
Torpeda
сообщение Sep 11 2012, 11:47
Сообщение #19


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 23-02-12
Пользователь №: 70 424



Цитата(skilful @ Sep 11 2012, 12:13) *
вот чтобы всяких пересинхронизаций не было -- и думал взять двухклоковое фифо.
ПЛИС работает с ним на своей частоте, МК -- на своей.

Еще я не понимаю про "ресинхронизаторы (2 тригера)". Как с этим работать?
До этого думал что все "разноклоковые процессы" синхронизируются в двухклоковых фифо или же через PLL

1) двухклоковых фифо, PLL и ресинхронизаторы - это способы как связать асинхронные клок домены.
2) ресинхронизаторы убирают метастабильность. Гдето тут была ветка про метастабильность и способы её подавления - стоит почитать.
В т.ч. и при помощи ФИФО.
http://electronix.ru/forum/index.php?showtopic=93650
3) Что вы будуте делать с ФИФО когда адрес чтения совпадёт с адресом записи?


Цитата(skilful @ Sep 11 2012, 12:13) *
То что все прерывания асинхронны я понимаю.
Я не понимаю следующего (может быть повторюсь) -- из "фифо чтения" читает МК на малой частоте, а пишет ПЛИС на бОльшей частоте.
Когда ПЛИС запишет на бОльшей частоте сигнал "фифо не пустое" выставится, но он будет привязан к клоку ПЛИС.

Это не проблема. МК привяжет асинхронное прерывание к своему клоку.

Цитата(skilful @ Sep 11 2012, 12:13) *
Из описания мегафункции Альтеры:
rdempty -- If asserted, indicates that the dcfifo is empty and disables the rdreq port. Synchronized with rdclk
wrempty -- Indicates that the dcfifo is empty. Delayed version of rdempty that is synchronized with wrclk.
Generated from the rdempty signal with a single synchronization register added to synchronize it to the wrclk clock domain.
Насколько я понял Вы предлагаете завести сигнал wrempty на прерывание МК?

http://electronix.ru/redirect.php?http://w...8Boston_CDC.pdf
Читать п.5.8.2 - Ваш случай.

Цитата(skilful @ Sep 11 2012, 13:05) *
Подал один и тот же клок на клоки чтения и записи. Сигнал wrempty изменяется при первой же записи.
Сигнал rdempty изменяется аж после 7 такта.
Значит пауза после получения прерывания все-таки нужна, если использовать двухклоковое фифо?

похоже тут не тупая задержка нужна, а надо 7 раз клок чтения передёрнуть, чтобы rdempty получить....

-----
Не тратьте время - выкинте все ФИФО, привяжите SPI к клоку ПЛИС и спокойно работайте.

================================================================================

Цитата(troiden @ Sep 11 2012, 12:40) *
Чуть подумав, 40 тактов превратилось в 16 - в случае, если за командой записи следует команда чтения.

Т.е. в вашем случае - конвеер. Чтобы прочитать данные надо выдать команду чтения, а потом какую-то другую, чтобы забрать данные.
Ну для вычетки массива - вариант, а для роботы с одиночными командами - только затраты на 2-е повторение.... Не всегда гут.
Может лутше SPI.CLK в 2 раза понизить?

Цитата(troiden @ Sep 11 2012, 12:40) *
Зависит от кристалла. Шестой спартан 100 МГц примет без вопросов.

100МГц на SPI.CLK означает что у вас есть полтакта (5нс) на все задержки распространения сигнала от [МК -to -FPGA.PAD- to - внутренний флоп FPGA ]....
Какая величина задержки на плате (при дорожке 10см напр)?
Какое минимальное её значение, а какое максимальное (это критично для сетап-холд таймингов)?
Какой реальный розбросс задержек на плате (skew)?
Какое сетап\холд требование для MISO на МК?

Цитата(troiden @ Sep 11 2012, 12:40) *
Отнюдь. См выше - у нас минимум 16 тактов стабильных данных. На внутреннюю частоту пересинхривается только признак приема команды, из него формируется импульс в один такт внутренней частоты, от которого и срабатывает дальнейшая логика.

А что если внутренняя частота меньше SPI.CLK? Хватит на ресинхронизацию и на обработку команды?
----------
Ну это на засыпку... sm.gif А ваше решение с конвеером в принципе хорошее. Но лутше всётаки отработать за одну команду команду.
Go to the top of the page
 
+Quote Post
skilful
сообщение Sep 11 2012, 12:28
Сообщение #20


Частый гость
**

Группа: Свой
Сообщений: 186
Регистрация: 23-04-06
Из: Сочи
Пользователь №: 16 411



Цитата(Torpeda @ Sep 11 2012, 14:47) *
1) двухклоковых фифо, PLL и ресинхронизаторы - это способы как связать асинхронные клок домены.
2) ресинхронизаторы убирают метастабильность. Гдето тут была ветка про метастабильность и способы её подавления - стоит почитать.
В т.ч. и при помощи ФИФО.
http://electronix.ru/forum/index.php?showtopic=93650
3) Что вы будуте делать с ФИФО когда адрес чтения совпадёт с адресом записи?



Это не проблема. МК привяжет асинхронное прерывание к своему клоку.


http://electronix.ru/redirect.php?http://w...8Boston_CDC.pdf
Читать п.5.8.2 - Ваш случай.


похоже тут не тупая задержка нужна, а надо 7 раз клок чтения передёрнуть, чтобы rdempty получить....

-----
Не тратьте время - выкинте все ФИФО, привяжите SPI к клоку ПЛИС и спокойно работайте.

================================================================================


Т.е. в вашем случае - конвеер. Чтобы прочитать данные надо выдать команду чтения, а потом какую-то другую, чтобы забрать данные.
Ну для вычетки массива - вариант, а для роботы с одиночными командами - только затраты на 2-е повторение.... Не всегда гут.
Может лутше SPI.CLK в 2 раза понизить?


100МГц на SPI.CLK означает что у вас есть полтакта (5нс) на все задержки распространения сигнала от [МК -to -FPGA.PAD- to - внутренний флоп FPGA ]....
Какая величина задержки на плате (при дорожке 10см напр)?
Какое минимальное её значение, а какое максимальное (это критично для сетап-холд таймингов)?
Какой реальный розбросс задержек на плате (skew)?
Какое сетап\холд требование для MISO на МК?


А что если внутренняя частота меньше SPI.CLK? Хватит на ресинхронизацию и на обработку команды?
----------
Ну это на засыпку... sm.gif А ваше решение с конвеером в принципе хорошее. Но лутше всётаки отработать за одну команду команду.


вот примерная схемка, которую думал сделать


Прикрепленное изображение
Go to the top of the page
 
+Quote Post
troiden
сообщение Sep 11 2012, 12:41
Сообщение #21


Частый гость
**

Группа: Свой
Сообщений: 108
Регистрация: 19-02-09
Из: Москва
Пользователь №: 45 069



Цитата(Torpeda @ Sep 11 2012, 15:47) *
Т.е. в вашем случае - конвеер. Чтобы прочитать данные надо выдать команду чтения, а потом какую-то другую, чтобы забрать данные.

Не совсем. И для чтения, и для записи применяется одна команда. Именно чтобы не надо было повторять запрос введены промежуточные 8 бит - за это время успевает прощелкать и пересинхронизатор, и внутренний мультиплексор в ПЛИСовой части, который выставляет на шину данных SPI-контроллера значение нужного регистра. Для аналогии - фактически как чтение данных из любой конфигурационной флешки с SPI-интерфейсом, только там промежуточных бит нету sm.gif

Цитата(Torpeda @ Sep 11 2012, 15:47) *
100МГц на SPI.CLK означает что у вас есть полтакта (5нс) на все задержки распространения сигнала от [МК -to -FPGA.PAD- to - внутренний флоп FPGA ]....
Какая величина задержки на плате (при дорожке 10см напр)?
Какое минимальное её значение, а какое максимальное (это критично для сетап-холд таймингов)?
Какой реальный розбросс задержек на плате (skew)?
Какое сетап\холд требование для MISO на МК?

В случае записи данных в ПЛИС значение имеет только skew, оно вряд ли будет такое уж большое при адекватной разводке. В случае чтения - да, есть подводные камни. Однако и это решаемо с некоторыми изменениями дизайна. Никто же не мешает выдавать прочитанные данные на полтакта-такт SPI.CLK раньше, если мы точно знаем, что неустранимые задержки типа длинны трассы имеют вполне определенные большие значения. Тут есть поле для маневра, была бы потребность.

Цитата(Torpeda @ Sep 11 2012, 15:47) *
А что если внутренняя частота меньше SPI.CLK? Хватит на ресинхронизацию и на обработку команды?

Надо считать, если что - умножать тактовую ПЛИСа до нужных значений. Однако это в любом случае лучше трех-четырехкратного превышения частоты SPI.CLK для нормальной работы пересинхронизации на входе.

Цитата(skilful @ Sep 11 2012, 16:28) *
вот примерная схемка, которую думал сделать


Прикрепленное изображение

Когда будете так делать, досконально продумайте алгоритм чтения данных. Чтобы быть уверенным, что читаете то что нужно а не то что пришло когда-то раньше.
Go to the top of the page
 
+Quote Post
Torpeda
сообщение Sep 11 2012, 13:41
Сообщение #22


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 23-02-12
Пользователь №: 70 424



Цитата(troiden @ Sep 11 2012, 15:41) *
В случае записи данных в ПЛИС значение имеет только skew, оно вряд ли будет такое уж большое при адекватной разводке. В случае чтения - да, есть подводные камни. Однако и это решаемо с некоторыми изменениями дизайна. Никто же не мешает выдавать прочитанные данные на полтакта-такт SPI.CLK раньше, если мы точно знаем, что неустранимые задержки типа длинны трассы имеют вполне определенные большие значения. Тут есть поле для маневра, была бы потребность.

1) "если мы точно знаем," - в этом-то и дело. Как-бы их узнать.....
2) Как гарантировать стабильность задержки, тем более если она как вы сказали пару тактов?
Вы вообще когда нибудь прощитывали эти величины и их розбросс для разных материалов платы?

3) Выдавать раньше на пару тактов можна (введя пустые биты между адресом и данными), но кто сказал что задержка на плате как-то кратна тактовой частоте SPI.CLK?
что, длинной провода MISO будете данные относительно клока подстраивать на стороне МК?
Это как-то не хорошо... Розводчик шипко ругаться будет однако.... Да и тулзы для росчёта таких задержек надо где-то взять....

Цитата(skilful @ Sep 11 2012, 15:28) *
вот примерная схемка, которую думал сделать

1) Как эта схемка исключает чтение из адреса ФИФО в который идёт одновременно запись?
По-моему - никак. Прочтётся мусор.
2) при полном асинхронизме клоков записи и чтения, данные перепутаються (вы думаете что читаете текущее, а реально это предыдущее напр.).
Go to the top of the page
 
+Quote Post
skilful
сообщение Sep 11 2012, 13:52
Сообщение #23


Частый гость
**

Группа: Свой
Сообщений: 186
Регистрация: 23-04-06
Из: Сочи
Пользователь №: 16 411



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


помогите разобраться с этим кодом
из http://electronix.ru/forum/index.php?showtopic=93650




посмотрите как по ссылке сделан SPI .

http://www.fpga4fun.com/SPI2.html

Вот в этом блоке привязывают внешний клок spi к внутренним клокам плис
------------------------------------------------------------------------------------------------------------------------------
We sample/synchronize the SPI signals (SCK, SSEL and MOSI) using the FPGA clock and shift registers.

// sync SCK to the FPGA clock using a 3-bits shift register
reg [2:0] SCKr; always @(posedge clk) SCKr <= {SCKr[1:0], SCK};
wire SCK_risingedge = (SCKr[2:1]==2'b01); // now we can detect SCK rising edges
wire SCK_fallingedge = (SCKr[2:1]==2'b10); // and falling edges

// same thing for SSEL
reg [2:0] SSELr; always @(posedge clk) SSELr <= {SSELr[1:0], SSEL};
wire SSEL_active = ~SSELr[1]; // SSEL is active low
wire SSEL_startmessage = (SSELr[2:1]==2'b10); // message starts at falling edge
wire SSEL_endmessage = (SSELr[2:1]==2'b01); // message stops at rising edge

// and for MOSI
reg [1:0] MOSIr; always @(posedge clk) MOSIr <= {MOSIr[0], MOSI};
wire MOSI_data = MOSIr[1];


Что тут происходит?
Go to the top of the page
 
+Quote Post
Alexey K
сообщение Sep 11 2012, 14:00
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 14-07-11
Пользователь №: 66 220



Вопрос.
Зачем один и тот же регистр делать доступным для записи как со стороны МК так и со стороны ПЛИС?
Go to the top of the page
 
+Quote Post
troiden
сообщение Sep 11 2012, 14:13
Сообщение #25


Частый гость
**

Группа: Свой
Сообщений: 108
Регистрация: 19-02-09
Из: Москва
Пользователь №: 45 069



Цитата(Torpeda @ Sep 11 2012, 17:41) *
1) "если мы точно знаем," - в этом-то и дело. Как-бы их узнать.....
2) Как гарантировать стабильность задержки, тем более если она как вы сказали пару тактов?
Вы вообще когда нибудь прощитывали эти величины и их розбросс для разных материалов платы?

А эти вопросы скорее к разработчику платы, а не к программисту стоящего на плате ПЛИСа sm.gif Неужели программы-трассировщики не поддерживают расчет задержек в линиях? Даже примерно, до наносекунд?

Цитата(Torpeda @ Sep 11 2012, 17:41) *
3) Выдавать раньше на пару тактов можна (введя пустые биты между адресом и данными), но кто сказал что задержка на плате как-то кратна тактовой частоте SPI.CLK?

Точная кратность и не обязательна. Важно в Setup-hold попасть. Можно пойти дальше, поставить на MISO программируемую задержку в ПЛИСе sm.gif Получится своя маленькая аналогия калибровки DDR.

Цитата(Torpeda @ Sep 11 2012, 17:41) *
что, длинной провода MISO будете данные относительно клока подстраивать на стороне МК?

Боже упаси от подобных извращений sm.gif

В любом случае, всё это из разряда теории, надо всегда понимать применимость решений. Хочешь SPI на высоких частотах - будь добр ставь источник и получатель на вменяемых расстояниях. Если не получается - значит стоит задуматься над каким-нибудь другим интерфейсом, а не городить костыли к заранее неправильно спроектированному устройству.
Go to the top of the page
 
+Quote Post
skilful
сообщение Sep 11 2012, 14:14
Сообщение #26


Частый гость
**

Группа: Свой
Сообщений: 186
Регистрация: 23-04-06
Из: Сочи
Пользователь №: 16 411



там я выше приводил пример -- если он в роли таймера и нужна предустановка, чтение
Go to the top of the page
 
+Quote Post
troiden
сообщение Sep 11 2012, 14:17
Сообщение #27


Частый гость
**

Группа: Свой
Сообщений: 108
Регистрация: 19-02-09
Из: Москва
Пользователь №: 45 069



Цитата(skilful @ Sep 11 2012, 18:14) *
там я выше приводил пример -- если он в роли таймера и нужна предустановка, чтение

Один регистр, на запись - предустановка
Один регистр, на чтение - текущее значение
А сам таймер - третий регистр, отдельно от этих двух. Так по-моему будет красивее.
Go to the top of the page
 
+Quote Post
Torpeda
сообщение Sep 11 2012, 14:33
Сообщение #28


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 23-02-12
Пользователь №: 70 424



Цитата(skilful @ Sep 11 2012, 16:52) *
исключаться должно программно. МК набил фифо записи как командами чтения, так и записи, например. А потом ждет ответа от фифо чтения.
в сигналы от фифо чтения все сильно и уперлось -- теперь пытаюсь понять Ваш метод с синхронизацией.

"МК набил фифо записи как командами чтения, так и записи, ..." - а ПЛИС при этом чё с этим ФИФО делает?
Ждёт его заполнения? По какому событию определяет заполнение?
Или ПЛИС одновременно его и читает (судя по схеме)? А что если перехлеснётся ПЛИС с МК?


Цитата(skilful @ Sep 11 2012, 16:52) *
Вот в этом блоке привязывают внешний клок spi к внутренним клокам плис
------------------------------------------------------------------------------------------------------------------------------
We sample/synchronize the SPI signals (SCK, SSEL and MOSI) using the FPGA clock and shift registers.
Что тут происходит?

так тут-же и написано: SCK, SSEL and MOSI пропускается через 2-х битовый shift registers.
Это и есть тот самый синхронизатор на 2-х тригерах, о котором я и говорил вначале.
Go to the top of the page
 
+Quote Post
skilful
сообщение Sep 11 2012, 14:42
Сообщение #29


Частый гость
**

Группа: Свой
Сообщений: 186
Регистрация: 23-04-06
Из: Сочи
Пользователь №: 16 411



Так я смотрю триггера 3 ?

// sync SCK to the FPGA clock using a 3-bits shift register

SCKr <= {SCKr[1:0], SCK};

Здесь происходит защелкивание SCK ?

wire SCK_risingedge = (SCKr[2:1]==2'b01); // now we can detect SCK rising edges
а тут на втором такте анализируется состояние сдвигового регистра. Если разряды 2,1 равны "01", то SCK_risingedge = True ?


Go to the top of the page
 
+Quote Post
Torpeda
сообщение Sep 11 2012, 14:49
Сообщение #30


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 23-02-12
Пользователь №: 70 424



Цитата(troiden @ Sep 11 2012, 17:13) *
А эти вопросы скорее к разработчику платы, а не к программисту стоящего на плате ПЛИСа sm.gif

нуда, ненадо учитывать ограничения PCB дизайнера - пусть крутиться как хочет потом.....
Цитата(troiden @ Sep 11 2012, 17:13) *
В любом случае, всё это из разряда теории, надо всегда понимать применимость решений.

Одно скажу точно, если вы пытаетесь построить корректно работающий SPI на высоких частотах, и у вас нет STA тайминг констрейна (SDC) со значением мин\макс внешних задержек - работать будет не всегда....
Это станет понятно, когда россчитать эти самые задержки и их возможный технологический розбросс, к чему я вас и пытаюсь подвести.
Даже при 10нс SPI.CLK это уже не так просто.


Цитата(skilful @ Sep 11 2012, 17:42) *
Так я смотрю триггера 3 ?

// sync SCK to the FPGA clock using a 3-bits shift register

SCKr <= {SCKr[1:0], SCK};

Здесь происходит защелкивание SCK ?

wire SCK_risingedge = (SCKr[2:1]==2'b01); // now we can detect SCK rising edges
а тут на втором такте анализируется состояние сдвигового регистра. Если разряды 2,1 равны "01", то SCK_risingedge = True ?

Это + детектор фронта.
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 01:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01523 секунд с 7
ELECTRONIX ©2004-2016