Entrées/sorties Xilinx
synthèse VHDL par ISE
Est-ce équivalent de décrire les entrées-sorties uniquement au niveau VHDL et laisser ISE s’occuper de l’implantation complète ou a-t-on intérêt à inclure sois-même dans le projet VHDL des primitives Xilinx ? question sans doute naïve mais suscitée par l’emploi systématique de primitives dans les IP Xilinx
Afin d’apporter des éléments de réponse à cette question, nous allons implanter de deux façons différentes un registre décrit par la spécification d’entité suivante:
ENTITY registre IS
PORT (
entree_d : IN std_logic_vector(2 DOWNTO 0); — 3 devraient suffire
horloge : IN std_ulogic; — fan out 3
raz : IN std_ulogic; — fan out 3
sortie : OUT std_logic_vector(2 DOWNTO 0));
END registre;
La cible technologique est un virtex5. Un fichier de contrainte ucf a été utilisé pour l’essai.
Première implantation: VHDL seul
Représentée par la premiere architecture:
ARCHITECTURE sans_primitive OF registre IS
BEGIN — evidente
R1: PROCESS(raz, horloge)
BEGIN — PROCESS bascule
IF raz = ’1′ THEN
sortie <= (OTHERS => ’0′);
ELSIF rising_edge(horloge) THEN
sortie <= entree_d;
END IF;
END PROCESS R1;
END sans_primitive;
Le résultat est résumé par le schéma technologique suivant
Deuxième implantation mixte VHDL et primitives:
Elle correspond à la deuxième architecture suivante:
– acces aux primitives xilinx
library UNISIM;
use UNISIM.VComponents.all;
ARCHITECTURE mixte OF registre IS
SIGNAL horloge_tmp, raz_tmp : std_ulogic; — apres buffer
SIGNAL entree_tmp : std_logic_vector(2 DOWNTO 0); — idem
SIGNAL sortie_tmp : std_logic_vector(2 DOWNTO 0); — avant buffer
BEGIN — mixte
– registre logique
R2: PROCESS(raz_tmp, horloge_tmp)
BEGIN — PROCESS bascule
IF raz_tmp = ’1′ THEN
sortie_tmp <= (OTHERS => ’0′);
ELSIF rising_edge(horloge_tmp) THEN
sortie_tmp <= entree_tmp;
END IF;
END PROCESS R2;
– buffers internes
Buf_horloge : bufgp
PORT MAP ( I => horloge,
O => horloge_tmp);
buf_raz: ibuf
PORT MAP ( I => raz,
O => raz_tmp);
boucle: FOR i IN 0 to 2 GENERATE
ibuf_entree: ibuf
PORT MAP ( I => entree_d(i),
O => entree_tmp(i));
obuf_sortie: obuf
PORT MAP ( I => sortie_tmp(i),
O => sortie(i));
END GENERATE;
END mixte;
Conclusion
Après implémentation, on obtient exactement le même résultat avec pour seule différence, c’est la maitrise des noms d’instances comme par exemple: boucle[1].obuf_sortie
Donc soyons rassuré, à priori ISE sait intercaler automatiquement les primitives d’entrée/sortie et l’écriture du VHDL est beaucoup plus simple en style comportemental que structurel. Nous ne descendrons au niveau primitives que si nous y sommes obligés ou pour contredire le résultat de synthèse mais ceci se produit-il un jour ?
Leave a Reply
You must be logged in to post a comment.