Перейти к содержанию
    

Доброго времени суток форумчане. Появилась идея создать устройство на 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 не подключены.

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) Возможно, на новых "матерях" PCI 66 МГц, а не 33 Мгц. Проверьте осциллом.

2) Самое вероятное - неправильно заданы (или совсем не заданы) констрейны, или не выдержана длина PCI CLK на плате, это важный момент (длина линии клока на периферийной плате 2.5 дюйма, и она должна быть длиннее всех линий AD), посмотрите спецификацию PCI. На новых платах могут оказаться более сильные буфера на PCI, соответственно, требования к плате выше и т. п.

3) Некоторые новые "матери" вообще не имеют слотов PCI, убедитесь, что он есть, перед тем как втыкать плату. :biggrin:

4) Некоторые новые "матери" начинают очень рано опрашивать PCI устройства, поэтому нужно быть уверенным, что FPGA успевает прогрузить битстрим и подняться до того, как мат. плата снимает RESET# и начинает конфиг-циклы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

В проект я вставил такую конструкцию:

 

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 в них может быть, а то я вообще с этим ничего не делал!!!!

 

2) Самое вероятное - неправильно заданы (или совсем не заданы) констрейны

 

 

И вот это можно по подробнее????

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Почему тогда биос виснет???????

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На более свежих вообще устройство не видит обращений!!

Так что картина похожа на всякого рода задержки во времени типа не успевает захватить сигналы.(Наверно).

Так же как линукс на рабочей плате не опрашивает 00 регистр.

Хотя настораживает вопрос, почему именно первый и всегда именно он!!!!!!!!!!!!

Хотя биос читает его??

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

ну тогда всё встаёт на свои места.

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И вот это можно по подробнее????

Констрейны - это, если говорить просто, правила (ограничения) в дизайне FPGA, которые накладывает разработчик на синтезатор/маппер, чтобы он не раскидал дизайн по матрице, как ему "вздумается", а соблюдал определенные условия. Например, нужный сигнал выводил на нужную ножку, а не на любую свободную.

Я имел в виду временные ограничения. Чтобы определенные сигналы задерживались внутри матрицы не более, чем на какое-то время. Это побудит маппер потрудиться, и расположить ячейки с учетом заданных временных правил (ну или выдать ошибку, если это невозможно). Подробнее в Xilinx Constraints Guide

Если сложно сразу понять - найдите готовые констрейны для любой PCI корки, как правило, это файл с расширением .ucf в дизайне.

Почему тогда биос виснет???????

Виснет комп при работе с PCI в таком случае - если устройство распознало свой адрес (DEVSEL# = 0), но так и не завершило транзакцию с помощью TRDY#.

...

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

ну тогда всё встаёт на свои места.

 

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

Если сложно сразу понять - найдите готовые констрейны для любой PCI корки, как правило, это файл с расширением .ucf в дизайне.

 

Если не трудно дайте ссылку на корку, ну или хотя бы такой .ucf

В файле .ucf я прописывал пины только и всё.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

одном месте кристалла - что бы задержки были минимальны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 T00T

 

Вам сюда

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

доброго времени суток :).

Всем спасибо за ответы.

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

Что улучшилось:

 

эта плата теперь работает нормально с устройством:

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

 

 

Вот этот косячёк убрался :

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

 

 

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

 

По поводу длинны CLK и других шин- я пока эту проблему обошёл (есть плата PCI на такой микросхеме, я на неё свой проект пока разместил) и

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

В общем то думаю что проблема остаётся только в этих констрейнах(временных ограничениях)

 

2 T00T

 

Вам сюда

 

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

 

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

 

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

Второй пункт, я уже с ним давно ознакомился.

А вот третий интересный.

 

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

Пример:

 

parameter tdel = 10;

.

.

.

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

 

 

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

А вот как по смыслу всё это собирать пока не ясно.

 

Будем копать.

Если у кого есть желание рассказать про алгоритм работы с констрейнами, милости просим :)

 

 

Я вот не разбирался с CHIPSCOPE, а оказалось что я подобную штуку и сделал для анализа :).

Но теперь пришёл программатор из китая и CHIPSCOPE теперь тоже под рукой.

 

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

post-86867-1433492375_thumb.jpg

Изменено пользователем T00T

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Не будет работать, констрейны тут ни к чему при такой конструкции :laughing:

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

Поэтому нужно делать (купить) нормальную плату с FPGA+PCI и отлаживаться на ней.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не будет работать, констрейны тут ни к чему при такой конструкции :laughing:

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

Поэтому нужно делать (купить) нормальную плату с FPGA+PCI и отлаживаться на ней.

 

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

Фото прилагаю....

 

 

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

А на самодельной нет транзакций.

 

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

 

Вот я про задержки спрашивал, кто нибудь знает.

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

 

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

Ну хотя бы для примера, от чего отталкиваться.

post-86867-1433496184_thumb.jpg

Изменено пользователем T00T

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 2 T00T

в DS собственно и написано что и куда надо на счёт констрейнов, хотите именно под ваш камень - сливайте более раннюю версию софта и ковыряйте там.

А касательно "соплей" - не буде тс ними работать, это вам не UART, берите плату со спартанчиком 6м и с ней работайте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Заработало!!!

 

Работает даже на моей самодельной плате, с проводами(Соплей там нет :)).

Косячёк был в коде, просто не понятно почему с таким косячком что-то ещё работало.

 

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

 

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

Изменено пользователем T00T

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Фото прилагаю....

Совсем другое дело. По первому фото мне показалось, что Spartan-6 на верхней синей плате, а нижняя PCI-плата используется в качестве разъёма PCI.

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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...