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

Registre vue technologique

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.