PCI Express dans les FPGA Intel série V: principes de base de l'interface et fonctionnalités matérielles essentielles

introduction


L'interface PCI Express ou PCIe, familière à beaucoup, était déjà disponible pour les développeurs de systèmes FPGA lorsqu'elle commençait à peine à se répandre dans la technologie numérique. À cette époque, il existait une solution dans laquelle le cœur du logiciel était connecté à un microcircuit de niveau physique externe [ 5 ]. Cela a permis de créer une ligne PCIe à une voie à une vitesse de 2,5 gigatransactions par seconde. De plus, grâce au développement des technologies, la couche physique de l'interface a migré vers les blocs matériels PCIe à l'intérieur des FPGA eux-mêmes; le nombre de canaux possibles est passé à 8, et dans un certain nombre de nouveaux microcircuits - à 16; Suivant les normes modernes, les taux de transfert de données possibles ont augmenté.

Dans le même temps, il est toujours difficile de trouver des matériaux auxiliaires sur l'utilisation des cœurs matériels des FPGA modernes dans des sources en langue russe; peu d'informations sont disponibles sur l'interface PCIe elle-même. Le guide des cœurs PCI Express matériels implique que le développeur s'est déjà familiarisé avec la norme et comprend les bases du transfert de données entre l'appareil et un ordinateur personnel (PC). Cependant, l'abondance d'informations dans la norme PCIe elle-même ne précise pas immédiatement quelles mesures doivent être prises pour réussir le transfert des données de l'appareil vers la mémoire du PC ou vice versa. Pour obtenir une image plus complète, une partie considérable des informations doit être collectée petit à petit auprès de diverses sources. Pour les développeurs de systèmes Intel FPGA, la difficulté est égalementque la plupart des matériaux et articles disponibles décrivent le travail avec les cœurs matériels Xilinx FPGA.

Dans cet article, l'auteur va essayer de parler de ce que le concepteur de système FPGA doit savoir pour travailler avec l'interface PCI Express; examinera les fonctionnalités de travail avec les cœurs matériels FPGA PCI Express de la série V d'Intel dans la version Avalon-ST.

Niveaux PCIe et types de paquets


Malgré le fait que PCI Express soit souvent appelé bus, en fait, cette interface est un réseau de périphériques connectés par des groupes de canaux duplex série. Le réseau PCI Express lui-même se compose de plusieurs nœuds principaux: la racine (Root), le point de terminaison (Endpoint) et le routeur (Switch) (Figure 1). Pour transférer des données uniquement entre deux appareils, il suffit d'avoir une racine et un endpoint. Dans le cas des PC modernes, la racine du réseau est située sur un substrat avec les cœurs du processeur central. Quel que soit l'emplacement de la racine PCIe, elle est associée à la mémoire système.


Figure 1 - Réseau PCIe

Le protocole de transfert de données PCIe est divisé en trois couches: la couche transactionnelle, la couche liaison de données et la couche physique. Les données d'interface sont transmises sous forme de paquets. Une vue généralisée des paquets est illustrée à la figure 2.


Figure 2 - Une vue généralisée des paquets PCIe

Au niveau de la transaction, tout paquet (TLP) se compose d'au moins un en-tête. Selon le type de package, l'en-tête peut être suivi de données - le contenu utile du package. Une somme de contrôle supplémentaire peut également être ajoutée à la fin du package. Il existe les principaux types de paquets de niveau transaction (tableau 1) suivants:

Tableau 1 - Types de paquets de niveau transaction
Non. P.Vue du packageNom du type d'emballage selon la spécification
1Demande de lecture en mémoireDemande de lecture en mémoire
2Demande d'écriture en mémoireDemande d'écriture en mémoire
3Demande de lecture d'espace d'E / SDemande de lecture d'E / S
4Demande d'écriture d'espace d'E / SDemande d'écriture d'E / S
5Lire la demande de configurationDemande de lecture de la configuration
6Écrire une demande de configurationDemande d'écriture de configuration
7Réponse de lectureAchèvement
8MessageMessage

