Very High Speed Integrated Circuit Hardware Description Language
Lancé dans les années 80 avec comme objectifs de:
répondre à une complexité croissante des systèmes numériques
rester indépendant de la technologie utilisée (analogie: un programme est écrit en C sans se soucier de l’ordinateur sur lequel tournera l’application...)
Des cours sur le net, y a que çà, Tapez langage vhdl sur google si vous ne me croyez pas ;-) Je ne vais pas en rajouter un de plus. mais je vais vous aiguiller vers quelques informations à lire dans cette première heure. Nous allons d'abord nous intéresser à la structure d'un programme VHDL, vous avez déjà vu un exemple dans TP1. Puis nous allons focaliser dans un premier temps vers la logique combinatoire cette semaine.
Voici une liste courte de livres, de cours ou d'exposés que j'ai sélectionnés pour vous. Le premier est toujours intéressant même si il ne s'agit pas de la carte Basys3.
Des tutoriaux en vidéo: 111 clips pour utiliser la carte nexys C'est un support d'une collection de livres sur la programmation de cartes telles que la votre, auteurs Richard E. Haskell and Darrin M. Hanna
Des tutoriaux Xilinx pour la carte nexys3
Un tutoriel pour Basys3 qui reprend les concepts du TP1
Livre
Le langage VHDL cours et execices Dunod
Cours
Une belle introduction pas à pas de VHDL sur wikibook
Un cours en ligne complet en français ici!!!! à mettre dans vos bookmark.. vous vous en servirez de temps en temps
des liens regroupés pour la basys3 en vrac...
FPGA LINKS
https://reference.digilentinc.com/reference/programmable-logic/basys-3/start?redirect=1
https://reference.digilentinc.com/learn/programmable-logic/tutorials/basys-3-getting-started/start
https://reference.digilentinc.com/reference/software/vivado/start?redirect=1
https://reference.digilentinc.com/vivado/getting_started/start
https://reference.digilentinc.com/learn/programmable-logic/tutorials/start
https://learn.digilentinc.com/list?category=Digital
https://www.xilinx.com/video/training.html
https://www.xilinx.com/training/tutorials.html
https://www.xilinx.com/training.html
http://www.instructables.com/howto/basys3/
https://learn.digilentinc.com/classroom/realdigital/
https://learn.digilentinc.com/classroom/python/
https://forum.digilentinc.com/
http://www.instructables.com/id/Simple-Logic-Design-w-Digilent-Nexys-4-Field-Progr/
http://www.instructables.com/id/How-to-use-Verilog-and-Basys-3-to-do-3-bit-binary-/
https://www.xilinx.com/support/university/students.html
https://www.xilinx.com/support/university/vivado.html
https://www.xilinx.com/products/boards-and-kits/1-54wqge.html
https://reference.digilentinc.com/_media/basys3:basys3_rm.pdf
https://www.xilinx.com/products/design-tools/ultrafast.html#trainingSupport
http://www.farnell.com/datasheets/2095778.pdf?_ga=1.128081420.1899087222.1477300701
Videos
https://www.youtube.com/watch?v=jE5Y349WD1E
https://www.youtube.com/watch?v=6_GxkslqbcU
https://www.youtube.com/watch?v=BDq8-QDXmek
Books
Designing with Xilinx® FPGAs: Using Vivado
7 Nov 2016
by Sanjay Churiwala
Verilog by Example: A Concise Introduction for FPGA Design
19 Apr 2011
by Blaine Readler
Vhdl By Example
28 May 2014
by Blaine Readler
Je vous propose de lire chacun des points suivants dans l'ordre, quand il s'agit d'un lien il suffit de cliquer!
Vous apprenez VHDL car il va vous permettre de construire par compilation, placement et routage les .bit qui permettent la configuration de votre FPGA, le Artix7 en particulier. VHDL comme Verilog sont supportés par Vivado.
ATTENTION VHDL ce n'est pas du C!!!!!
ú On identifie les fonctions par bloc et on les dessine sur papier
ú On repère et nomme les entrées de chaque blocs ( on évite d’utiliser les mêmes noms)
ú On répertorie les connexions INTERNES (mot clé SIGNAL)
ú Le bloc est-il combinatoire ou séquentiel?
Si séquentiel alors description avec le mot clé PROCESS + instructions autorisées sinon on place dans n'importe quel ordre les éléments du circuit
ú Le bloc est-il utilisé plusieurs fois
Si oui il vaut mieux créer un composant (entity+ architecture)
Sinon le bloc est synthétiser par les lignes de codes directement
Dans vos TPs, vous utiliserez la notion de composant, vous avez des notions de composants dans certains langages de programmation, il y a des similitudes.
Un composant possède une vision boite noire, c'est l'entity qui nous précise les interfaces de ce composant et son contenu peut être spécifié par une ou plusieurs architectures.
Voici 3 lectures introductives (obligatoires)
Compléments sur Entity et Architecture
Un signal est la modélisation d’une interconnexion ou d’un groupe d’interconnexions( un fil ou un bus) . Ce moyen d’interconnexion est utilisé entre les ports des composants. Chaque signal possède une histoire! Les signaux peuvent être déclarés dans l’en-tête de l’architecture.
Syntaxe de déclaration :
signal nom1 , nom2 : type ;
Affectation d’une valeur :
nom <= valeur_compatible_avec_le_type ;
Voici un exemple qui génère un signal utilisé pour stimuler un port d'un composant lors d'une simulation... Ce code ne permet pas de générer un circuit par synthèse!!
On pourra associer certains attributs aux signaux, qui produisent alors une valeur. On utilisera en particulier :
X s'event: vrai si un événement arrive (c’est-à-dire, si le signal s change de valeur) . Notion de temps et d'histoire du signal, assez utile pour détecter un front sur un signal d'horloge!
Nous reviendrons la semaine prochaine sur la notion de signaux et de processus.
VHDL est un langage typé où il est obligatoire de spécifier le type des objets utilisés.
Librairie standard de VHDL, tous ces types ne sont pas nécessairement synthétisables!!!!:
Boolean (true ; false)
Bit (‘0’ ; ‘1’)
Bit_vector (vecteur de bit)
Integer
Real
Character
String (vecteur de charactère)
Time (surtout en simulation)
Librairie std_logic_1164. C’est la librairie que l’on utilise le plus désormais. Elle reprend les définitions de la norme IEEE1164, norme qui définie les signaux utilisées en milieu industrielle.
Std_ulogic (‘U’ ; ‘X’ ; ‘0’ ; ‘1’ ; ‘Z’ ; ‘W’, ‘L’ ; ‘H’ ; ‘-‘)
Std_logic : qui reprend les std_ulogic, mais qui gère les conflits de signaux lors d’assignement multiple. C’est ce que l’on appel un type « résolue ».
Std_ulogic_vector : vecteur de std_ulogic
Std_logic_vector : vecteur de std_logic
Comme vous pouvez le voir, la norme 1164 définie beaucoup plus d’état pour un signal que la norme de base. C’est pourquoi on l’utilise aujourd’hui majoritairement, ne serait-ce que pour la possibilité d’utiliser un état ‘Z’ (haute impédance), très utile pour des bus de données. Attention, le type bit n’est pas compatible avec le type std_(u)logic. Il faut impérativement utiliser des fonctions de conversion pour passer de l’un à l’autre. Ce sont ces signaux que l'on utilisera aussi , ils sont bien sur synthétisable par ISE. Poutr les utiliser il faut insérer la bibliothèque dans le code vVHDL.
library ieee;
use ieee.std_logic_1164.all;
VHDL en respectant la notion de typage permet d'affecter un signal ou le resultat d'un oépration sur des signaux à un signal cible. On peut voir cette affectation comme la "soudure logique" de deux fils.
a<= b and c ; --- la sortie de la porte and sur b et c est connectée au signal a
On peut ainsi construire le flot de donnée à travers le circuit. Voici un exemple de multiplexeur 4-1 écrit en transcrivant directement la fonction logique du circuit.
entity MUX is
port( E0,E1,E2,E3,SEL0,SEL1 : in std_logic;
S : out std_logic);
end MUX;
architecture FLOT_MUX of MUX is
begin
S <= ((not SEL0) and (not SEL1) and E0) or
(SEL0 and (not SEL1) and E1) or
((not SEL0) and SEL1 and E2) or
(SEL0 and SEL1 and E3);
end FLOT_MUX;
Vous pouvez également utiliser une forme conditionnelle avec un when else ou un with select.
S <= E0 when (SEL0=‘0’ and SEL1=‘0’) else
E1 when (SEL0=‘1’ and SEL1=‘0’) else
E2 when (SEL0=‘0’ and SEL1=‘1’) else
E3;
with SEL1&SEL0 select
S <= E0 when "00",
E1 when "01",
E2 when "10",
E3 when others;
Il est parfois pratique de désigner par un autre nom une entité nommée qui existe déjà sous un premier nom. Cette entité peut être un objet, un sous programme, un type etc. Il est important de noter qu’une déclaration d’alias ne crée rien d’autre qu’un synonyme. Elle ne crée en aucun cas un nouvel objet, la classe de l’objet visé n’est pas modifiée. La syntaxe générale (simplifiée) de création d’un alias est :
alias alias_designator [: subtype_indication ] is name ;
Voici un exemples sur un signal:
signal instr : bit_vector(0 to 15) ;
alias opcode : bit_vector(0 to 9) is instr (0 to 9) ;
alias source : bit_vector(2 downto 0) is instr (10 to 12) ;
Testez vous!
Voici une table de vérité. Donnez le programme VHDL qui l’implémenterait!
Soit le code VHDL suivant
ENTITY exo2 IS
PORT
(
a : IN STD_LOGIC;
b : IN STD_LOGIC;
c : IN STD_LOGIC;
d : IN STD_LOGIC;
adr : IN STD_LOGIC_VECTOR (1 downto 0);
s : OUT STD_LOGIC
);
END exo2;
ARCHITECTURE Archi1exo2 OF exo2 IS
BEGIN
s <= ( a AND NOT adr(1) AND NOT adr(0) )
OR ( b AND NOT adr(1) AND adr(0) )
OR ( c AND adr(1) AND NOT adr(0) )
OR ( d AND adr(1) AND adr(0) );
END Archi1exo2;
1 – Dessiner le circuit
2 – Que fait-il?
3 – Ecrire une autre architecture équivalente en utilisant les mots clés :
- WITH SELECT
-WHEN ELSE
Le langage VHDL est destiné aux électroniciens qui ont l'habitude d'assembler des composants électroniques simples pour en faire d'autres un peu plus complexes etc... VHDL se doit donc de pouvoir gérer ces situations. Les composants à assembler peuvent ou non se trouver dans des bibliothèques. Le style de programmation qui consiste à assembler des composants s'appelle programmation structurelle.
VHDL permet l'assemblage de "composants" , on appelle cela une description structurelle. Un même composant peut être appelé plusieurs fois dans un même circuit. Pour différencier ces mêmes composants, il est nécessaire de leur donner un nom d'"instance". L'utilisation d'un composant se dit aussi "instanciation"
Pour instancier un composant il faut connaître :
Le prototype du composant (ses ports d'entrée et de sortie).
A quelle entité et architecture est lié chaque instance de composant. On n’utilisera pas cette fonctionnalité dans les TPs qui est optionnelle. On utilisera le même nom pour le composant et l'entity associée.
La déclaration du composant doit être conforme à celle de l'entité associée, on écrit deux fois à peu prés la même chose mais comme pour les langages à base de composants cela permet :
Une compilation séparée entre l'entité associée au composant et le circuit utilisant le composant.
La conception descendante. Le composant peut être déclaré avant que l'entité le soit.
Cette description structurelle est nécessaire pour simuler un circuit avec des stimulis des entrées eux-mêmes spécifiés en VHDL. Un code VHDL instancie le circuit à tester (Unit Under Test) et son générateur de stimulis ( voir plus haut la présentation des signaux). Ce circuit résultant, généralement appelé "testbench" est autonome: il n'aura pas d'entrées ni de sorties. On utilisera en TP le logiciel Vivado Simulator fourni par Xilinx.
Voici un exemple de construction structurelle . Vous pouvez aussi lire le paragraphe qui suit sur la généricité, c'est assez standard pour des informaticiens, je vous laisse le découvrir par vous -même.
Soit la description VHDL suivante :
Que réalise ce composant fct? Il manque quoi dans ce code?
entity fct is
port ( a, b : in std_logic;
s: out std_logic);
end fct;
architecture archi_fct of fct is
begin
s<= '1' when a=b else '0';
end archi_fct;
Dans le même projet( ensemble de fichiers utiles pour générer un fichier .bit), on écrit une autre description VHDL :
entity circuit is
port (e1, e2, e3, e4 : in std_logic;
s : out std_logic);
end circuit;
architecture archi_circuit of circuit is
signal s1,s2,s3 : std_logic;
component fct
port ( a, b : in std_logic;
s: out std_logic);
end component;
begin
cmp1 : fct port map (a=>e1, b=>e2, s=>s1);
cmp2 : fct port map (a=>e3, b=>e4, s=>s2);
cmp3 : fct port map (a=>e1, b=>e3, s=>s3);
s<= s1 and s2 and s3;
end archi_circuit;
Faites une analyse structurelle du circuit réalisé. Vous pouvez dessinez les symboles des composants.
Quelle fonction est décrite par ce circuit ?
Lors de la séance TD1 vous avez utilisé un additionneur complet 1 bit à trois entrées (a, b, et cin la retenue entrante), et deux sorties (le bit de somme s et le bit de retenue sortante cout).
1 – Donner le code VHDL correspondant de add1bit
2 - Réutiliser ce composant pour concevoir un additionneur 4 bits. Donner le code VHDL de add4bit