• Aucun résultat trouvé

Le VHDL

N/A
N/A
Protected

Academic year: 2022

Partager "Le VHDL"

Copied!
28
0
0

Texte intégral

(1)

Le VHDL

(2)

Les langages HDL (Hardware Description Language)

• VHDL (Very high speed / scale HDL)

• Verilog

• AHLD (Altera HDL)

• Abel (inadapté aux FPGA)

(3)

Applications du VHDL

• Modélisation

– S<=a after 5 ns ;

• Synthèse

– S<=a ;

(4)

Structure du programme

entrées instruction

port

instruction

generic

entité

paramètres

sorties

architecture

description de la

structure interne

(5)

Exemple de programme (TP1)

LIBRARY ieee;

USE ieee.std_logic_1164.all;

USE ieee.std_logic_unsigned.all;

--les paquetages std_logic_1164 et std_logic_unsigned de la bibliothèque ieee --permettent respectivement l'utilisation du type std_logic et l'addition avec ce type

ENTITY div IS

--H est le signal d'horloge à 25,175 MHz

--S est le résultat de la division de la fréquence de H par 25 175 000

--les 15 bits de SEG seront toujours au NL1 pour éteindre les segments non utilisés port ( H : IN STD_LOGIC;

SEG : OUT STD_LOGIC_VECTOR (14 downto 0);

S : OUT STD_LOGIC);

(6)

Exemple de programme (TP1)

ARCHITECTURE archdiv OF div IS

--pour compter jusqu'à (25 175 000 -1) il faut 25 bits (2^25=33 554 432) SIGNAL X : STD_LOGIC_VECTOR (24 downto 0);

CONSTANT M : INTEGER := 25175000 ; BEGIN

PROCESS (H) BEGIN

--compteur modulo M

