PCI-express ядро ​​в Achronix FPGA

pci-express

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 се дължи на изискванията за съвместимост с използвания драйвер. Регистрите са описани по-долу:

Име Отместване в AP BAR1 тип Описание
R00RO>
R120чRW RWБитове [7:0] - изход към LED лента Битове [127:8] - не се използва
R240чRO RWБитове [7:0] - Прочетете лентата за превключване Битове [127:8] - Не се използва

При надграждането на проекта първото нещо, което беше направено, беше премахването на кода, свързан с обмена на данни чрезDMA. След това каналите за четене/записtarget_readиtarget_writeбяха използвани за свързване към ядрото. След това структурата на модула беше дефинирана, както е показано на фигурата:

pci-express

Имаше общо 4 модула (внякои от тях са подмодули)

Състав на модула:

  • pcie_g3x4.vPCIeобвивка на хардуерното ядро. Определя своите параметри като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. Екранна снимка на процеса на генериране на ядрото е показана на фигурата:

achronix

целеви интерфейс на ядрото 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. Този файл е вход за следващия етап - трасиране. Екранна снимка по време на изпълнение на стъпката на синтез е показана по-долу:

pci-express

проследяване

Етапът на проследяване се извършва от програмата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)
Часовник/ГрупамишенаПостигнатиЗапознайте се с времето
потребител_clk212.5308.5да (+45,2%)
core_clk212.5433.5да (+104,0%)
sbus_clk50,0138.7да (+177,5%)
Tck10.0175.4да (+1653.6%)

Ние се интересуваме от тактовата група user_clk, към която са свързани потребителските регистри. Както се вижда, при зададена честота от 212,5 MHz е постигнат резултат от 308,5 MHz, т.е. 45% по-висока от необходимата.

Изхвърляне

Ресурсът е зает
RLB0,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можете да пишете/четете регистри.

achronix

Персонализиране на модула lbus_registers.v

Ще покажем как да приложим тези действия на практика. • Определете името на регистъра и неговата дължина:

• Дефинирайте светкавици за запис и четене за този регистър:

• Напишете винаги блок за този регистър. Удобно е да направите това с оператораgenerate. В най-простия случай кодът изглежда така:

• Към блока always_comb

добавете нов клон в оператора case:

Горните стъпки се повтарят зарегистрация на всеки потребител.

Интерфейс на модула

Интерфейсът на модула е дефиниран, както следва:

Настройки

Hardcore conf в C++. Каним само професионалисти.