PCI-express ядро в Achronix FPGA

Speedster22i HD1000FPGA има двеPCIeхардуерни ядра, сертифицирани отPCI-SIGза съответствие със спецификациятаPCIe 3.0, а вSpeedster22i HD1000 Development Kitплатка за отстраняване на грешки (за която писах в предишна публикация), едно от тези ядра се пренася вPCIeконектор. Чрез интерфейсаPCIeе много удобно платката за разработка да взаимодейства с хост компютъра. Всъщност това е единственото високоскоростно решение за предназначението. Алтернатива на използването наPCIeза свързване на платката за разработка към хост компютъра е вграденият com порт, който е с няколко порядъка по-бавен. Всички останали решения изискват повече или по-малко усъвършенстване на хардуера, най-малко ще се изисква използването на преобразуватели на нивото на сигнала. КомпаниятаAchronixима референтен дизайн, който демонстрира работата на хардуерното ядро PCIeв целия му блясък - ядрото работи в режимtargetс достъп както директно доCPU, така и чрез механизмаDMAза четене и запис. Проверих, всичко работи добре. Но този дизайн се оказа доста труден за модифициране за вашите собствени цели поради недостатъчната модулност и прекомерната сложност на кода на езикаVerilog. Ето защо беше решено да създадем собствена версия на базата на корпоративния дизайн, премахвайки от него всичко, свързано с обмена чрезDMA, както и да го структурираме по такъв начин, че изрично да подчертаваме модули с непроменен код и модули, чийто код трябва да бъде модифициран, за да се адаптира към конкретни задачи на разработчика. Резултатът е прост, добре структуриран проект, чиято адаптация към конкретните задачи на разработчика се свежда до проста промяна на кода.само един модул. Патентована характеристика наAchronixFPGA е наличието на хардуерно реализирани IP ядра за контролери на такива интерфейси катоPCIe,DDR3,100/40/10G EthernetиInterlaken. Тези хардуерни ядра осигуряват всичко необходимо за функционирането на тези интерфейси, единственото нещо, което се изисква от разработчика е да напише свои собствени интерфейсни модули с тези контролери. В резултат на това количеството работа е драстично намалено. В допълнение, постигането на необходимото време е значително опростено. В случая на дизайнаPCIeбяха необходими само няколко интерфейсни модула, като повечето от тях бяха взети от собствения референтен дизайн.
Кратко описание на проекта
Проектът реализира достъп до три 128-битови регистъра.PCIeядрото е конфигурирано за 3 BAR: BAR0 - 64 KB, BAR1 и BAR2 - 8 KB всяка. Достъпът до регистрите се осъществява чрез BAR1. Наличието на 3 BAR се дължи на изискванията за съвместимост с използвания драйвер. Регистрите са описани по-долу:
R0 | 0 | RO | > |
R1 | 20ч | RW RW | Битове [7:0] - изход към LED лента Битове [127:8] - не се използва |
R2 | 40ч | RO RW | Битове [7:0] - Прочетете лентата за превключване Битове [127:8] - Не се използва |
При надграждането на проекта първото нещо, което беше направено, беше премахването на кода, свързан с обмена на данни чрезDMA. След това каналите за четене/записtarget_readиtarget_writeбяха използвани за свързване към ядрото. След това структурата на модула беше дефинирана, както е показано на фигурата:

Имаше общо 4 модула (внякои от тях са подмодули)
Състав на модула:
- pcie_g3x4.v–PCIeобвивка на хардуерното ядро. Определя своите параметри катоVendorID, брой ленти (ленти), ширина на локалната шина и т.н. Този модул се генерира с помощта на основния генератор на средата за разработкаACE.
- pci_target_bus_ctrl.vе обвиващ модул, който съответства нацелевияканал на хардуерното ядро и локалната шина, на която са разположени регистрите, достъпни чрезPCIшината. Тъй като каналътtargetсе състои от два независими подканала: писане и четене, този модул съчетава два модула:pci_target_bus_write_ctrl.vиpci_target_bus_read_ctrl.v, които изпълняват съответно операции за запис и четене.
- lbus_registers.v– модул, съдържащ действителните потребителски регистри. Единственият модул, който изисква промяна на кода за конкретен проект.
- ACX_SNAPSHOT.v– спомагателен модул за вътрешносхемно отстраняване на грешки. В края на отстраняването на грешки той може да бъде изключен от проекта.
В този проект, за да се постигне функционалността, изисквана от разработчика, е необходимо да се промени изходният код само на един модул -lbus_registers.v. Всички останали модули се използват така, както са, без нито една промяна. В този случай модулътlbus_registers.vможе да се използва като шаблон, в който се добавя функционалността, необходима на разработчика. По този начин, за да получите работещ интерфейс с няколко регистъра на шинатаPCIe, добавянето на кода на модула отнема не повече от час.
PCIe ядро поколение
Можете да използвате генератора на ядрото на ACE shell, за да генерирате ядрото. Всички посочени параметри се записват във файл с разширение .axip, който може да бъдередактиране. Резултатът от генератора е текстови файлове на езицитеVerilogиVHDL. Екранна снимка на процеса на генериране на ядрото е показана на фигурата:

