T00T 0 1 июня, 2015 Опубликовано 1 июня, 2015 · Жалоба Доброго времени суток форумчане. Появилась идея создать устройство на 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 не подключены. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gerber 8 1 июня, 2015 Опубликовано 1 июня, 2015 · Жалоба 1) Возможно, на новых "матерях" PCI 66 МГц, а не 33 Мгц. Проверьте осциллом. 2) Самое вероятное - неправильно заданы (или совсем не заданы) констрейны, или не выдержана длина PCI CLK на плате, это важный момент (длина линии клока на периферийной плате 2.5 дюйма, и она должна быть длиннее всех линий AD), посмотрите спецификацию PCI. На новых платах могут оказаться более сильные буфера на PCI, соответственно, требования к плате выше и т. п. 3) Некоторые новые "матери" вообще не имеют слотов PCI, убедитесь, что он есть, перед тем как втыкать плату. 4) Некоторые новые "матери" начинают очень рано опрашивать PCI устройства, поэтому нужно быть уверенным, что FPGA успевает прогрузить битстрим и подняться до того, как мат. плата снимает RESET# и начинает конфиг-циклы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
T00T 0 1 июня, 2015 Опубликовано 1 июня, 2015 · Жалоба ну вот что бы некоторые вопросы сразу отпадали такая ремарка: В проект я вставил такую конструкцию: 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) Самое вероятное - неправильно заданы (или совсем не заданы) констрейны И вот это можно по подробнее???? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
T00T 0 1 июня, 2015 Опубликовано 1 июня, 2015 · Жалоба и вот ещё что ну ладно после 7 - го запроса зависало бы устройство или шина не уходила в IDLE, но нет всё вроде нормально Frame=1, Irdi=1 после запроса. Почему тогда биос виснет??????? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
T00T 0 1 июня, 2015 Опубликовано 1 июня, 2015 · Жалоба На более свежих вообще устройство не видит обращений!! Так что картина похожа на всякого рода задержки во времени типа не успевает захватить сигналы.(Наверно). Так же как линукс на рабочей плате не опрашивает 00 регистр. Хотя настораживает вопрос, почему именно первый и всегда именно он!!!!!!!!!!!! Хотя биос читает его?? пока писал придумал сам ответ на этот вопрос - анализируя запросы можно сказать что к 00 адресу биос обращается несколько раз подряд, и не факт что он читает этот регистр в первой посылке, может это уже вторая по счёту посылка, а устройство видит её как первую. ну тогда всё встаёт на свои места. А современные биосы могут запрашивать допустим 1 раз и как раз пропуск!! - типа устройства нет. И поэтому нет обращений. Может ли устройство пропускать именно первую посылку в пакете, а последующие нет, с чем это может быть связанно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gerber 8 1 июня, 2015 Опубликовано 1 июня, 2015 · Жалоба И вот это можно по подробнее???? Констрейны - это, если говорить просто, правила (ограничения) в дизайне FPGA, которые накладывает разработчик на синтезатор/маппер, чтобы он не раскидал дизайн по матрице, как ему "вздумается", а соблюдал определенные условия. Например, нужный сигнал выводил на нужную ножку, а не на любую свободную. Я имел в виду временные ограничения. Чтобы определенные сигналы задерживались внутри матрицы не более, чем на какое-то время. Это побудит маппер потрудиться, и расположить ячейки с учетом заданных временных правил (ну или выдать ошибку, если это невозможно). Подробнее в Xilinx Constraints Guide Если сложно сразу понять - найдите готовые констрейны для любой PCI корки, как правило, это файл с расширением .ucf в дизайне. Почему тогда биос виснет??????? Виснет комп при работе с PCI в таком случае - если устройство распознало свой адрес (DEVSEL# = 0), но так и не завершило транзакцию с помощью TRDY#. ... пока писал придумал сам ответ на этот вопрос - анализируя запросы можно сказать что к 00 адресу биос обращается несколько раз подряд, и не факт что он читает этот регистр в первой посылке, может это уже вторая по счёту посылка, а устройство видит её как первую. ну тогда всё встаёт на свои места. А современные биосы могут запрашивать допустим 1 раз и как раз пропуск!! - типа устройства нет. И поэтому нет обращений. Может ли устройство пропускать именно первую посылку в пакете, а последующие нет, с чем это может быть связанно? Если речь о PCI Target, то никаких пакетов там нет, все просто и тупо - при FRAME#=0 задается тип транзакции, потом адрес, потом данные. Научитесь пользоваться ChipScope, вытащите в него все PCI сигналы и всё будет видно как на ладони, я именно так и делал в свое время, отлаживая PCI Target. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
T00T 0 1 июня, 2015 Опубликовано 1 июня, 2015 · Жалоба Если речь о PCI Target, то никаких пакетов там нет, все просто и тупо - при FRAME#=0 задается тип транзакции, потом адрес, потом данные. Научитесь пользоваться ChipScope, вытащите в него все PCI сигналы и всё будет видно как на ладони, я именно так и делал в свое время, отлаживая PCI Target. Я имел ввиду, что ну наверно биос, так же как чтение конфиг регистров через lspci, посылают на одно устройство подряд несколько запросов и первый запрос теряется. Спасибо за ответы, буду пытаться ковырять. Если сложно сразу понять - найдите готовые констрейны для любой PCI корки, как правило, это файл с расширением .ucf в дизайне. Если не трудно дайте ссылку на корку, ну или хотя бы такой .ucf В файле .ucf я прописывал пины только и всё. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
T00T 0 2 июня, 2015 Опубликовано 2 июня, 2015 · Жалоба Ну или хотя бы подскажите как задать так что бы разместить цепи и узлы схемы, отвечающих за определение обращения именно к данному устройству в одном месте кристалла - что бы задержки были минимальны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 2 июня, 2015 Опубликовано 2 июня, 2015 · Жалоба 2 T00T Вам сюда И вот мурзилка неплохая, не забываем и про стандарт конечно.. +сходу нашёл пример, но на немецком правда. Если постараться - думаю вы и на английском найдёте без особых проблем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
T00T 0 5 июня, 2015 Опубликовано 5 июня, 2015 (изменено) · Жалоба доброго времени суток :). Всем спасибо за ответы. Итак процесс идёт, но медленно нашёл в коде небольшой косячёк, который немного улучшил ситуацию, но это был лишь маленький косячёк. Что улучшилось: эта плата теперь работает нормально с устройством: "и вот ещё что ну ладно после 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МГЦ при таком монтаже тяжело говорить, но алгоритм отладить можно было :) Изменено 5 июня, 2015 пользователем T00T Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gerber 8 5 июня, 2015 Опубликовано 5 июня, 2015 · Жалоба ну вот фотка самодельной платки, конечно о 33МГЦ при таком монтаже тяжело говорить, но алгоритм отладить можно было :) Не будет работать, констрейны тут ни к чему при такой конструкции :laughing: Когда-то давно я пробовал вытащить на проводах шину CardBus (это тот же PCI 33 МГц, только в ноутбучном исполнении в формате PCMCIA), чтобы к ноутбуку подключить одну дорогую PCI карту от десктопа. Там проводов было буквально 5 см. Наблюдал именно такую картину, как у вас - при чтении конфиг-регистров произвольно меняются содержимое на 0xFFFF, периодически виснет и т. п. И это не FPGA, а фирменный SoC, который идеально работал на десктопе. Поэтому нужно делать (купить) нормальную плату с FPGA+PCI и отлаживаться на ней. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
T00T 0 5 июня, 2015 Опубликовано 5 июня, 2015 (изменено) · Жалоба Не будет работать, констрейны тут ни к чему при такой конструкции :laughing: Когда-то давно я пробовал вытащить на проводах шину CardBus (это тот же PCI 33 МГц, только в ноутбучном исполнении в формате PCMCIA), чтобы к ноутбуку подключить одну дорогую PCI карту от десктопа. Там проводов было буквально 5 см. Наблюдал именно такую картину, как у вас - при чтении конфиг-регистров произвольно меняются содержимое на 0xFFFF, периодически виснет и т. п. И это не FPGA, а фирменный SoC, который идеально работал на десктопе. Поэтому нужно делать (купить) нормальную плату с FPGA+PCI и отлаживаться на ней. Ну я уже повторяюсь - взял рабочую PCI с такой микросхемой, и залил в неё свой проект. Фото прилагаю.... И результат работы на этой плате - на 3 не свежих матерях работает, а на более менее новых устройство видит одну транзакцию и всё - некоторые матери после этого уходят в перезагруз, а некоторые больше не обращаются к устройству и работают без него. А на самодельной нет транзакций. Ну так как на более старых(Pentium-4)775,pentium-3 все работает, значит дело то не в алгоритме и не в разводке платы(рабочая плата). нужно правильно подправить временные характеристики сигналов. Вот я про задержки спрашивал, кто нибудь знает. Ну и про констрейны - я понял это временные и всякие другие ограничения, накладываемые на процесс имплементаци и размещения. gerber - вы же отлаживали такой проект, не могли бы поделиться UCF файлом. Всё равно для каждого проекта все придётся подбирать . Ну хотя бы для примера, от чего отталкиваться. Изменено 5 июня, 2015 пользователем T00T Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 5 июня, 2015 Опубликовано 5 июня, 2015 · Жалоба 2 2 T00T в DS собственно и написано что и куда надо на счёт констрейнов, хотите именно под ваш камень - сливайте более раннюю версию софта и ковыряйте там. А касательно "соплей" - не буде тс ними работать, это вам не UART, берите плату со спартанчиком 6м и с ней работайте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
T00T 0 5 июня, 2015 Опубликовано 5 июня, 2015 (изменено) · Жалоба Итак всем спасибо!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Заработало!!! Работает даже на моей самодельной плате, с проводами(Соплей там нет :)). Косячёк был в коде, просто не понятно почему с таким косячком что-то ещё работало. Вобщем то у плисины оказалось достаточно быстродействия чтобы даже в автомате, без ограничений, отрабатывать алгоритм. теперь возьмёмся за драйвер!!!!!! Изменено 5 июня, 2015 пользователем T00T Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gerber 8 6 июня, 2015 Опубликовано 6 июня, 2015 · Жалоба Ну я уже повторяюсь - взял рабочую 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться