Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Corso programmazione VHDL - parte 4, Dispense di Elettronica

Programmazione VHDL - Sitemi Integrati - parte 4

Tipologia: Dispense

2018/2019

Caricato il 05/07/2019

dar87
dar87 🇮🇹

4

(1)

6 documenti

1 / 78

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Il VHDL Parte 4: Librerie e packages
1
Corso di Architettura dei Sistemi Integrati
Il linguaggio VHDL
parte 4
Librerie standard
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45
pf46
pf47
pf48
pf49
pf4a
pf4b
pf4c
pf4d
pf4e

Anteprima parziale del testo

Scarica Corso programmazione VHDL - parte 4 e più Dispense in PDF di Elettronica solo su Docsity!

Il linguaggio VHDL

parte 4

Librerie standard

Tipi

architecture nome_architettura of nome_entita is dichiarazioni di tipo dichiarazioni di segnali dichiarazioni di costanti definizione di funzioni definizioni di procedure dichiarazioni di componenti begin statement concorrente

.... end nome_architettura;

tipo predefiniti : boolean (true, false) , bit (0, 1) , integer, real, time

tipo enumerato : è definito elencandone tutti i possibili elementi,

type stato_processore is (reset, stop, wait, go);

Un tipo enumerato è ordinato. Il primo elemento è il più piccolo, mentre

l’ultimo è il più grande.

Nell’esempio precedente abbiamo: reset < stop < wait < go.

Tristate

library ieee; use ieee.std_logic_ 1164. all ; entity dc 2 is port (a, b, en : in std_logic; y : inout std_logic); end dc 2 ; architecture data_flow of dc 2 is begin y <= (a and b) when en =' 1 ' else 'Z'; end ;

Registro ad 8 bit con uscita tristate

library ieee; use ieee.std_logic_1164. all ;

entity reg is

port (clk, reset, en : in std_logic;

y : inout std_logic_vector(7 downto 0) );

end ;

architecture beh of reg is

signal q : std_logic_vector(y' range );

begin

process (clk,reset)

begin

if (reset='1') then

q <= ( others => '0');

elsif rising_edge(clk) then

q <= d;

end if ;

end process ;

y <= q when en ='1' else ( others => 'Z');

end beh;

Registro ad 8 bit con uscita tristate

architecture beh of reg is signal q : std_logic_vector(y' range ); begin process (clk,reset,en) begin if (reset='1') then q <= ( others => '0'); elsif rising_edge(clk) then q <= d; end if ; if en='0' then y <= ( others => 'Z'); else y <= q; end if ; end process ; end beh; In questo istante q cambia, mentre y varia al successivo evento sul clock situazione analoga Attenzione : q compare sia a sinistra che a destra del simbolo di assegnazione

Soluzione

architecture beh of reg is signal q : std_logic_vector(y' range ); begin process (clk,reset,en, q ) begin if (reset='1') then q <= ( others => '0'); elsif rising_edge(clk) then q <= d; end if ; if en='0' then y <= ( others => 'Z'); else y <= q; end if ; end process ; end beh; inserisco q nella sensitivity list La versione iniziale, con l'utilizzo di una variabile è di gran lunga preferibile

std_ulogic

La libreria IEEE 1164 definisce anche il tipo std_ulogic che ha gli stessi 9 valori del tipo std_logic ma non prevede alcuna resolution function.

architecture good of my_design is

signal y,a,b : std_ulogic ;

begin

y <= a and b;

y <= a or b;

end good ;

Si ha un errore in fase di compilazione (driver multipli senza resolution function).

Meglio std_logic o std_ulogic?

Nell’ottica della sintesi sarebbe opportuno utilizzare il tipo std_ulogic In effetti, è invalso l’uso del solo tipo std_logic sia per la simulazione che per la sintesi

Assegnazione di valore ad un array

a(7) <= ‘0’; a(6) <= ‘1’; a(5) <= ‘1’; a(4) <= ‘1’; a(3) <=‘0’; a(2) <= ‘1’; ( 1 ) <= ‘1’; a(0) <= ‘1’; In alternativa: a <= (‘0’, ‘1’, ‘ 1 ’, ‘1’, ‘ 1 ’, ‘1’, ‘ 1 ’, ‘0’); In alternativa: a <= (7 => ‘0’, 0 => ‘0’, others => ‘1’); In alternativa: a <= “01111110”; E’ possibile far riferimento ad una parte ( slice ) di un array: a (7 downto 1) <= "111111";

type byte is array (7 downto 0) of std_logic;

signal a : byte;

Utilizzo scorretto di tipi differenti

library ieee;

use ieee.std_logic_1164. all ;

entity compare is

port ( address : in std_logic_vector(7 downto 0);

x1,x2 : out std_logic);

end ;

architecture beh of compare is

type nibble is array (3 downto 0) of std_logic;

signal h,l : nibble;

begin

h <= address(7 downto 4); -- ERRORE

l <= address(3 downto 0); -- ERRORE

x1 <= '1' when h ="0000" else '0';

x2 <= '1' when l ="0000" else '0';

end beh;

Funzioni

Esempio

library ieee; use ieee.std_logic_ 1164. all ;

entity s is

port (p : in std_logic_vector ( 7 downto 0 );

q : in std_logic_vector ( 15 downto 0 );

y 1 , y 2 : out std_logic);

end ;

architecture beh of s is

function dispari(a : in std_logic_vector)

return std_logic is

variable tmp: std_logic;

begin

tmp:=' 0 ';

for i in a 'low to a 'high loop

if a(i)=' 1 ' then

tmp := not tmp;

end if;

end loop ;

return tmp;

end dispari;

begin

y 1 <= dispari(p);

y 2 <= dispari(q);

end beh;

vettore

unconstrained

Librerie e packages

Sono utilizzati per dichiarare e memorizzare tipi, funzioni, componenti ecc. che possono essere adoperati in una descrizione VHDL.

Librerie e packages

  • I file prodotti compilando un listato VHDL vengono memorizzati in una libreria. (Se il nome della libreria non viene specificato esplicitamente, il compilatore crea ed utilizza una libreria di default chiamata work .)
  • Altri file VHDL possono richiedere l'utilizzo di oggetti in una determinata libreria. In particolare è possibile accedere solo alle entità ed alle architetture compilate nella libreria, ma non alle definizioni di tipi, costanti, funzioni ecc.
  • Per poter utilizzare gli oggetti in libreria è necessario utilizzare la clausola library (ad esempio: library ieee;). Da notare che la clausola: library work; è inclusa implicitamente all’inizio di ogni listato VHDL