целеви интерфейс на ядрото pcie
местен автобус
Местният автобус има много проста структура. Състои се от два независими канала - писане и четене и може да се конфигурира за различна ширина на думата. Този проект използва 128-битови думи. Интерфейсът на локалната шина, реализиран в модулаlbus_registers.v, осигурява запис в регистрите без забавяне и четене със забавяне от 1 цикъл. Реалните забавяния обаче са малко по-дълги, тъй като подмодулите, включени в модулаpci_target_bus_ctrl.v, допринасят за латентността на транзакцията за запис и четене.
Внедряване
Изпълнението на проекта се състои от два етапа – етап на синтез и етап на трасиране.
Структура на директория
Следната организация на директориите беше избрана за изпълнение:
Директорията syn съдържа файла на проектаpcie_simple_design.prj. Този файл трябва да сочи към програмата за синтезsynplify-pro, разработена отSynopsys. Резултатът от тази програма е файлътpcie_simple_design.vmaв поддиректориятаsyn/rev_1. Този файл е вход за следващия етап - трасиране. Екранна снимка по време на изпълнение на стъпката на синтез е показана по-долу:

проследяване
Етапът на проследяване се извършва от програматаACE, разработена от компаниятаAchronix. Директориятаtrсъдържа файла на проектаpci-simple.prj, който трябва да бъде насочен към програматаACE. В края на етапа на проследяване файлът на фърмуераpci-simple-design.jamще се появи в поддиректориятаtr/impl_1/output, която е зареденадиректно към FPGA. Екранна снимка на стъпката за проследяване в ход:

Ограничения
Има само два файла с ограничения - единият описва часовниковите вериги, а другият дефинира използваните I/O пинове. Файловете се намират в директориятаtrи се наричат съответноpcie_simple_design.sdcиpcie_simple_design.pdc. Те вече са свързани чрез файлове на проекта към програми за синтез и проследяване.
резултати
Честота (MHz) | |||
Часовник/Група | мишена | Постигнати | Запознайте се с времето |
потребител_clk | 212.5 | 308.5 | да (+45,2%) |
core_clk | 212.5 | 433.5 | да (+104,0%) |
sbus_clk | 50,0 | 138.7 | да (+177,5%) |
Tck | 10.0 | 175.4 | да (+1653.6%) |
Ние се интересуваме от тактовата група user_clk, към която са свързани потребителските регистри. Както се вижда, при зададена честота от 212,5 MHz е постигнат резултат от 308,5 MHz, т.е. 45% по-висока от необходимата.
Изхвърляне
RLB | 0,520% |
LUT4 сайтове | 0,410% |
DFF сайтове | 0,520% |
MUX2 сайтове | 0,010% |
ALU сайтове | 0,170% |
LRAM сайтове | 1,280% |
BRAM сайтове | 0,190% |
BMULT сайтове | 0,000% |
I/O Pad сайтове | 1,980% |
Подложки за данни | 1,740% |
Подложки за часовници | 12,50% |
Нулирайте подложки | 0,000% |
Свързване към хост компютър
Необходим е драйвер за свързване към хост компютър. При определени условия можете да използвате драйвер от патентован референтен дизайн. ПриложениетоPciExpress.exeработи с този драйвер, чрез който имате достъп до регистри, свързани към шинатаPCIe. За да можете да използвате тези функции, е необходимо да запазите структурата на баровете на оригиналния дизайн и да запазите стойностите на параметритеVendorIDиDeviceID.
За да започнете с хост компютър с Windows, трябва да изпълните следните стъпки:
- Свържете платката за разработка към компютъра чрез шинаPCIe. Изисква PCIe x8 слот или по-широк. Свързването трябва да се извърши при изключени устройства и при спазване на мерките за антистатична защита. Захранвайте платката за отстраняване на грешки от външен източник на захранване.
- Включете захранването на компютъра и платката. Редът, в който се включва захранването, не е важен.
- Качете фърмуера на FPGA.
- Използвайте Device Manager, за да откриете ново устройство в шинатаPCIи да инсталирате драйвер за него.
- Рестартирайте
- След рестартиране с помощта на програматаPciExpressможете да пишете/четете регистри.

Персонализиране на модула lbus_registers.v
Ще покажем как да приложим тези действия на практика. • Определете името на регистъра и неговата дължина:
• Дефинирайте светкавици за запис и четене за този регистър:
• Напишете винаги блок за този регистър. Удобно е да направите това с оператораgenerate. В най-простия случай кодът изглежда така:
• Към блока always_comb
добавете нов клон в оператора case:
Горните стъпки се повтарят зарегистрация на всеки потребител.
Интерфейс на модула
Интерфейсът на модула е дефиниран, както следва:
Настройки
Hardcore conf в C++. Каним само професионалисти.