Au niveau de la couche liaison, un numéro de séquence de paquets et une somme de contrôle de liaison sont ajoutés à chaque paquet de niveau transaction. La couche de liaison de données forme également ses propres types de paquets (DLLP), qui incluent (tableau 2):

Tableau 2 - Types de paquets de liaison de données
Non. P.Vue du packageNom du type d'emballage selon la spécification
1Confirmation du package de niveau transactionTLP Ack
2Rejet du package au niveau des transactionsTLP Nack
3Gestion de l'alimentationGestion de l'alimentation
4Contrôle du flux de donnéesContrôle de flux

Enfin, la couche physique complète les paquets avec des symboles du début et de la fin des paquets, qui sont empruntés à la norme IEEE 802.3. Pour les paquets au niveau des transactions, les symboles K27.7 et K29.7 sont respectivement utilisés; pour les paquets de liaison de données, les symboles K28.2 et K29.7.
Lorsqu'il travaille avec des cœurs matériels FPGA, le développeur doit former uniquement des paquets de niveau transaction; les paquets de canal et de couche physique sont formés par des blocs de noyau.

Routage de paquets au niveau des transactions


Au total, différents types de paquets peuvent arriver de l'expéditeur au destinataire de trois manières:

  • routage vers l'adresse;
  • Acheminement des identifiants
  • routage indirect.

La relation entre la méthode de routage et le type de paquet au niveau des transactions est présentée dans le tableau 3.

Tableau 3 - Correspondance de la méthode de routage et du type de paquet
№p
1.
I/O I/O
2.
ID.

3ID

.


Chaque point d'extrémité a son propre espace de configuration, où se trouvent divers registres d'instructions et d'état. Parmi eux se trouvent le registre d'adresses de base ou BAR. Lors de l'initialisation des points de terminaison, le BIOS ou le système d'exploitation analyse la BARRE des points de terminaison pour déterminer la quantité de mémoire et d'espace requis pour chaque point de terminaison. Ensuite, dans chaque BAR active, l'adresse de début de la partie allouée de la mémoire système est écrite. En conséquence, le point d'extrémité acquiert une adresse où les demandes appropriées peuvent être envoyées. Habituellement, au point d'extrémité, une carte de registre est formée, qui est liée aux zones de mémoire allouées.

De plus, chaque point de terminaison, ou plutôt le périphérique logique à l'intérieur, obtient son identifiant unique, qui se compose de trois parties: numéro de bus, numéro de périphérique, numéro de périphérique logique (fonction).

De cette façon, le système dispose de suffisamment d'informations pour communiquer avec le point de terminaison. Cependant, la transmission de données à l'aide de requêtes dans le BAR a de mauvaises performances. Premièrement, pour une BAR de 32 bits de large, la longueur de requête utilisable est limitée à un double mot (DWORD); pour une BAR 64 bits, deux doubles mots. Deuxièmement, chaque demande intervient avec la participation du processeur central. Pour réduire la charge sur le processeur central et augmenter la taille de chaque package, il est nécessaire que le point de terminaison déplace indépendamment les données vers ou depuis la mémoire système. Pour ce faire, le point de terminaison doit savoir à quelles adresses de mémoire système il peut écrire ou lire des données.

Compte tenu de ce qui précède, le schéma général de transfert de données entre le point d'extrémité et la mémoire système peut être représenté comme suit:

  1. le pilote de point final alloue des tampons dans la mémoire système pour écrire des données;
  2. le pilote forme dans la mémoire système un ensemble d'adresses et de tailles de tampon - des descripteurs de tampon pour écrire des données;
  3. le pilote de point d'extrémité écrit l'adresse de l'ensemble de descripteurs dans les registres de périphérique associés aux zones BAR;
  4. le pilote de point d'extrémité programme des registres de contrôle de transfert de données associés aux zones BAR;
  5. le point d'extrémité envoie une demande de lecture de la mémoire système pour obtenir un ensemble de descripteurs pour l'écriture dans la mémoire système;
  6. le point d'extrémité envoie des demandes d'écriture à la mémoire système et remplit les tampons de stockage;
  7. / , , , ;
  8. PCIe.


Au stade où le pilote configure les registres de point d'extrémité, selon le type d'espace d'adressage associé au BAR, le point d'extrémité recevra une demande d'écriture dans la mémoire (figure 3) ou une demande d'écriture dans l'espace d'E / S. Si le pilote lit un registre pendant la configuration du registre, le point d'extrémité reçoit également les demandes de lecture correspondantes (figure 4).

image
Figure 3 - Exemple d'une demande d'écriture dans la mémoire 1 DW de long


Figure 4 - Exemple d'une demande de lecture dans la mémoire 1 DW de long

Contrairement aux demandes d'écriture ou de lecture, les demandes d'E / S ont un certain nombre de limitations. Tout d'abord, les demandes d'écriture et de lecture nécessitent une réponse du destinataire. Cela conduit au fait que le taux de transfert de données utilisant les requêtes vers l'espace d'E / S devient beaucoup plus faible que la bande passante PCIe théorique ne le permet. Deuxièmement, l'adresse des demandes d'espace d'E / S est limitée à 32 bits, ce qui ne permet pas d'accéder à des fragments de mémoire système au-delà de 4 Go. Troisièmement, les demandes d'espace d'E / S ne peuvent pas dépasser un double mot et ne peuvent pas utiliser plusieurs canaux virtuels pour le transport. Pour ces raisons, les demandes d'écriture et de lecture dans l'espace d'E / S ne seront plus prises en compte. Toutefois,le contenu des en-têtes pour la mémoire d'écriture / lecture et l'espace d'E / S ne diffère que dans un certain nombre de champs, par conséquent, les structures de paquets illustrées sur les figures 3, 4 sont également applicables aux demandes dans l'espace d'E / S.

Lorsqu'un noeud final ou une racine PCIe reçoit une demande de lecture de mémoire ou d'espace d'E / S, le périphérique doit envoyer une réponse. Si l'expéditeur de la demande ne reçoit pas de réponse dans un certain délai, cela entraînera une erreur dans l'attente d'une réponse. Si, pour une raison quelconque, l'appareil ne peut pas envoyer les données demandées, il doit générer une réponse d'erreur. Les raisons possibles peuvent être: le destinataire ne prend pas en charge cette demande (demande non prise en charge); le destinataire n'est pas prêt à accepter la demande de configuration et demande de la répéter plus tard (état de nouvelle tentative de la demande de configuration), une erreur interne s'est produite, à cause de laquelle le destinataire ne peut pas répondre et rejette la demande (abandon du compteur).

Les formats pour une réponse réussie à une demande de lecture et une réponse d'erreur pour une demande non prise en charge sont illustrés dans les figures 5, 6.


Figure 5 - Exemple de réponse réussie à la lecture


Figure 6— Exemple de réponse concernant une demande non prise en charge

Pendant que le point d'extrémité accède à une zone de mémoire de 4 Go, le format des en-têtes de paquet ne diffère pas des en-têtes illustrés dans les figures 3, 4. Pour les demandes d'écriture ou en lisant la mémoire au-delà de 4 Go, un double mot supplémentaire avec des bits de poids fort de l'adresse de destination est utilisé dans l'en-tête (figure 7).


Figure 7 - Exemple d'en-tête de demande d'écriture de 128 octets. Des

explications des noms abrégés des champs d'en-tête de paquet sont présentées dans le tableau 4.

Tableau 4 - Liste des abréviations des champs d'en-tête
Non. P.Désignation du champNom de domaineRendez-vous
1TCCatégorie de trafic - Classe de traficDéfinit l'appartenance à un canal virtuel
2AtrLes attributs: , , ID, ID.
3TH‒ TLP Processing Hint, [1..0] .
4TD‒ TLP Digest, .
5EP, .
6AT‒ Address Translation, : , ,
7BE‒ Byte Enable
8PHAstuce de traitement des paquets - Astuce de traitementIndique au destinataire du package comment le package doit être utilisé, ainsi que la structure des données
9BCMLa présence d'un changement dans le nombre d'octetsIndique si le nombre d'octets dans le paquet a changé. Seul un expéditeur face à un périphérique PCI-X peut définir un indicateur

Si un point de terminaison utilise des interruptions pour signaler un événement, il doit également former un paquet approprié. Au total, PCIe peut utiliser trois types d'interruptions:

  • interruptions héritées (interruptions héritées ou INT);
  • les interruptions sous forme de messages (Message Signaled Interrupts ou MSI);
  • interruptions de message étendues (Message Signaled Interrupts Extended ou MSI-X).

Les interruptions INT héritées sont utilisées pour assurer la compatibilité avec les systèmes qui ne prennent pas en charge les interruptions de message. En fait, ce type d'interruption est un message (un paquet de type Message) qui simule le fonctionnement d'une ligne d'interruption physique. Lors d'un événement spécifié, le point de terminaison envoie un message à la racine PCIe indiquant que l'interruption INT a été activée, puis attend une action du gestionnaire d'interruption. Jusqu'à ce que le gestionnaire d'interruption effectue l'action spécifiée, l'interruption INT est à l'état activé. Les interruptions héritées ne vous permettent pas de déterminer la source de l'événement, ce qui force le gestionnaire d'interruptions à analyser séquentiellement tous les points de terminaison de l'arborescence PCIe pour traiter cette interruption. Lorsque l'interruption est réparée, le point d'extrémité envoie un message indiquant queque l'interruption INT est plus inactive. Les cœurs matériels FPGA, sur un signal provenant de la logique utilisateur, génèrent indépendamment les messages nécessaires pour les interruptions INT, de sorte que la structure du paquet ne sera pas prise en compte.

Les interruptions de message ainsi que leur version étendue sont le type d'interruption principal et obligatoire dans PCIe. Les deux types d'interruptions sont en fait une demande d'écriture dans la mémoire système d'une longueur d'un double mot. La différence par rapport à une demande régulière est que l'adresse d'enregistrement et le contenu du package sont alloués pour chaque périphérique au stade de la configuration du système. Dans ce cas, le contrôleur d'interruption programmable local avancé (LAPIC) à l'intérieur du processeur central devient la destination. Lorsque vous utilisez ce type d'interruption, il n'est pas nécessaire d'interroger séquentiellement tous les périphériques de l'arborescence PCIe. De plus, si le système permet au dispositif d'utiliser plusieurs vecteurs d'interruption, chaque vecteur peut être associé à son propre événement.Ensemble, cela réduit le temps processeur pour le traitement des interruptions et augmente les performances globales du système.

Les interruptions MSI permettent la formation de jusqu'à 32 vecteurs distincts. Le nombre exact dépend des capacités du point de terminaison. Dans ce cas, le système peut autoriser l'utilisation d'une partie seulement des vecteurs. Au stade de la configuration, le système écrit l'adresse d'interruption et les données initiales pour l'écriture dans les registres spéciaux de l'espace de configuration du noeud final. Toutes les interruptions actives utilisent la même adresse. Mais pour chaque vecteur, le point final modifie les bits des données initiales. Par exemple, laissez un point de terminaison prendre en charge un maximum de 4 vecteurs d'interruption, les 4 vecteurs sont autorisés dans le système et les données initiales pour l'écriture sont 0x4970. Ensuite, pour former le premier vecteur, le point final transmet les données initiales inchangées. Pour le deuxième vecteur, l'appareil modifie le premier bit et transmet le numéro 0x4971.Pour les troisième et quatrième vecteurs, l'appareil transmettra les nombres 0x4972 et 0x4973, respectivement.

Les cœurs matériels FPGA forment indépendamment un paquet avec une interruption MSI par un signal de la logique utilisateur. Cependant, avant de commander au noyau d'envoyer une interruption, la logique utilisateur doit également fournir le contenu du paquet pour le vecteur requis à une interface spéciale du noyau.

