Je ne connais pas les outils de Xilinx, mais je connais ceux d'Altera, je vais donc vous parler des leurs. Xilinx et les autres ne devraient pas être trop différents.
Verilog
La première chose que vous devrez faire est d'apprendre Verilog . Cela vous fera mal à la tête parce que Verilog (et le VHDL quelque peu similaire) a d'abord été conçu comme un langage de simulation , et de nombreuses constructions (comme #5
ce qui signifie "attendre 5 pas de temps", un pas de temps étant généralement une nanoseconde). Il y a donc beaucoup de restrictions que vous devez garder à l'esprit pour rendre votre code Verilog synthétisable , c'est-à-dire compilable en un train de bits pour un FPGA.
Le plus grand choc, cependant, est que ce que vous écrivez dans Verilog (et VHDL) est le comportement que vous attendez du système , et le compilateur déduit la logique appropriée de votre description. Si vous ne faites pas attention, vous pouvez en tirer de nombreux bugs.
Par exemple, une bascule D ressemble à:
always @(posedge RESET or posedge CLK)
begin
if(RESET)
Q <= 1'b0;
else if(CLK_ENA)
Q <= D;
end
Cela décrit le fonctionnement d'un DFF, et le compilateur doit l'analyser et déterminer si vous voulez un DFF. La @(...)
est appelée une liste de sensibilité , qui est une liste de signaux qui déclenchent une réévaluation du bloc de code; ainsi, dans ce bloc, Q
ne change que s'il y a un front montant sur RESET
ou CLK
(c'est pour une réinitialisation active-haute). Si vous oubliez quelque chose dans la liste de sensibilité (qui devrait contenir toutes les variables de droite sans aucun modificateur posedge
ou negedge
pour un bloc logique combinatoire), le compilateur synthétisera les verrous selon les besoins plutôt que d'appeler une erreur. C'est fou, mais c'est comme ça, parce que Verilog était à l'origine un langage de simulation qui cachait (et donc ne nécessitait pas) les détails d'implémentation. VHDL est le même mais beaucoup plus verbeux.
Enfin, une nouvelle version de Verilog appelée SystemVerilog est sortie il y a quelques années, ce qui rend l'écriture de code synthétisable beaucoup plus facile . Si possible, apprenez cette langue, car Xilinx ISE et Altera Quartus II le supportent tous les deux. Le principal problème est le manque total de bons documents de référence.
La version SystemVerilog d'un DFF nettoie quelques petites choses:
always_ff @(posedge RESET, posedge CLK)
begin
if(RESET)
Q <= '0;
else if(CLK_ENA)
Q <= D;
end
Notez que les signaux de la liste de sensibilité sont séparés par des virgules. C'est parce que or
c'était déroutant car and
je ne pouvais pas y travailler. Notez également le remplacement de 1'b0
(un seul 0
bit) par '0
(un symbole qui s'étend à autant de 0
bits sont nécessaires en fonction de ce à quoi il est affecté; beaucoup plus flexible avec les modules paramétrés). Enfin, notez le remplacement de always
(qui pourrait être utilisé pour n'importe quoi; logique combinatoire, verrous et bascules) avec always_ff
lequel le contenu doit être synthétisé en bascules. Il y a aussi un always_comb
qui élimine la liste de sensibilité, car il ne fait que calculer les sensibilités des entrées au bloc.
Le logiciel de conception d'Altera s'appelle Quartus II, et vous rechercherez l' édition Web . (Les éditions par abonnement sont assez chères et ne sont nécessaires que pour les modèles FPGA les plus rapides ou les plus récents.)
Le plus triste, c'est que je n'ai pas trouvé de bon livre sur le sujet. Ce que j'ai appris, je l'ai obtenu en rassemblant des choses à partir de plusieurs sources, telles que les livres Verilog qui ne font pas du bon travail pour vous dire ce qui est synthétisable et ce qui ne l'est pas, et un exemple de code. Quartus II dispose d'une commande "insérer un modèle" qui insère le code du modèle pour plusieurs structures courantes, des bascules D aux machines à états.
Matériel de démonstration
Une fois que vous avez implémenté votre processeur dans Verilog, vous devez le construire. Pour le moment, laissez Quartus choisir la puce (vous devez choisir la famille; je recommanderais le Cyclone IV) et les brochages. Une fois qu'il aura atteint sa vitesse de croisière, vous saurez de combien de puce vous avez besoin. Il vous indiquera le nombre d'éléments logiques, de bascules, de bits RAM, etc. que vous avez utilisés. Assurez-vous que vous n'êtes pas à plus de 50% sur aucun de ceux-ci; si vous l'êtes, regardez la puce choisie par le compilateur et sélectionnez manuellement la puce plus grande suivante (en éléments logiques) qui a au moins autant de broches, et répétez jusqu'à ce que vous obteniez une utilisation inférieure à 50%.
Ensuite, allez acheter une carte de démonstration qui a une puce au moins aussi grosse que celle avec laquelle vous avez finalement construit. Vérifiez qu'il dispose des périphériques et / ou connecteurs d'E / S dont vous aurez besoin. Il n'est pas rare de construire une carte fille qui se branche sur un connecteur d'extension pour fournir tout matériel manquant.
Maintenant que vous avez choisi votre matériel, déterminez les vrais brochages et utilisez le Pin Planner pour placer les bons signaux sur les bonnes broches. La carte de démonstration aura un guide de l'utilisateur qui vous indique quelles broches sont câblées à quels périphériques ou broches de connecteur sur la carte de démonstration.
Une fois que vous avez défini les brochages, reconstituez-le pour qu'il utilise les broches souhaitées. Gardez à l'esprit que certains signaux comme les horloges du système auront besoin de broches d'entrée dédiées (donc ils sont acheminés directement vers les PLL internes).
Utilisez le programmeur pour télécharger votre conception directement dans le FPGA (ce registre à décalage que j'ai mentionné tout à l'heure). Vous êtes maintenant dans le cycle de débogage familier d'édition-compilation-exécution. Battez dessus jusqu'à ce que cela fonctionne.
Une fois que cela fonctionne, vous pouvez utiliser le programmeur pour télécharger le code dans le périphérique de configuration intégré afin que votre programme se charge et s'exécute à la mise sous tension.
Ce fut assez long, et j'espère que cela a aidé certains. Il y a beaucoup à apprendre; ce n'est pas comme apprendre un nouveau langage de programmation autant que comme apprendre un nouveau paradigme de programmation, par exemple passer des langages procéduraux aux langages fonctionnels. Verilog est une langue simultanée; la plupart du code s'exécute toujours.
Bonne chance!