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

 
 
> И снова этот PCI, помогите разобраться
T00T
сообщение Jun 1 2015, 12:29
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 25-05-15
Пользователь №: 86 867



Доброго времени суток форумчане. Появилась идея создать устройство на PCI.
В плис я скажем новичок, но всю свою сознательную жизнь программировал на АСМе(Z80 avr),на AHDL gпару проектов делал, ну и Си немного касался.

Так что если глупые вопросы буду задавать не обессудьте.
Итак: Нужно сотворить TARGET устройство на PCI шине, у которого пусть будет 32x32bit слова памяти отображаемых в МЕМ области.

Я спаял железку на плисине XC6SLX9.
Ну на сколько понял написал проект для неё.
Результаты таковы:
Я взял материнку старую(Пень 3) для испытаний и начал отладку на ней. В итоге биос видит устройство, прописывает BAR в общем на первый взгляд все ок.


Проблеммы:
железка работает только на этой плате старой, и чем новее мать - тем хуже работает. На (пеньке-4) биос запускается и пишет BIOS ROM cheksum error
...............System halt.(Успевает пройти 7 транзакций с платой!!!!!)
И всё, а CORE 2 DUO просто весит.
И ещё один косячёк замечен.
На старой плате запускаю Linux - lspci отображает устройство, но когда LSPCI -X читаешь конфигурационную область - выдает что в 00 регистре FFFFFFFF.
А остальное всё считывает нормально.
Я смотрел этот вопрос и Запроса в этот адрес просто нет!!!!!! Или плата его в упор не видит!!!!

В чём может быть проблема с отказом работы на новых матерях. Ведь стандарт он и есть стандарт - должен работать везде. С появлением новых версий стандарта сигналы по другому выставляться не могут !!!!!
Может какая то странная материнка??????

Но ведь на новой, успевает пройти 7 транзакций с платой - зависаний на них нет - значит всё ок. с сигналами.
Опешу что реализовано, а что не делал:
плата отвечает только на команды R/W configure и R/W memory. На другие просто не отвечает.
Не анализируется C/ВЕ в фазе данных, а при чтении в фозе данных выдаю 0000.
паритет выставляется.
Stop не подключен.
REQ, GNT не подключены.



Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 15)
gerber
сообщение Jun 1 2015, 15:45
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



1) Возможно, на новых "матерях" PCI 66 МГц, а не 33 Мгц. Проверьте осциллом.
2) Самое вероятное - неправильно заданы (или совсем не заданы) констрейны, или не выдержана длина PCI CLK на плате, это важный момент (длина линии клока на периферийной плате 2.5 дюйма, и она должна быть длиннее всех линий AD), посмотрите спецификацию PCI. На новых платах могут оказаться более сильные буфера на PCI, соответственно, требования к плате выше и т. п.
3) Некоторые новые "матери" вообще не имеют слотов PCI, убедитесь, что он есть, перед тем как втыкать плату. biggrin.gif
4) Некоторые новые "матери" начинают очень рано опрашивать PCI устройства, поэтому нужно быть уверенным, что FPGA успевает прогрузить битстрим и подняться до того, как мат. плата снимает RESET# и начинает конфиг-циклы.


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
T00T
сообщение Jun 1 2015, 16:27
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 25-05-15
Пользователь №: 86 867



ну вот что бы некоторые вопросы сразу отпадали такая ремарка:
В проект я вставил такую конструкцию:

