VHDL dla układów PLD
Zamiast rysować schemat układu cyfrowego jego
działanie można opisać przy użyciu tzw. języka opisu
sprzętu: ABEL, Verilog, VHDL.
Stanowi to wsad dla syntezy komputerowej.
Język VHDL może być stosowany do projektowania
układów cyfrowych realizowanych w programowalnych
układach scalonych typu CPLD i FPGA oraz technologii
ASIC.
1
1
VHDL format pliku
Ukl_Cyfr.vhd
*.vhd
entity Ukl_Cyfr is
port ( &
WEJÅšCIA I WYJÅšCIA
&
& );
end Ukl_Cyfr;
architecture Arch_1 of Ukl_Cyfr is
begin
&
SPOSÓB DZIAAANIA
&
&
end Arch_1;
2
2
VHDL rodzaje portów
Porty wejściowe
in
Porty wyjściowe
out
buffer
Porty wej-wyj
inout
3
3
VHDL typ std_logic
std_logic
Oznacza, że pojedynczy sygnał cyfrowy może przyjąć
jedną z wartości: U , X , 0 , 1 , Z , W , L , H , .
&
port ( a : in std_logic;
b, c : in std_logic;
y : buffer std_logic );
&
signal x : std_logic;
...
variable z : std_logic;
4
VHDL typ std_logic
std_logic
U stan niezainicjowany, symulator
X wymusza stan nieznany
0 wymusza stan 0
1 wymusza stan 1
Z stan wysokiej impedancji
W słaby stan nieznany (odczyt), symulator
L słabe 0 (odczyt), równoważne połączeniu
przez rezystor z masÄ…
H słabe 1 (odczyt), równoważne połączeniu
przewodu przez rezystor z napięciem zasilania
stan nieokreślony, podobnie jak X
5
VHDL typ std_logic_vector
std_logic_vector( & downto & )
std_logic_vector( & to & )
Oznacza, że sygnał cyfrowy jest wielobitowy oraz każdy jego bit
może przyjąć jedną z wartości: U , X , 0 , 1 , Z , W , L , H , .
&
port ( a : in std_logic_vector( 7 downto 0 );
y : inout std_logic_vector( 31 downto 27 ) );
&
odwołanie do pojedynczego bitu: y(31)
odwołanie do kilku bitów: a(7 downto 5)
6
VHDL typ std_logic...
UWAGA!
Stosowanie typów std_logic i std_logic_vector wymaga
deklaracji użycia biblioteki zawierającej definicję tego typu.
library ieee;
use ieee.std_logic_1164.all;
entity Ukl_Cyfr is
port ( &
& );
end Ukl_Cyfr;
architecture Arch_1 of Ukl_Cyfr is
begin
&
&
end Arch_1;
7
UKAADY KOMBINACYJNE
Multiplekser
Konwerter kodu binarnego na 1 z N
Sumator
Komparator
Bufor trójstanowy
8
VHDL multiplekser
library ieee;
use ieee.std_logic_1164.all;
entity MUX is
port ( A, B, C, D : in std_logic;
SEL : in std_logic_vector(1 downto 0);
Y : out std_logic );
end MUX;
architecture Bech of MUX is
begin
Y <= A when SEL = 00 else
B when SEL = 01 else
C when SEL = 10 else
D;
end Bech;
9
VHDL konwerter kodu binarnego na 1 z N
library ieee;
use ieee.std_logic_1164.all;
entity DEC is
port ( A : in std_logic_vector(2 downto 0);
Y : out std_logic_vector(7 downto 0) );
end DEC;
architecture Bech of DEC is
begin
process( A )
begin
case A is
when 000 => Y <= 00000001 ;
when 001 => Y <= 00000010 ;
when 010 => Y <= 00000100 ;
when 011 => Y <= 00001000 ;
when 100 => Y <= 00010000 ;
when 101 => Y <= 00100000 ;
when 110 => Y <= 01000000 ;
when others => Y <= 10000000 ;
end case;
end process;
10
end Bech;
VHDL sumator (dwóch liczb czterobitowych)
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all; -- funkcje arytmetyczne dla typu std_logic_vector
entity SUM1 is
port ( A, B : in std_logic_vector(3 downto 0);
Y : out std_logic_vector(4 downto 0) );
end SUM1;
architecture Bech of SUM1 is
begin
Y <= ( 0 &A) + ( 0 &B);
end Bech;
& konkatenacja, czyli składanie bitów,
wektorów lub sygnałów
11
VHDL sumator (dwóch liczb N-bitowych A i B)
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity SUM2 is
generic( N : integer := 5 );
port ( A, B : in std_logic_vector( N 1 downto 0 );
Y : out std_logic_vector( N downto 0 ) );
end SUM2 ;
architecture Bech of SUM2 is
begin
Y <= ( 0 &A) + ( 0 &B);
end Bech;
12
VHDL komparator (dwóch liczb czterobitowych A i B)
library ieee;
use ieee.std_logic_1164.all;
entity KOMP is
port ( A, B : in std_logic_vector(3 downto 0);
Y : out std_logic_vector(2 downto 0) );
end KOMP;
architecture Bech of KOMP is
begin
Y(0) <= 1 when A = B else 0 ;
Y(1) <= 1 when A > B else 0 ;
Y(2) <= 1 when A < B else 0 ;
end Bech;
13
VHDL bufor trójstanowy
library ieee;
use ieee.std_logic_1164.all;
entity BUF1 is
port ( A, EN : in std_logic;
Y : out std_logic );
end BUF1;
architecture Bech of BUF1 is
begin
Y <= A when EN = 1 else Z ;
end Bech;
14
PRZERZUTNIKI
15
VHDL zatrzask D
library ieee;
use ieee.std_logic_1164.all;
entity D_Latch is
port ( D, LD : in std_logic;
Q : out std_logic );
end D_Latch;
architecture Bech of D_Latch is
begin
process( D, LD )
begin
if LD = 1 then Q <= D;
end if;
end process;
end Bech;
16
VHDL synchroniczny przerzutnik D
library ieee;
use ieee.std_logic_1164.all;
entity D_FF is
port ( D, C : in std_logic;
Q : out std_logic );
end D_FF;
architecture Bech of D_FF is
begin
process( C )
begin
if rising_edge(C) then
Q <= D;
end if;
end process;
end Bech;
zbocze opadajÄ…ce: falling_edge
17
VHDL synchroniczny przerzutnik D z kasowaniem asynchronicznym
library ieee;
use ieee.std_logic_1164.all;
entity D_FF is
port ( D, C, R : in std_logic;
Q : out std_logic );
end D_FF;
architecture Bech of D_FF is
begin
process( C, R )
begin
if R = 0 then
wszystko asynchroniczne
Q <= 0 ;
elsif rising_edge(C) then
Q <= D;
wszystko synchroniczne
end if;
end process;
end Bech;
18
VHDL synchroniczny przerzutnik D z ustawianiem asynchronicznym
library ieee;
use ieee.std_logic_1164.all;
entity D_FF is
port ( D, C, S : in std_logic;
Q : out std_logic );
end D_FF;
architecture Bech of D_FF is
begin
process( C, S )
begin
if S = 0 then
Q <= 1 ;
elsif rising_edge(C) then
Q <= D;
end if;
end process;
end Bech;
19
VHDL synchroniczny przerzutnik D z kasowaniem i ustawianiem asynchronicznym
library ieee;
use ieee.std_logic_1164.all;
entity D_FF is
port ( D, C, S, R : in std_logic;
Q : out std_logic );
end D_FF;
architecture Bech of D_FF is
begin
process( C, S, R )
begin
if R = 0 then -- kasowanie
Q <= 0 ;
elsif S = 0 then -- ustawianie
Q <= 1 ;
elsif rising_edge(C) then
Q <= D;
end if;
end process;
end Bech;
20
VHDL synchroniczny przerzutnik D z kasowaniem synchronicznym
library ieee;
use ieee.std_logic_1164.all;
entity D_FF is
port ( D, C, R : in std_logic;
Q : out std_logic );
end D_FF;
architecture Bech of D_FF is
begin
process( C )
begin
if rising_edge(C) then
if R = 0 then Q <= 0 ;
else Q <= D;
end if;
end if;
end process;
end Bech;
21
VHDL synchroniczny przerzutnik D z ustawianiem synchronicznym
library ieee;
use ieee.std_logic_1164.all;
entity D_FF is
port ( D, C, S : in std_logic;
Q : out std_logic );
end D_FF;
architecture Bech of D_FF is
begin
process( C )
begin
if rising_edge(C) then
if S = 0 then Q <= 1 ;
else Q <= D;
end if;
end if;
end process;
end Bech;
22
VHDL synchroniczny przerzutnik D z kasowaniem i ustawianiem synchronicznym
library ieee;
use ieee.std_logic_1164.all;
entity D_FF is
port ( D, C, S, R : in std_logic;
Q : out std_logic );
end D_FF;
architecture Bech of D_FF is
begin
process( C )
begin
if rising_edge(C) then
if R = 0 then Q <= 0 ;
elsif S = 0 then Q <= 1 ;
else Q <= D;
end if;
end if;
end process;
end Bech;
23
VHDL synchroniczny przerzutnik JK
library ieee;
use ieee.std_logic_1164.all;
entity JK_FF is
port ( J, K, C : in std_logic;
Q : inout std_logic );
end JK_FF;
architecture Bech1 of JK_FF is
begin
process( C )
begin
if rising_edge(C) then
if J= 1 and K= 0 then Q <= 1 ;
elsif J= 0 and K= 1 then Q <= 0 ;
elsif J= 1 and K= 1 then Q <= not Q;
else Q <= Q;
end if;
end if;
end process;
end Bech1;
24
VHDL synchroniczny przerzutnik JK (inaczej)
library ieee;
use ieee.std_logic_1164.all;
entity JK_FF is
port ( J, K, C : in std_logic;
Q : inout std_logic );
end JK_FF;
architecture Bech2 of JK_FF is
begin
process( C )
begin
if rising_edge(C) then
Q <= ( J and not Q ) or ( not K and Q );
end if;
end process;
end Bech2;
25
VHDL synchroniczny przerzutnik T
library ieee;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_1164.all;
entity T_FF is
entity T_FF is
port ( T, C : in std_logic;
port ( T, C : in std_logic;
Q : inout std_logic );
Q : inout std_logic );
end T_FF;
end T_FF;
architecture Bech1 of T_FF is
architecture Bech2 of T_FF is
begin
begin
process( C )
process( C )
begin
begin
if rising_edge(C) then
if rising_edge(C) then
if T= 1 then
Q <= T xor Q;
Q <= not Q;
end if;
else
end process;
Q <= Q;
end Bech2;
end if;
end if;
end process;
end Bech1;
26
LICZNIKI
Czyli układy, których stan sygnału wyjściowego odpowiada liczbie
wystąpień impulsów na wejściu (zazwyczaj zegarowym)...
27
VHDL synchroniczny licznik binarny modulo 16, zliczający w górę
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
library ieee;
use ieee.std_logic_1164.all;
entity CNT_mod16 is
entity D_FF is
port ( C : in std_logic;
port ( D : in std_logic;
Q : inout std_logic_vector( 3 downto 0 ) );
C : in std_logic;
end CNT_mod16 ;
Q : out std_logic );
end D_FF;
architecture Bech of CNT_mod16 is
architecture Bech of D_FF is
begin
begin
process( C )
process( C )
begin
begin
if rising_edge(C) then if rising_edge(C) then
Q <= D;
Q <= Q + 1; -- dodawanie
end if;
end if;
end process;
end process;
end Bech;
end Bech;
Licznik binarny powstaje z przerzutnika D ( RSz )
28
VHDL synchroniczny licznik binarny modulo 16, zliczający w dół
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity CNT_mod16 is
port ( C : in std_logic;
Q : inout std_logic_vector( 3 downto 0 ) );
end CNT_mod16 ;
architecture Bech of CNT_mod16 is
begin
process( C )
begin
if rising_edge(C) then
Q <= Q 1; -- odejmowanie
end if;
end process;
end Bech;
29
VHDL synchroniczny licznik binarny modulo 16, zliczający w górę,
z kasowaniem asynchronicznym
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity CNT_mod16 is
port ( R, C : in std_logic;
Q : inout std_logic_vector( 3 downto 0 ) );
end CNT_mod16 ;
architecture Bech of CNT_mod16 is
begin
process( C, R )
begin
if R = 0 then Q <= 0000 ; -- kasowanie asynchroniczne
elsif rising_edge(C) then Q <= Q + 1;
end if;
end process;
Zamiast Q <= 0000 ;
end Bech;
można Q <= ( others => 0 );
30
VHDL synchroniczny licznik binarny modulo 16, zliczający w górę,
z wpisem asynchronicznym
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity CNT_mod16 is
port ( LD, C : in std_logic;
A : in std_logic_vector( 3 downto 0 );
Q : inout std_logic_vector( 3 downto 0 ) );
end CNT_mod16 ;
architecture Bech of CNT_mod16 is
begin
process( LD, C, A )
begin
if LD = 0 then Q <= A; -- wpis asynchroniczny
elsif rising_edge(C) then Q <= Q + 1;
end if;
end process;
end Bech;
31
VHDL synchroniczny licznik binarny modulo 16, zliczający w górę,
z wpisem synchronicznym
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity CNT_mod16 is
port ( LD, C : in std_logic;
A : in std_logic_vector( 3 downto 0 );
Q : inout std_logic_vector( 3 downto 0 ) );
end CNT_mod16 ;
architecture Bech of CNT_mod16 is
begin
process( C )
begin
if rising_edge(C) then
if LD = 0 then Q <= A; -- wpis synchroniczny
else Q <= Q + 1;
end if;
end if;
end process;
end Bech;
32
VHDL synchroniczny licznik binarny modulo 16, dwukierunkowy
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity CNT_mod16 is
port ( DIR, C : in std_logic;
Q : inout std_logic_vector( 3 downto 0 ) );
end CNT_mod16 ;
architecture Bech of CNT_mod16 is
begin
process( C )
begin
if rising_edge(C) then
if DIR = 0 then
Q <= Q + 1; -- dodawanie
else
Q <= Q 1; -- odejmowanie
end if;
end if;
end process;
end Bech;
33
VHDL synchroniczny licznik binarny
Zmiany pojemności licznika binarnego dokonujemy poprzez
zmianę liczby bitów sygnału wyjściowego
port( &
Q : inout std_logic_vector( 3 downto 0 );
& );
34
VHDL synchroniczny licznik modulo 10, zliczający w górę
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity CNT_mod10 is
port ( C : in std_logic;
Q : inout std_logic_vector( 3 downto 0 ) );
end CNT_mod10 ;
architecture Bech of CNT_mod10 is
begin
process( C )
begin
if rising_edge(C) then
if Q < 9 then
Q <= Q + 1; -- dodawanie dopóki Q mniejsze od 9
else
Q <= 0; -- zerowanie jeśli Q równe 9
end if;
end if;
end process;
end Bech;
35
VHDL synchroniczny licznik modulo 10, zliczający w dół (wstecz)
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity CNT_mod10 is
port ( C : in std_logic;
Q : inout std_logic_vector(3 downto 0) );
end CNT_mod16 ;
architecture Bech of CNT_mod10 is
begin
process( C )
begin
if rising_edge(C) then
if Q > 0 then
Q <= Q 1; -- odejmowanie dopóki Q większe od 0
else
Q <= 9; -- ustawianie 9 jeśli Q równe 0
end if;
end if;
end process;
end Bech;
36
VHDL synchroniczny licznik modulo N
Zmiany pojemności licznika modulo N dokonujemy poprzez
zmianę liczby bitów sygnału wyjściowego oraz warunku
ograniczajÄ…cego zakres zliczania
port( &
Q : inout std_logic_vector( & downto 0 );
& );
&
if Q < N 1 then Q <= Q + 1;
else Q <= 0;
end if;
&
if Q > 0 then Q <= Q 1;
else Q <= N 1;
Obliczamy N 1
end if;
Dobieramy minimalną liczbę bitów wyjścia Q
37
DZIELNIKI CZSTOTLIWOÅšCI
Czyli układy, których sygnał wyjściowy ma kilkukrotnie mniejszą
częstotliwość niż sygnał wejściowy (zazwyczaj zegarowy)...
38
Najprostszym dzielnikiem jest układ licznika, którego cykl liczenia
jest równy wielokrotności liczby 2,
czyli licznik zliczajÄ…cy w naturalnym kodzie binarnym ( Q <= Q+1; ).
Wówczas wyjściem jest najbardziej znaczący bit (MSB)
a współczynnik wypeÅ‚nienia jest zawsze równy ½.
39
Dla podziału będącego liczbą całkowitą ale nie binarną, można
stosować licznik ze skróconym cyklem liczenia.
Należy ograniczyć liczbę stanów do wartości podziału N, czyli
if Q < N-1 then
Q <= Q + 1; -- dodawanie dopóki Q mniejsze od podziału
else
Q <= (others => 0 );
end if;
Wyjściem jest najbardziej znaczący bit (MSB) ale współczynnik
wypeÅ‚nienia nie jest równy ½.
40
Również licznik Johnsona jest dzielnikiem częstotliwości, którego
podział jest równy podwojonej liczbie jego bitów czyli 2n.
SygnaÅ‚ wyjÅ›ciowy zawsze ma współczynnik wypeÅ‚nienia równy ½.
Szczególny przypadek licznika Johnsona to układ dla n = 1,
którym jest dwójka licząca ( Q <= not Q; ).
41
UKAADY SEKWENCYJNE
Czyli układy opisane grafem stanów...
42
VHDL układy sekwencyjne
library ieee;
use ieee.std_logic_1164.all;
entity U_SEKW is
port ( R, X, C : in std_logic;
Y : out std_logic );
end U_SEKW;
architecture Bech of U_SEKW is
type Stan is ( START, W_LEWO, W_PRAWO, STOP );
signal Aktualny, Nastepny : Stan;
begin
process( R, C ) -- rejestr
begin
if R= 0 then Aktualny <= STOP;
elsif rising_edge(C) then
Aktualny <= Nastepny;
end if;
end process;
43
VHDL układy sekwencyjne cd
process( X, Aktualny ) -- blok kombinacyjny
begin
case Aktualny is
when START => if X= 0 then Nastepny <= START;
else Nastepny <= W_LEWO; end if;
when W_LEWO => if X= 0 then Nastepny <= W_LEWO;
else Nastepny <= W_PRAWO; end if;
when W_PRAWO => if X= 0 then Nastepny <= W_PRAWO;
else Nastepny <= STOP; end if;
when STOP => if X= 0 then Nastepny <= STOP;
else Nastepny <= START; end if;
when others => Nastepny <= STOP; -- przykładowo
end case;
end process;
Y <= 1 when Aktualny = STOP else 0 ; -- sygnał wyjściowy Y
end Bech;
44
REJESTRY
Czyli układy zbudowane z przerzutników
połączonych równolegle lub szeregowo...
45
VHDL zatrzask
-- ZATRZASK 8-BITOWY
library ieee;
use ieee.std_logic_1164.all;
entity REG_Latch is
port ( D : in std_logic_vector( 7 downto 0 );
LD : in std_logic;
Q : out std_logic_vector( 7 downto 0 ) );
end REG_Latch;
architecture Bech of REG_Latch is
begin
process( D, LD ) begin
if LD = 1 then Q <= D; end if;
end process;
end Bech;
46
VHDL rejestr
-- REJESTR 8-BITOWY
library ieee;
use ieee.std_logic_1164.all;
entity REG is
port ( D : in std_logic_vector(7 downto 0);
CK : in std_logic;
Q : out std_logic_vector(7 downto 0) );
end REG;
architecture Bech of REG is
begin
process( CK )
begin
if rising_edge(CK) then Q <= D; end if;
end process;
end Bech;
47
VHDL rejestr przesuwny (szeregowo-równoległy)
library ieee;
use ieee.std_logic_1164.all;
entity SH_REG is
port ( D : in std_logic;
CK : in std_logic;
Q : inout std_logic_vector(7 downto 0) );
end SH_REG;
architecture Bech of SH_REG is
begin
process( CK )
begin
if rising_edge(CK) then
Q <= D&Q(7 downto 1); -- przesuw w prawo
-- Q <= Q(6 downto 0)&D; -- lub przesuw w lewo
end if;
end process;
end Bech;
48
VHDL rejestr przesuwny (równoległo-szeregowy)
library ieee;
use ieee.std_logic_1164.all;
entity SH_REG is
port ( Din : in std_logic _vector( 7 downto 0 );
LD : in std_logic;
CK : in std_logic;
Dout : out std_logic );
end SH_REG;
architecture Bech of SH_REG is
signal Q : std_logic_vector(7 downto 0)
begin
process( LD, CK )
begin
if LD = 1 then -- równoległy wpis asynchroniczny
Q <= Din;
elsif rising_edge(CK) then
Q <= 0 &Q(7 downto 1); -- przesuw w prawo
end if;
end process;
Dout <= Q(0);
49
end Bech;
UKAADY STRUKTURALNE
Czyli układy hierarchiczne zbudowane z komponentów
opisanych w osobnych plikach zawierajÄ…cych kody VHDL
lub w pakietach, połączonych w nadrzędnym pliku .vhd
50
VHDL układ hierarchiczny
library ieee;
use ieee.std_logic_1164.all;
-- use work.______.all;
entity TOP is
port ( A, B, C : in std_logic;
Y : out std_logic );
end TOP ;
component Inv_Gate
architecture Bech of TOP is
port( a : in std_logic;
y : out std_logic );
component And_Gate
end component;
port( a, b : in std_logic;
y : out std_logic );
signal g, h : std_logic;
end component;
begin
component Or_Gate
port( a, b : in std_logic;
U1 : And_Gate port map( A, B, g );
y : out std_logic );
U2 : Or_Gate port map( g, C, h );
end component;
U3 : Inv_Gate port map( h, Y );
end Bech;
51
Wyszukiwarka
Podobne podstrony:
PUP niest wyk1 v104 Prace przy urzadzeniach i instalacjach energetycznych v1 1Analog 12 72 Vinge, Vernor Original Sin v1 0SIMULINK MATLAB to VHDL RouteSteven Mark TPU?Q v1 0Estleman, Loren D [SS] Preminger s Gold [v1 0]Lamberty, JT Young Beaker v1 0Instrukcja obsługi Ferguson Ariva T65 PL v1 50PUP 10 6BD V600 L3 C A3 V1[1] 1 id 2157 NieznanyTracey, Robyn [SS] Siren Singers [v1 0]barcelona 6 directory v1 m56577569830521452CurrPorts v1 10 readmeKornbluth, CM What Sorghum Says v1 0P N Elrod The Vampire Files 04 Art in the Blood (v1 1)C550 PCB P01?50? C L3 V1One Step From Earth v1 01więcej podobnych podstron