Les interruptions MSI-X permettent la formation de jusqu'à 2048 vecteurs individuels. Dans les registres correspondants de l'espace de configuration, le point de terminaison indique dans quels espaces d'adresse BAR et avec quel décalage par rapport à l'adresse de base la table d'interruption (figure 8) et la table des drapeaux d'interruption en attente (Pending Bit Array - PBA, figure 9) sont situées, ainsi que la taille des deux. les tables. Le système écrit une adresse et des données distinctes pour l'écriture sur chaque ligne de la table d'interruption, et autorise ou interdit également l'utilisation d'un vecteur spécifique via le premier bit du champ Contrôle vectoriel. Pour un événement donné, le point d'extrémité définit un indicateur dans la table d'indicateurs des interruptions en attente. Si aucun masque n'est défini pour cette interruption dans le champ Contrôle vectoriel, le point d'extrémité envoie une interruption à l'adresse de la table d'interruption avec le contenu spécifié du paquet.


Figure 8 - Tableau des vecteurs d'interruption MSI-X


Figure 9 - Tableau des drapeaux pour les interruptions en attente Les

cœurs matériels FPGA n'ont pas d'interface spécialisée pour les interruptions MSI-X. Le développeur lui-même doit créer une table d'interruptions dans la logique utilisateur et une table d'indicateurs d'interruptions en attente. Un package d'interruption est également entièrement généré par l'utilisateur et transmis via l'interface générale du noyau avec d'autres types de packages. Le format de paquet dans ce cas, comme déjà mentionné ci-dessus, correspond à une demande d'écriture dans la mémoire système d'une longueur d'un double mot.

Caractéristiques des cœurs matériels PCI Express FPGA V-series d'Intel dans la version Avalon-ST


Malgré le fait que les cœurs matériels des FPGA PCI Express de différents fabricants implémentent des fonctionnalités similaires, les interfaces des cœurs individuels ou l'ordre de leur fonctionnement peuvent différer.
Les cœurs matériels FPGA Intel V-Series PCI Express sont disponibles en deux versions: avec Avalon-MM et Avalon-ST. Ce dernier, bien qu'il nécessite plus d'efforts de la part du développeur, vous permet d'obtenir le plus de bande passante. Pour cette raison, un noyau avec une interface Avalon-MM ne sera pas considéré.

La documentation de base PCI Express avec l'interface Avalon-ST décrit de manière suffisamment détaillée les paramètres du noyau, les signaux d'entrée et de sortie. Cependant, le noyau a un certain nombre de fonctionnalités auxquelles un développeur doit prêter attention.

Le premier groupe de fonctionnalités concerne les méthodes qui vous permettent de configurer les FPGA dans un délai de 100 ms selon les exigences PCIe. En plus du chargement parallèle du type FPP, le développeur se voit proposer des méthodes telles que la configuration via le protocole (CvP) et le mode autonome du noyau (mode autonome). Le développeur doit s'assurer que la configuration via le protocole ou le mode noyau autonome est prise en charge pour la vitesse PCIe sélectionnée (paramètre «Lane Rate»). Pour la configuration via le protocole, les informations pertinentes peuvent être trouvées dans la documentation du noyau. Dans le cas du mode hors ligne, il n'y a pas de telles informations, vous devez donc compiler le projet. Si le mode noyau autonome n'est pas pris en charge pour la vitesse actuelle du noyau, Quartus générera une erreur correspondante (figure 10).


Figure 10 - Erreur lors de la compilation d'un noyau PCIe pour le mode hors ligne

Si un développeur prévoit d'utiliser la configuration via un protocole, il doit également faire attention au noyau FPGA auquel le connecteur PCIe est connecté. Cela est particulièrement vrai si le développeur n'utilise pas une carte finie, mais son propre appareil. Dans les FPGA avec plusieurs cœurs matériels PCIe, un seul cœur permet d'activer le CvP. L'emplacement du noyau avec prise en charge CvP est indiqué dans la documentation FPGA.
Le deuxième groupe de fonctionnalités concerne l'interface de transfert de données Avalon-ST elle-même. C'est cette interface qui est utilisée pour transférer des paquets de niveau transaction entre la logique utilisateur et le noyau.

Côté réception, le noyau a deux signaux qui permettent à l'utilisateur de suspendre la réception des paquets reçus: le signal rx_st_mask et le signal rx_st_ready.
En utilisant le signal rx_st_ready, le développeur peut suspendre la sortie de tous les types de paquets. Cependant, si vous activez ce signal, le noyau arrêtera la sortie des paquets après seulement deux cycles d'horloge de la fréquence de fonctionnement. Par conséquent, lors de l'activation du signal, la logique utilisateur doit être prête à recevoir une quantité supplémentaire de données. Si, par exemple, un développeur utilise un tampon sous forme de FIFO, il doit éviter les débordements de tampon. Sinon, une partie du contenu du package sera perdue.

A l'aide du signal "rx_st_mask", le développeur suspend l'émission de requêtes pour lesquelles des réponses doivent être envoyées. Ce signal n'arrête pas non plus immédiatement la sortie des paquets. Selon la documentation, après avoir activé le signal, le noyau peut émettre jusqu'à 10 requêtes. Si la logique utilisateur active "rx_st_mask" et qu'il n'y a pas assez d'espace dans le tampon pour traiter les paquets reçus, cela peut également activer le signal "rx_st_ready". Dans cette situation, la logique utilisateur arrête de lire tous les paquets du tampon du noyau matériel interne. Cela dépasse non seulement les tampons du noyau matériel, mais viole également les exigences de l'ordre des paquets. L'appareil doit ignorer les demandes qui ne nécessitent pas de réponse et lire les réponses. Sinon, le canal de données sera étroitement bloqué.Pour cette raison, le développeur doit utiliser un tampon supplémentaire pour traiter les demandes avec des réponses et ne pas autoriser la logique à bloquer les paquets de priorité supérieure.

Du côté émission, les signaux tx_st_valid et tx_st_ready peuvent causer des problèmes. Si le signal tx_st_ready est actif, il est interdit à la logique utilisateur de réinitialiser le tx_st_valid au milieu du paquet sortant. Cela signifie que lors du transfert, le développeur doit fournir l'intégralité du contenu du package. Si la source de données est plus lente que l'interface du noyau, la logique utilisateur doit accumuler la quantité de données requise avant le démarrage du package.
Du côté de la réception et du côté de la transmission, le développeur doit prêter attention à l'ordre des octets dans l'en-tête et au contenu du paquet, ainsi qu'à l'alignement des données.

Dans le paquet Avalon-ST du noyau matériel, dans chaque double mot à l'intérieur de l'en-tête du paquet PCIe, les octets suivent de bas en haut; à l'intérieur du contenu de l'emballage - du plus vieux au plus jeune. Le développeur doit utiliser un ordre similaire dans les paquets sortants pour réussir le transfert des données du point de terminaison vers la racine.

L'interface Avalon-ST du noyau matériel aligne les données en multiples de 64 bits. Selon la largeur de l'interface Avalon-ST, la longueur de l'en-tête de paquet au niveau de la transaction et l'adresse du paquet, le noyau peut ajouter un double mot vide entre l'en-tête de paquet et son contenu. À son tour, lors de la transmission de données, la logique utilisateur doit ajouter un double mot vide à l'avance, par analogie avec le noyau. Ce double mot vide n'est pas pris en compte dans la longueur du paquet et n'est nécessaire que pour le bon fonctionnement du noyau matériel.

La fonctionnalité suivante est liée aux réponses de lecture entrantes. La description du noyau indique qu'il ne manque pas de réponses entrantes dont l'identifiant ne correspond pas à la demande sortante. Dans le même temps, la logique utilisateur doit suivre le temps d'attente pour les réponses. Si le temps d'attente est dépassé, la logique utilisateur doit lever le drapeau "cpl_err [0]" ou "cpl_err [1]". La documentation ne précise pas comment le filtrage fonctionnera lorsque le point de terminaison envoie plusieurs demandes de lecture. La logique utilisateur indique uniquement au noyau que le délai d'expiration a expiré pour l'une des demandes, mais ne peut pas transmettre l'identifiant de cette demande au noyau. Il est possible que le noyau transmette au côté utilisateur des réponses pour une demande avec un délai expiré. Par conséquent, le développeur doit créer son propre filtre pour les réponses entrantes.

Enfin, les développeurs sont fortement encouragés à utiliser les informations sur les prêts disponibles pour les packages sortants. La documentation de base indique que ce n'est pas nécessaire, car le noyau vérifie les prêts et bloque les paquets lorsqu'il n'y a pas assez de prêts. Cependant, tous les types de packages arrivent au noyau via une seule interface. Si le tampon de paquets du noyau déborde, le noyau abaisse le signal tx_st_ready à zéro. Tant que le signal tx_st_ready n'est pas mis à un, la logique utilisateur, en principe, ne peut envoyer aucun paquet. Le nombre de prêts disponibles est mis à jour via des packages à partir d'un appareil partenaire. Si la logique de l'utilisateur non seulement écrit souvent, mais lit également, la vitesse à laquelle le noyau met à jour les compteurs de limites diminue. Au final, les performances globales du système en souffrent.

Conclusion


L'article décrit les principes généraux du transfert de données via PCI Express, les formats des principaux paquets de données. Néanmoins, l'auteur a omis des composants d'interface tels que les canaux virtuels, le contrôle du volume des réponses entrantes à lire et l'ordre des paquets n'est pas strict. Ces sujets sont discutés en détail dans un certain nombre de sources étrangères [ 4 , 6 ].
L'article comprend également les fonctionnalités des cœurs matériels FPGA FPGA Intel Express série V que l'auteur a rencontrés lors de l'utilisation du contrôleur d'interface. Cette expérience peut être utile à d'autres développeurs.

Liste des sources utilisées


  1. Une architecture PCIe DMA pour la transmission de données multi-gigaoctets par seconde / L. Rota, M. Caselle, et. Al. // TRANSACTIONS DE L'IEEE SUR LA SCIENCE NUCLÉAIRE, VOL. 62, NO. 3, juin 2015.
  2. An Efficient and Flexible Host-FPGA PCIe Communication Library / Jian Gong, Tao Wang, Jiahua Chen et. al. // 2014 24th International Conference on Field Programmable Logic and Applications.
  3. Design and Implementation of a High-Speed Data Acquisition Card Based on PCIe Bus / Li Mu-guo, Huang Ying, Liu Yu-zhi // 《测控技术》2013年第32卷第7期。
  4. Down to the TLP: How PCI express devices talk (Part I) / Eli Billauer
  5. Low-Cost FPGA Solution for PCI Express Implementation / Intel Corporation.
  6. Managing Receive-Buffer Space for Inbound Completions / Xilinx // Virtex-7 FPGA Gen3 Integrated Block for PCI Express v4.3, Appendix B
  7. PCIe Completion Timeout / Altera Forum
  8. PCIe packet in cyclone VI GX / Altera Forum
  9. PCIe simple transaction / Altera Forum
  10. PCIe w/ Avalon ST: Equivalent of ko_cpl_spc_vc0? / Altera Forum
  11. Point me in the right Direction – PCIe / Altera Forum
  12. Demander des délais dans le forum PCIE / Altera
  13. La conception d'interface haute vitesse basée sur PCIe de la plate-forme de vérification des récepteurs non coopératifs / Li Xiao-ning, Yao Yuan-cheng et Qin Ming-wei // Conférence internationale de 2016 sur la mécanique, le contrôle, l'électricité, la mécatronique, l'information et l'ordinateur
  14. PCI Express Base Specification Revision 3.0 / PCI-SIG
  15. Interface Stratix V Avalon-ST pour les solutions PCIe / Intel Corporation
  16. Interface Cyclone V Avalon-ST pour les solutions PCIe / Intel Corporation

All Articles