IF (H'EVENT AND H = '1') THEN

IF X >= M-1 THEN X <= (others=>'0');--mise à 0 de X ELSE X <= X + 1 ;

END IF;

END IF;

END PROCESS

--à la moitié du comptage on change la valeur de S (rapport cyclique 1/2) S<='1' when X>=M/2 else '0';

-- extinction des 15 segments non utilisés par mise à 1 des bits de SEG SEG<= (others =>'1');

(7)

L’entité

• L’instruction « Port » ;

• L’instruction « Generic » ;

• Les directions :

• « in »

• « out »

• « inout »

• « buffer »

(8)

L’entité

• Les types :

• « integer »

– de -231 à 231 –1 ;

– limité par « range Mini to Maxi ».

• « bit » et « bit_vector (0 to N) ou « bit_vector (N downto 0) »

– état 1 ou 0 .

• « std_logic » et « std_logic_vector (0 to N) ou « std_logic_vector (N downto 0) »

– état 1 , 0 ou Z (haute impédance) .

– nécessite la bibliothèque « ieee.std_logic_1164.all ».

• « boolean »

– true ou false.

(9)

L’architecture

architecture comportementale

architecture structurelle

architecture flot de données

si ...alors dans les cas où...

tant que...

...

x = (a+b)c s = x+cd ....

Q

SET Q

CLR

S R 1 a1

2 a2

3 a3

4 a4

b1 b2 b3 b4

5 6 7 GND 8

0

1 a1 2 a2

3 a3

4 a4

b1 b2 b3 b4

5 6 7 GND 8

0

(10)

Objets, littéraux

• les objets :

• « signal »

• « variable »

• « constant »

• notation des littéraux :

• bits et caractères : ‘0’

• chaînes : ’’00000000’’

• nombres décimaux : 1000 1_000 1E3 1.00E3

• nombres hexadécimaux : 16#’’1AFF’’ x’’1AFF’’

(11)

Les agrégats

signal Q : std_logic_vector (5 downto 0);

Q <= "101111";

Q <= ('1 ',' 0',' 1',' 1',' 1',' 1') ;

Q <= ( 5 =>' 1 ', 3 =>' 1 ', 4 =>' 0 ', 0 => ' 1 ', 2 => ' 1 ', 1 => ' 1 ') ;

Q <= ( 5 => '1', 3 downto 0 => '1', others => '0') ;

(12)

Instructions séquentielles et concurrentes

instruction concurente 2 instruction concurente 1

instruction concurente n

entrées sorties

instruction séquentielle 2

instruction séquentielle 1

instruction séquentielle n

entrées

sorties

(13)

Les instructions concurrentes

• affectation simple

• affectation conditionnelle

• affectation sélective

• boucle

NOM_D’UNE_GRANDEUR<=VALEUR_OU_NOM_D'UNE_GRANDEUR ;

NOM_D’UNE_GRANDEUR <= Q1 when CONDITION1 else Q2 when CONDITION2 else ..

Qn ;

with EXPRESSION select

NOM_D’UNE_GRANDEUR <= Q1 when valeur1, Q2 when valeur2, ... , Qn when others ;

étiquette : for i in MIN to MAX generate

INSTRUCTIONS ;

end generate ;

(14)

le « process » et les instructions séquentielles

• le « process » contient les instructions séquentielles :

• le « process » permet de décrire des bascules à fronts d’horloge

process (LISTE_DE_SENSIBILITE)

NOM_DES_OBJETS_INTERNES : « type » ; --zone facultative begin

INSTRUCTIONS_SEQUENTIELLES ; end process ;

process

NOM_DES_OBJETS_INTERNES : « type » ; --zone facultative begin

wait on (LISTE_DE_SENSIBILITE) ; INSTRUCTIONS_SEQUENTIELLES ; end process ;

if (CLK ‘event and CLK = ‘1’) then INSTRUCTIONS ;

end if ;

wait until (CLK='event and CLK='1') ;

(15)

Les instructions séquentielles

• Le test « if..then..elsif...else..end if »

• Le test « case..when..end case »

if CONDITION1 then

INSTRUCTION1 ; elsif CONDITION2 then

INSTRUCTION2 ; elsif CONDITION3 then

INSTRUCTION3 ; ..

else INSTRUCTIONX ;

end if ;

case EXPRESSION is

when ETAT1 => INSTRUCTION1 ; when ETAT2 => INSTRUCTION2 ;

..

when others => INSTRUCTIONn ;

end case ;

(16)

Les instructions séquentielles

La boucle « for..in..to..loop..end loop »

• La boucle « while..loop..end loop »

• L’attente « wait until »

for N in X to Y loop

INSTRUCTION ;

end loop ;

while CONDITION loop INSTRUCTION ; end loop ;

wait until EVENEMENT ;

INSTRUCTION ;

(17)

Exemples de programmes

entity ET is

port (E1, E2 : in bit;

S : out bit );

end ET;

architecture ARCH_ET of ET is begin

S <= E1 and E2;

end ARCH_ET;

---

---

(18)

Exemple de programmes

Architecture ARCH_ET of ET is Begin

S <= '1' when E1='1' and E2='1' else '0';

end ARCH_ET;

architecture ARCH_ET of ET is begin

with E1='1' and E2='1' select

S<= '1' when true,

'0' when others;

end ARCH_ET;

architecture ARCH_ET of ET is begin

process (E1, E2) begin

if E1='1' and E2='1' then S<='1' ; else S<='0' ;

end if ; end process ; end ARCH_ET;

architecture ARCH_ET of ET is begin

process (E1, E2) begin

case E1='1' and E2='1' is when true => S<='1' ; when others => S<='0' ; end case ;

end process ; end ARCH_ET;

(19)

Exemple de programme

-- la bibliothèque ieee contient les paquetages dont la déclaration suit library ieee;

--ce paquetage permet l'utilisation des types STD_LOGIC et STD_LOGIC_VECTOR use ieee.std_logic_1164.all;

-- permet d'utiliser l'addition non signée avec le type STD_LOGIC_VECTOR use ieee.std_logic_unsigned.all;

entity COMPTEUR is

-- N définit le nombre de bits du compteur. Initialisé à 4, il peut être modifier ailleurs generic (N: integer := 4);

port (H : in std_logic; --signal d'horloge S : out std_logic_vector (N-1 downto 0) ); --sortie N bits end compteur;

architecture ARCH_COMPTEUR of COMPTEUR is -- déclaration d'un signal pour utilisation interne

signal X : std_logic_vector(N-1 downto 0);

begin

process (H) begin

if (H'event and H = '1') then X <= X + 1 ; end if;

(20)

Exemple de programme

library ieee;

--ce paquetage permet l'utilisation des types STD_LOGIC et STD_LOGIC_VECTOR use ieee.std_logic_1164.all;

-- ce paquetage permet d'utiliser les conversions de types use ieee.std_logic_arith.all;

-- permet d'utiliser l'addition avec le type STD_LOGIC_VECTOR use ieee.std_logic_unsigned.all;

entity COMPTEUR2 is

-- N définit le nombre de bits du compteur. Initialisé à 4, il peut être modifié ailleurs -- M définit le modulo du compteur. Initialisé à 5, il peut être modifié ailleurs

generic (N: integer := 4;

M: integer := 5 );

port (H, RAZ_S, RAZ_AS, OE : in std_logic;

S : out std_logic_vector (N-1 downto 0) );

-- sortie de N bits end COMPTEUR2;

architecture ARCH_COMPTEUR2 of COMPTEUR2 is

signal X : STD_LOGIC_VECTOR (N-1 downto 0);

begin

process (H, RAZ_AS) begin

-- la fonction suivante convertit l'entier 0 en un std_vector_logic de N bits if RAZ_AS = '1' then X <= conv_std_logic_vector (0,N);

elsif (H 'event and H = '1') then

if (RAZ_S='1'or X>=M-1 ) then X <= conv_std_logic_vector (0,N);

else X <= X + 1 ; end if;

end if;

end process;

(21)

Les tableaux

type MEMOIRE is array (0 to M, 0 to N) of std_logic ;

s <= MEMOIRE ( 2,0 ) ;

type MEMOIRE is array (0 to M) of std_logic_vector (0 to N) ;

MEMOIRE(0) <= "1001" ;

(22)

Exemple de programme

library ieee;

use ieee.std_logic_1164.all;

use ieee_std_logic_arith.all;

use ieee.std_logic_unsigned.all;

entity RAM is

generic (N : integer :=4);

PORT( DATA_RD : out std_logic_vector(N-1 DOWNTO 0);

AD_READ, AD_WRITE : in std_logic_vector(2 DOWNTO 0);

DATA_WR : in std_logic_vector(N-1 DOWNTO 0);

WR, H : in std_logic);

end RAM;

architecture ARCH_RAM of RAM is --définition d'un nouveau type

type TYPE_MEM is array (0 to 7) of std_logic_vector(N-1 downto 0);

signal MEM : TYPE_MEM;

begin

-- Lecture ; la fonction conv_integer convertit l'adresse en un entier DATA_RD <= MEM(conv_integer(AD_READ(2 downto 0)));

-- écriture synchrone (étiquette afin de repérer le "process" facilement) ECRITURE : process

begin

wait until H'event and H='1';

if (WR = '1') then

MEM(conv_integer(AD_WRITE(2 downto 0))) <=

DATA_WR;

end if;

(23)

Machines d’états

type ETATS_DE_LA_MACHINE is (E1, E2, ...EN) ;

signal ETAT_ACTUEL : ETAT_DE_LA_MACHINE ;

(24)

Machines d’états

library ieee;

use ieee.std_logic_1164.all;

entity CDE_MOT is

port( H, RAZ : in std_logic;

SORTIES : out std_logic_vector (3 downto 0));

end CDE_MOT;

architecture ARC_CDE OF CDE_MOT is type TYPE_ETAT is (E0, E1, E2, E3, E4);

signal X:TYPE_ETAT;

-- d'après la déclaration du TYPE_ETAT, X sera initialisé à la valeur E0 begin

process (H,RAZ) begin

if RAZ = '1' then X<=E0;

elsif H'event and H = '1' then case X is

when E0 => X <= E1;

when E1 => X <= E2;

when E2 => X <= E3;

when E3 => X <= E4;

when others => X <= E1;

end case;

end if;

end process;

with X select

SORTIES <= "0000" when E0,

"0001" when E1,

"0010" when E2,

"0100" when E3,

(25)

Composants et paquetages

(26)

Composants (exemple)

library bibli_perso;

library ieee;

use ieee.std_logic_1164.all;

entity SYNTHE_NUM is

port (HOR, WRITE, CK : in std_logic;

S : out std_logic_vector (7 downto 0);-- sorties

D : in std_logic_vector (7 downto 0); -- données d'entrée de la RAM

AD : in std_logic_vector (2 downto 0)); --adresses de la RAM end SYNTHE_NUM;

architecture ARCH_SYNTHE of SYNTHE_NUM is component RAM

generic (N : integer);

port (DATA_RD : out std_logic_vector(N-1 downto 0);

AD_READ, AD_WRITE : in std_logic_vector(2 downto 0);

DATA_WR : in std_logic_vector(N-1 downto 0);

WR, H : in std_logic);

end component;

component COMPTEUR

generic (N: integer);

port( H : in std_logic;

S : out std_logic_vector (N-1 downto 0) );

end component;

signal X : std_logic_vector (2 downto 0);

begin

U1: RAM generic map (N=>8)

port map (DATA_RD=>S, AD_READ=>X, AD_WRITE=>AD, DATA_WR=>D, WR=>WRITE, H=>HOR);

U2: COMPTEUR generic map (N=>3)

(27)

Définition d’un paquetage

library ieee;

use ieee.std_logic_1164.all;

package PAK_PERSO is component RAM

generic (N : integer);

port (DATA_RD : out std_logic_vector(N-1 downto 0);

AD_READ, AD_WRITE : in std_logic_vector(2 downto 0);

DATA_WR : in std_logic_vector(N-1 downto 0);

WR, H : in std_logic);

end component;

component COMPTEUR

generic (N: integer);

port( H : in std_logic;

S : out std_logic_vector (N-1 downto 0) );

end component;

(28)

Utilisation d’un paquetage

library bibli_perso;

library ieee;

use ieee.std_logic_1164.all;

use bibli_perso.PAK_PERSO.all;

entity SYNTHE_NUM is

port (HOR, WRITE, CK: in std_logic;

S : out std_logic_vector (7 downto 0);-- sorties

D : in std_logic_vector (7 downto 0); -- données d'entrée de la RAM

AD : in std_logic_vector (2 downto 0)); --adresses de la RAM end SYNTHE_NUM;

architecture ARCH_SYNTHE of SYNTHE_NUM is signal X : std_logic_vector (2 downto 0);

begin

U1: RAM generic map (N=>8)

port map (DATA_RD=>S, AD_READ=>X, AD_WRITE=>AD, DATA_WR=>D, WR=>WRITE, H=>HOR);

U2: COMPTEUR generic map (3) port map (CK, X);

Références

Documents relatifs

Toute description VHDL n’est pas synthétisable Seul un sous-ensemble du Langage va permettre la Seul un sous-ensemble du Langage va permettre la synthèse. VHDL permet de

For store instructions, the source register value is enabled onto the op2 bus, the memory data bus output buffer is enabled, and the write signal is aserted. The next state

Each device technology includes a set of predesigned primitive gate-level components, which can be cells of a standard-cell library or a generic logic cell of an FPGA

One-hot encoding may be the best choice even for CPLDs if the number of states and input conditions are such that the next-state logic for an encoded machine requires multiple

CORRECTION: Obsolete Software List and add Accessory List to the LPOI print

CORRECTION: Revise prints to depict new Triac Driver and change title from SCR DRIVER ASSEMBLY to TRIAC DRIVER ASSEMBLY.. CORRECTION: Change from aluminum bezel

Pour le reste, si vous observez bien les figures 6a et 7 et la liste des compo- sants, vous n’aurez aucune difficulté de montage et cela vous prendra à peine un peu plus

Au cours du quatrième semestre, nous devons réaliser un projet d'étude et réalisation, seul ou par binôme. Ayant un projet qui était propre à ma passion qui est le tir à l’arc,