reg[2:0] chenge_byte=2'b000;
always @(posedge del_sig)
if (!key_79) chenge_byte <= 3'b000;
else
if (!push_ka & (chenge_byte != 3'b111)) chenge_byte <= chenge_byte + 1;

assign led1 = akk_sost[0+(8*chenge_byte)] ;
assign led2 = akk_sost[1+(8*chenge_byte)] ;
assign led5 = akk_sost[2+(8*chenge_byte)] ;
assign led6 = akk_sost[3+(8*chenge_byte)] ;
assign led7 = akk_sost[4+(8*chenge_byte)] ;
assign led8 = akk_sost[5+(8*chenge_byte)] ;
assign led9 = akk_sost[6+(8*chenge_byte)] ;
assign led10 = akk_sost[7+(8*chenge_byte)] ;


parameter Notsch = 64;

reg[Notsch-1:0] akk_sost=0;
integer count_tackt=0;
always @(posedge clk or negedge Rst)
if (~Rst | ~key_78)
begin
akk_sost <= 0;
count_tackt <= 0;
end
else
if ((count_tackt < Notsch) & (tar_dev_acc | dev_oe))
begin
akk_sost[count_tackt] <= sign_23;
count_tackt <= count_tackt +1;
end
Итак на плате есть 8 светодиодов
del_sig - частота около герца
push_ka - это кнопка по которой переключаю байты отображения
sign_23 - сигнал на входе 23 - типа анализатора нулей и единиц
tar_dev_acc - сигнал начала транзакции на текущем устройстве
dev_oe - сигнал УСТРОЙСТВО выбрано.

Ну короче, если начинается транзакция или устройство выбрано то на каждом переднем фронте клока записываем сигнал на входе 23 в регистр, всего 64 выборки...
Если бы проблема была с клоком, то этот анализатор подключён к этому же клоку, и видны были бы ну хотя бы несостыковки , или каждый запуск был по разному(ну картина не стабильная была бы).

Посмотрел эти 7 транзакций. всё вроде в порядке!!!! Все 7 раз устройство отвечает на команды чтения конфигурационного пространства
Запросы такие - 1запрос (первый байт адресса в 16-чном) 00
2 запрос 00
3 запрос 08
4 запрос 08
5 0С
6 08
7 0С
И на этом обращения заканчиваются!!!!!!!!!!!!!!!!!!!
Биос виснет.

Я вот читал про тайминги 11nc, 7nc в них может быть, а то я вообще с этим ничего не делал!!!!

Цитата(gerber @ Jun 1 2015, 19:45) *
2) Самое вероятное - неправильно заданы (или совсем не заданы) констрейны



И вот это можно по подробнее????
Go to the top of the page
 
+Quote Post
T00T
сообщение Jun 1 2015, 17:40
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 25-05-15
Пользователь №: 86 867



и вот ещё что ну ладно после 7 - го запроса зависало бы устройство или шина не уходила в IDLE, но нет всё вроде нормально Frame=1, Irdi=1 после запроса.
Почему тогда биос виснет???????
Go to the top of the page
 
+Quote Post
T00T
сообщение Jun 1 2015, 20:08
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 25-05-15
Пользователь №: 86 867



На более свежих вообще устройство не видит обращений!!
Так что картина похожа на всякого рода задержки во времени типа не успевает захватить сигналы.(Наверно).
Так же как линукс на рабочей плате не опрашивает 00 регистр.
Хотя настораживает вопрос, почему именно первый и всегда именно он!!!!!!!!!!!!
Хотя биос читает его??
пока писал придумал сам ответ на этот вопрос - анализируя запросы можно сказать что к 00 адресу биос обращается несколько раз подряд, и не факт что он читает этот регистр в первой посылке, может это уже вторая по счёту посылка, а устройство видит её как первую.
ну тогда всё встаёт на свои места.

А современные биосы могут запрашивать допустим 1 раз и как раз пропуск!! - типа устройства нет. И поэтому нет обращений.

Может ли устройство пропускать именно первую посылку в пакете, а последующие нет, с чем это может быть связанно?
Go to the top of the page
 
+Quote Post
gerber
сообщение Jun 1 2015, 20:42
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



Цитата(T00T @ Jun 1 2015, 20:27) *
И вот это можно по подробнее????

Констрейны - это, если говорить просто, правила (ограничения) в дизайне FPGA, которые накладывает разработчик на синтезатор/маппер, чтобы он не раскидал дизайн по матрице, как ему "вздумается", а соблюдал определенные условия. Например, нужный сигнал выводил на нужную ножку, а не на любую свободную.
Я имел в виду временные ограничения. Чтобы определенные сигналы задерживались внутри матрицы не более, чем на какое-то время. Это побудит маппер потрудиться, и расположить ячейки с учетом заданных временных правил (ну или выдать ошибку, если это невозможно). Подробнее в Xilinx Constraints Guide
Если сложно сразу понять - найдите готовые констрейны для любой PCI корки, как правило, это файл с расширением .ucf в дизайне.
Цитата(T00T @ Jun 1 2015, 21:40) *
Почему тогда биос виснет???????

Виснет комп при работе с PCI в таком случае - если устройство распознало свой адрес (DEVSEL# = 0), но так и не завершило транзакцию с помощью TRDY#.
Цитата(T00T @ Jun 2 2015, 00:08) *
...
пока писал придумал сам ответ на этот вопрос - анализируя запросы можно сказать что к 00 адресу биос обращается несколько раз подряд, и не факт что он читает этот регистр в первой посылке, может это уже вторая по счёту посылка, а устройство видит её как первую.
ну тогда всё встаёт на свои места.

А современные биосы могут запрашивать допустим 1 раз и как раз пропуск!! - типа устройства нет. И поэтому нет обращений.

Может ли устройство пропускать именно первую посылку в пакете, а последующие нет, с чем это может быть связанно?

Если речь о PCI Target, то никаких пакетов там нет, все просто и тупо - при FRAME#=0 задается тип транзакции, потом адрес, потом данные. Научитесь пользоваться ChipScope, вытащите в него все PCI сигналы и всё будет видно как на ладони, я именно так и делал в свое время, отлаживая PCI Target.


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
T00T
сообщение Jun 1 2015, 21:49
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 25-05-15
Пользователь №: 86 867



Цитата(gerber @ Jun 2 2015, 00:42) *
Если речь о PCI Target, то никаких пакетов там нет, все просто и тупо - при FRAME#=0 задается тип транзакции, потом адрес, потом данные. Научитесь пользоваться ChipScope, вытащите в него все PCI сигналы и всё будет видно как на ладони, я именно так и делал в свое время, отлаживая PCI Target.


Я имел ввиду, что ну наверно биос, так же как чтение конфиг регистров через lspci, посылают на одно устройство подряд несколько запросов и первый запрос теряется.

Спасибо за ответы, буду пытаться ковырять.

Цитата(gerber @ Jun 2 2015, 00:42) *
Если сложно сразу понять - найдите готовые констрейны для любой PCI корки, как правило, это файл с расширением .ucf в дизайне.


Если не трудно дайте ссылку на корку, ну или хотя бы такой .ucf
В файле .ucf я прописывал пины только и всё.
Go to the top of the page
 
+Quote Post
T00T
сообщение Jun 2 2015, 12:30
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 25-05-15
Пользователь №: 86 867



Ну или хотя бы подскажите как задать так что бы разместить цепи и узлы схемы, отвечающих за определение обращения именно к данному устройству в
одном месте кристалла - что бы задержки были минимальны.
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Jun 2 2015, 16:37
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



2 T00T

Вам сюда

И вот мурзилка неплохая, не забываем и про стандарт конечно..

+сходу нашёл пример, но на немецком правда. Если постараться - думаю вы и на английском найдёте без особых проблем.
Go to the top of the page
 
+Quote Post
T00T
сообщение Jun 5 2015, 08:17
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 25-05-15
Пользователь №: 86 867



доброго времени суток sm.gif.
Всем спасибо за ответы.
Итак процесс идёт, но медленно нашёл в коде небольшой косячёк, который немного улучшил ситуацию, но это был лишь маленький косячёк.
Что улучшилось:

эта плата теперь работает нормально с устройством:
"и вот ещё что ну ладно после 7 - го запроса зависало бы устройство или шина не уходила в IDLE, но нет всё вроде нормально Frame=1, Irdi=1 после запроса.


Вот этот косячёк убрался :
На старой плате запускаю Linux - lspci отображает устройство, но когда LSPCI -X читаешь конфигурационную область - выдает что в 00 регистре FFFFFFFF.


В общем то - складывается впечатление, что алгоритм работает правильно и дело во временах!!!

По поводу длинны CLK и других шин- я пока эту проблему обошёл (есть плата PCI на такой микросхеме, я на неё свой проект пока разместил) и
есть разница между моей самодельной платой и промышленной - На промышленной плате результат такой: на новых матерях устройство видит одну транзакцию и всё - некоторые матери после этого уходят в перезагруз, а некоторые больше не обращаются к устройству и работают без него. А на самодельной плате не видно обращения.
В общем то думаю что проблема остаётся только в этих констрейнах(временных ограничениях)

Цитата(Kuzmi4 @ Jun 2 2015, 20:37) *
2 T00T

Вам сюда

И вот мурзилка неплохая, не забываем и про стандарт конечно..

+сходу нашёл пример, но на немецком правда. Если постараться - думаю вы и на английском найдёте без особых проблем.


Ну по первому пункту, У меня корпус TQG144 - и PCI ядер для него нет (сейчас уже).
Второй пункт, я уже с ним давно ознакомился.
А вот третий интересный.

Вот такой вопрос Задержки в коде учитываются при построении и реализации схемы, и в каких они единицах:
Пример:

parameter tdel = 10;
.
.
.
assign #tdel AD_bus = devsel? data_out : 32'bZ;


по поводу констрейнов пока много вопросов, картина в целом не ясна, В GUIDE можно прочитать как использовать директивы.
А вот как по смыслу всё это собирать пока не ясно.

Будем копать.
Если у кого есть желание рассказать про алгоритм работы с констрейнами, милости просим sm.gif


Я вот не разбирался с CHIPSCOPE, а оказалось что я подобную штуку и сделал для анализа sm.gif.
Но теперь пришёл программатор из китая и CHIPSCOPE теперь тоже под рукой.

ну вот фотка самодельной платки, конечно о 33МГЦ при таком монтаже тяжело говорить, но алгоритм отладить можно было sm.gif

Сообщение отредактировал T00T - Jun 5 2015, 08:21
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
gerber
сообщение Jun 5 2015, 09:08
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



Цитата(T00T @ Jun 5 2015, 12:17) *
ну вот фотка самодельной платки, конечно о 33МГЦ при таком монтаже тяжело говорить, но алгоритм отладить можно было sm.gif

Не будет работать, констрейны тут ни к чему при такой конструкции laughing.gif
Когда-то давно я пробовал вытащить на проводах шину CardBus (это тот же PCI 33 МГц, только в ноутбучном исполнении в формате PCMCIA), чтобы к ноутбуку подключить одну дорогую PCI карту от десктопа. Там проводов было буквально 5 см. Наблюдал именно такую картину, как у вас - при чтении конфиг-регистров произвольно меняются содержимое на 0xFFFF, периодически виснет и т. п. И это не FPGA, а фирменный SoC, который идеально работал на десктопе.
Поэтому нужно делать (купить) нормальную плату с FPGA+PCI и отлаживаться на ней.


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
T00T
сообщение Jun 5 2015, 09:42
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 25-05-15
Пользователь №: 86 867



Цитата(gerber @ Jun 5 2015, 13:08) *
Не будет работать, констрейны тут ни к чему при такой конструкции laughing.gif
Когда-то давно я пробовал вытащить на проводах шину CardBus (это тот же PCI 33 МГц, только в ноутбучном исполнении в формате PCMCIA), чтобы к ноутбуку подключить одну дорогую PCI карту от десктопа. Там проводов было буквально 5 см. Наблюдал именно такую картину, как у вас - при чтении конфиг-регистров произвольно меняются содержимое на 0xFFFF, периодически виснет и т. п. И это не FPGA, а фирменный SoC, который идеально работал на десктопе.
Поэтому нужно делать (купить) нормальную плату с FPGA+PCI и отлаживаться на ней.


Ну я уже повторяюсь - взял рабочую PCI с такой микросхемой, и залил в неё свой проект.
Фото прилагаю....


И результат работы на этой плате - на 3 не свежих матерях работает, а на более менее новых устройство видит одну транзакцию и всё - некоторые матери после этого уходят в перезагруз, а некоторые больше не обращаются к устройству и работают без него.
А на самодельной нет транзакций.

Ну так как на более старых(Pentium-4)775,pentium-3 все работает, значит дело то не в алгоритме и не в разводке платы(рабочая плата). нужно правильно подправить временные характеристики сигналов.

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

gerber - вы же отлаживали такой проект, не могли бы поделиться UCF файлом. Всё равно для каждого проекта все придётся подбирать .
Ну хотя бы для примера, от чего отталкиваться.

Сообщение отредактировал T00T - Jun 5 2015, 09:27
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Jun 5 2015, 10:11
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



2 2 T00T
в DS собственно и написано что и куда надо на счёт констрейнов, хотите именно под ваш камень - сливайте более раннюю версию софта и ковыряйте там.
А касательно "соплей" - не буде тс ними работать, это вам не UART, берите плату со спартанчиком 6м и с ней работайте.
Go to the top of the page
 
+Quote Post
T00T
сообщение Jun 5 2015, 11:57
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 25-05-15
Пользователь №: 86 867



Итак всем спасибо!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Заработало!!!

Работает даже на моей самодельной плате, с проводами(Соплей там нет sm.gif).
Косячёк был в коде, просто не понятно почему с таким косячком что-то ещё работало.

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

теперь возьмёмся за драйвер!!!!!!

Сообщение отредактировал T00T - Jun 5 2015, 12:00
Go to the top of the page
 
+Quote Post
gerber
сообщение Jun 6 2015, 05:43
Сообщение #15


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



Цитата(T00T @ Jun 5 2015, 13:42) *
Ну я уже повторяюсь - взял рабочую PCI с такой микросхемой, и залил в неё свой проект.
Фото прилагаю....

Совсем другое дело. По первому фото мне показалось, что Spartan-6 на верхней синей плате, а нижняя PCI-плата используется в качестве разъёма PCI.
Цитата(T00T @ Jun 5 2015, 13:42) *
gerber - вы же отлаживали такой проект, не могли бы поделиться UCF файлом. Всё равно для каждого проекта все придётся подбирать .
Ну хотя бы для примера, от чего отталкиваться.

Код
# Timing Groups
INST "AD_p<*>.PAD" TNM = "PCI_DATA_PAD";
INST "FRAMEn_p.PAD" TNM = "PCI_CTRL_PAD";
# Physical & Timing Constrains
NET "CLK_p" TNM_NET = "CLK_p";
OFFSET = IN 7 ns BEFORE "CLK_p";
OFFSET = OUT 11 ns AFTER "CLK_p";
TIMESPEC "TS_CLK_p" = PERIOD "CLK_p" 33 MHz HIGH 50 %;
TIMESPEC "TS_PC2FF" = FROM "PCI_CTRL_PAD" TO "FFS" 10 ns;
TIMESPEC "TS_FF2PC" = FROM "FFS" TO "PCI_CTRL_PAD" 10 ns;
TIMESPEC "TS_PD2FF" = FROM "PCI_DATA_PAD" TO "FFS" 10 ns;
TIMESPEC "TS_FF2PD" = FROM "FFS" TO "PCI_DATA_PAD" 10 ns;


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
T00T
сообщение Jun 9 2015, 18:51
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 25-05-15
Пользователь №: 86 867



Ну да, так и было на первом фото - плата от модема, на ней маленькая платка для подпайки проводков к дорожкам, потом плата, на которой стоят преобразователи уровня, и в неё втыкается плата с плисиной.
И что удивительно всё работает!!!!!!!!!!!!!!

Большое спасибо за пример UCF.

Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 05:42
Рейтинг@Mail.ru


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