Automatizovani dizajn elektronskih kola i sistema�Simulacija elektronskih kola - SEK
VHDL Programiranje
Specijalističke studije, Master studije, ETF Podgorica
Primijenjene studije, ETF
Prof dr Radovan Stojanović
Univerzitet Crne Gore
Akademska, 2024
��1. U V O D
Opis kursa (1)
Opis kursa (2)
Opis kursa (3)
Opis kursa (4)
Lektira
Na našem jeziku i engleskom (VHDL):
Uvod
Evolucija
Jack Kilby, TI, 1959 konstruiše prvo
integrisano kolo (IC).
Robert Noyce
Fairchild
Intel, 1959, razvija
prvo pravo IC.
Integarcija
1961: TI i Fairchild izbacuju prvo logičko IC (dupli flip flop sa 4 tranzistora), >$50!
Integarcija…
1963: Već imamo 4 flip-flopa.
1967: Fairchild prvi “programabilno” (semi-custom) čip. Tranzistori (organizovani u kolone) mogli su biti konfigurisani u različita kola (~150 logičkih kapija).
Electronics, Volume 38, Number 8, April 19, 1965
Murovo proročanstvo
Murovo proročanstvo…
1968: Prvi operacioni pojačavač, početak integrisane analogne ere
1968: Noyce and Moore leave Fairchild to
form Intel.
1970: Intel, 1k bit RAM, 1103.
1971: Ted Hoff u Intelu projektuje prvi
microprocessor, 4004, 4-bit buss, 108 KHz,
2300 transistora, 10 um process.
1972: 8080 pronadjen, 8 bit, 3,500 tranz.
Murovo proročanstvo...
• 1978 – prvi 16-bitni mikroprocesor (Intel 8086).
• 1981 – prvi IBM PC XT
• 1984 – prva 1 Mb memorija.
• 1995 – prva eksperimentalna 1 Gb memorija
• 1985 – prvi 32-bitni procesor (Intel 80386)
• 1989 – Intel 80486, 1.2 miliona tranzistora.
• 1993 – Intel Pentium I.
• 2000 – Nevjerovatan rast mobilne telefonije u svetu.
1982: Time-ov čovjek
godine, kompjuter
Kontraverza
“I think there is a world market for maybe five computers” IBM Chairman Thomas Watson, 1943
“640,000 bytes of memory ought to be enough for anybody”, Bill Gates, 1981.
“The Internet will catastrophically collapse in 1996”, Robert Metcalfe
Murovo proročantvo...
Moore
Realni trend
GWP
EDA
EDA�(zašto?)
Time-to-market
Složenost
Problemi
Heterogenost
Stojanovic, Inaguraciono, Maj, 2013.
EDA fakti
Dimenzije tranzistora
Silicon atom = 0.24nm
Rhinovirus = 20nm
2008 Core 2 Quad, 45nm
2007 Core 2 Duo, 65nm
2006 Dual Core, 65nm
2005 Pentium D, 90nm
2003 Pentium M, 0,13um
2002 Itanium 2, 0,18um
2000 Pentium 4, 0,18um
1999 Celeron, 0,25um
1999 Pentium III, 0,25um
Očekivalo se da 2000ta bude kritična
Zašto AD? (1)
Neki od čipova visoke koncetracije
Gustina pakovanja
Intel Pentium (IV) Microprocessor (physical layout),
2000 to 2008
Ekonomski aspekti EDA
Digitalni dizajn na ETF-u
Circuit’s design�pristupi i softveri
Rezultati
(produktivnost projektovanja)
(softver)
Fizički nivo – transistor entry
(Calma, Computervision, Magic)
Šematski nivo - Schematic entry
(Daisy, Mentor, Valid)
Sinteza –syntese
(Cadence, Synopsys, Mentor)
Visoki nivo
abstarkcije, MATLAB,
System C ?
Šta je sledeće?
U korjenu svega:
Projektovanje digitalnih kola visoke integracije�VHDL & FPGA
Faze projektovanja
Pakovanje
Fabri-�kacija
Fizički
Dizajn
Tehnološko
mapiranje
Sinteza
Specifikacija
Opis na
visokom
nivou
Funkcionalni
Opis
Smeštanje�& Povezivanje
X=(AB*CD)+
(A+D)+(A(B+C))
Y = (A(B+C)+AC+
D+A(BC+D))
Gate-level
Opis
Logički�Opis
Faze logičkog i fizičkog projektovanja…
Predmet našeg interesovanja
Naši primjeri
Od ideje do realizacije, radovi studenata
FPGA kolo za racunanje kvadratnog korjena
FPGA VGA kontroler
FPGA čip za mjerenje krvnog pritiska
FPGA
Čip za mjerenje krvnog pritiska
Čitav sistem za mjerenje
krvnog pritiska na jednom
čipu. Algoritmi obrade
Signala od filtera, preko
Waveleta do FFT, sve
u kodu (VHDL)
Knezevic Sasa, 2013
Tok projektovanja - “Design flow”
XC4000
XC4000
XC4000
3
Design Entry direktno šema ili unošenje programa (koda), VHDL, and/or Verilog.
Implementation Kompajliranje, analiza, simulacija, tajmming, korekcija
Uploading, direktno u čipove, pomoću ISP ili programatora
1
2
Tok projektovanja - Primjer
Konstruisemo kolo (čip) koji obavlja funkciju alarma za automobil. Alarm se uključuje i isključuje pomoću prekidača za uključivanje, što se signalizira crvenom LED diodom, alarm uključen. Kada se bilo koja od 5 vrata otvore, ako je alarm uključen, aktivira se izlaz za sirenu, izlaz alarma.
a
b
c
d
e
ao
onal
l1
Alarm
Vcc=5V
a, b, c, d, e, onal
Otvaranje vrata otvara prekidac,
Dovodeci logicku “1” na jedan od
ulaza “a….e”. Zatim se aktivira a0, logicka “1”,
ako je I1 uklucen. Znaci, logicki ulaz, dovodimo
Preko prekidaca “0” ili “1”, a logicki izlaz provjeravamo pomocu LED diode, “0”” ili “1”
Step1: Napravimo kod alarma ili semu
Step2: Provjerimo ispravnost koda, kompalacijom i simulacijom
Step3: Ubacimo kod u cip.
Step 4: Provjerimo funkcionalnost na ploci
a0, I1
ENTITY alarm IS
PORT
(
a, b, c, d, e, onal : IN BIT;
ao,l1 : OUT BIT
);
END alarm;
ARCHITECTURE myarch OF alarm IS
BEGIN
ao<= (a or b or c or d or e) and onal;
l1<=not(not onal);
END myarch;
DE2-70 FPGA pins
Onal SW[0] PIN_AA23
a SW[1] PIN_AB26
b SW[2] PIN_AB25
c SW[3] PIN_AC27
d SW[4] PIN_AC26
e SW[5] PIN_AC24
11 LEDR[0] PIN_AJ6
ao LEDR[1] PIN_AK5
Ako je “onal” SW[0] ukljucen, to idicira LEDR[0], kolo je sposobno da funkcioniše; Izlaz “ao” koji je vezan na LEDR[1] se automatski aktivira ako su bilo koja od 5 vrata “a…e” otvorena (pri otvaranju vrata se aktiviraju odgovarajući mikroprekidači, koje ovdje simuliramo sa Sw[1]…Sw[5].
Tok projektovanja, primjer
Cyclone II EP2C70F896
Cyclone II EP2C70F896
A B C Y�0 0 0 0�0 0 1 0�0 1 0 0�0 1 1 1�1 0 0 0�1 0 1 1�1 1 0 1�1 1 1 1
--- Cyclone II EP2C70F896
a SW[1] PIN_AB26
b SW[2] PIN_AB25
c SW[3] PIN_AC27
y LEDR[0] PIN_AJ6
Tok projektovanja, primjer
Realizovati primjer preko seme i koda, “mayority_vote”
VHDL
(IEEE 1076-1993) za opis elektronskog hardvera.
(Very High Speed Integrated Circuit)
Hardware Description Language
(slično C-u, Paskalu, itd)
Maximalno tačan i pouzdan dizajn uz najmanju
cijenu koštanja u najkraćem roku razvijanja.
Istorija
potpisali Ugovor o razvijanju VHDL-a
standard 1076-1987 i 1988 ANSI standard.
re-standardizovan, VHDL-1993.
Struktura koda
Model “crne kutije”
y
x
carry
resut
enable
Interna
Funkcionalnost
Half-adder
Spoljašni izvodi
x
y
enable
carry
result
Half Adder
Entitet
x
y
carry
result
Half
Adder
ENTITY half_adder IS
PORT( x, y, enable: IN BIT;
carry, result: OUT BIT);
END half_adder;
a[3..0]
b[3..0]
equals
Byn
Comp
entity eq_comp4 is
port (
a:in bit_vector(3 downto 0);
b:in bit_vector(3 downto 0);
equals: out bit );
end eq_comp4;
Arhitektura (1)
Nivo abstrakcije
Strukturni
opis
Opis
ponašanja
paralelno
(istovremeno)
serijsko
(redosledno)
Ili (najčešće) kombinacijom
A
B
B<= NOT A
Fizički
(implementacioni)
opis
Arhitektura (2)
(ovdje u0,1,2,3,4). Podrazumijeva se da je korisnik familijaran sa električnom šemom. U jednom programu se daje opis interkonekcije komponenti, spoljašnih izvoda i unutrašnjih pomoćnih izvoda.
Šema binarnog komparatora 4-bitnog
Arhitektura (3)
library ieee;
use ieee.std_logic_1164.all;
entity eq_comp4 is
port (
a : in std_logic_vector(3 down_to 0);
b : in std_logic_vector(3 down_to 0);
equals: out std_logic );
end eq_comp4;
architecture struct of eq_comp4 is
signal x : std_logic_vector(0 to 3);
begin
u0: xnor_2 port map (a(0), b(0), x(0));
u1: xnor_2 port map (a(1), b(1), x(1));
u2: xnor_2 port map (a(2), b(2), x(2));
u3: xnor_2 port map (a(3), b(3), x(3));
u4: and_4 port map (x(0), x(1), x(2), x(3), equals );
end struct;
Mapiranje
Strukturalni opis, kod
Arhitektura (4)
ARCHITECTURE half_adder_b OF half_adder IS
BEGIN
carry <= enable AND (x AND y);
result <= enable AND (x XOR y);
END half_adder_b;
opis ponašanja, paraleni
Arhitektura (5)
ARCHITECTURE half_adder_a OF half_adder IS
BEGIN
PROCESS (x, y, enable)
BEGIN
IF enable = ‘1’ THEN
result <= x XOR y;
carry <= x AND y;
ELSE
carry <= ‘0’;
result <= ‘0’;
END IF;
END PROCESS;
END half_adder_a;
opis ponašanja, serijski
Entity, sintaksa
entity program_rom is
port ( address : in bit_vector (14 downto 0) ;
data : out bit_vector (7 downto 0) ;
enable : in bit );
subtype instruction_byte is bit_vector (7 downto 0);
type program is array (0 to 2**14-1) of instruction_byte;
end entity program_rom;
Samo type deklaracija, signal
deklaracija i konstante, ne variable.
entity entity_name is � [generics] � [ports] � [declarations (types, constants, signals)] � [definitions (functions, procedures)] �[begin statements] – ne upotrebljava se
end [entity_name];
Sintaksa u širem smislu
Architektura, sintaksa
arch_body <=
architecture id of entity_name is
{ block_decl_item }
begin
{ concurrent_stmt }
end [ architecture ] [ id ] ;
Ime arhitekture
Ime entiteta
Process i
component
izrazi
Type, signal
i constant
deklaracije.
Architecture, primjer
architecture primitive of and_or_inv is
signal and_a, and_b, or_a_b : bit;
begin
and_a: process is
begin
and_a <= a1 and a2;
wait on a1, a2;
end process;
……
end architecture;
Primjer #1
Simbol, blok šema
Logička šema
ENTITY half_adder IS
PORT( x, y, enable: IN BIT;
carry, result: OUT BIT);
END half_adder;
ARCHITECTURE half_adder_b OF
half_adder IS
BEGIN
carry <= enable AND (x AND y);
result <= enable AND (x XOR y);
END half_adder_b;
enable, x, y, result, carry
1 0 0 0 0
1 1 0 1 0
1 0 1 1 0
1 1 1 0 1
0 x x 0 0
Tabela stanja - funkcionalnost
C1
VHDL kod
Klasična implementacija
S <= A XOR B;
C <= A AND B;
S <= A XOR B XOR Cin ;
Cout <= (A AND B) OR
(Cin AND A) OR (Cin AND B)
Sema
Logika
čip
7486
Čip
7408
Zaključak: U slučaju klasične implementacije polusabirača trebamo 2 klasična TTL kola, a već za puni sabirač stvari se komplikuju pa trebamo 3 TTL kola.
Čip
7432
8_bitni sabirac
Fo
Ao
Bo
Cout
Cin
#include <stdio.h>
void main(void)
{
uint 8_t a, b;
Unit16_t c;
c= (unit 16_t)(a+b);
}
+
B[0..7]
A[0..7]
F[8..0]
F8
Cout
Cin
C code
Puni sabirac preko polu sabiraca
8bits full adder
Half-adder>Full_adder>8bits full adder
C1
difinition of the component fulladder
library IEEE;
use IEEE.std_logic_1164.all;
ENTITY fulladder IS
PORT( A, B, Cin : IN STD_LOGIC;
Sum, Cout : OUT STD_LOGIC);
END ENTITY fulladder;
ARCHITECTURE logicfunc OF fulladder IS
BEGIN
Sum <= A xor B xor Cin;
Cout <= (A and B) or (( A xor B) and Cin);
END ARCHITECTURE logicfunc;
Klasična implementacija u okviru jednog kola 4 bitni sabirač
C4
C0
8bits adder preko 1bit full adder
Cin
Cout
S
-- difinition of the component fulladder
library IEEE;
use IEEE.std_logic_1164.all;
ENTITY fulladder IS
PORT( A, B, Cin : IN STD_LOGIC;
Sum, Cout : OUT STD_LOGIC);
END ENTITY fulladder;
ARCHITECTURE logicfunc OF fulladder IS
BEGIN
Sum <= A xor B xor Cin;
Cout <= (A and B) or (( A xor B) and Cin);
END ARCHITECTURE logicfunc;
full_adder
C1
Vježba #1: �Unos, kompajliranje i simulacija�
C1
Vježba #1, koraci 1-6
enable, x, y, result, carry
1 0 0 0 0 (1)
1 1 0 1 0 (2)
1 0 1 1 0 (3)
1 1 1 0 1 (4)
0 x x 0 0 (5)
(1)
(2)
(3)
(4)
(5)
ENTITY half_adder IS
PORT( x, y, enable: IN BIT;
carry, result: OUT BIT);
END half_adder;
ARCHITECTURE half_adder_b OF
half_adder IS
BEGIN
carry <= enable AND (x AND y);
result <= enable AND (x XOR y);
END half_adder_b;
Kod
Kompalacija
Simulacija
Verifikacija.
Da li dobijamo na simulacionim
dijagramima ono sto odgovara
tabeli stanja?
Moduli
Ako je objekt deklarisan i definisan u modulu on može biti korišten u svim VHDL programima.
U modulima se preporučuje definisanje globalnih informacija, značajnih parametara kao i osnovnih komponenti u. Nesto slično kao “include” u C-u.
Modul sadrži “deklarativni” i “body” dio. Ponekad može samo figurisati deklarativni dio.
Primjer deklaracije modula: �
package MY_PACK is � type SPEED is (STOP, SLOW, MEDIUM, FAST); � component HA � port (I1, I2 : in bit; S, C : out bit); � end component; � constant DELAY_TIME : time; � function INT2BIT_VEC (INT_VALUE : integer) � return bit_vector; �end MY_PACK;
Primjer “body-a”: �
package body MY_PACK is � constant DELAY_TIME : time := 1.25 ns; � function INT2BIT_VEC (INT_VALUE : integer) � return bit_vector is � begin � -- sequential behavioral description
(omitted here) � end INT2BIT_VEC; �end MY_PACK;
Biblioteke
Biblioteke...
All operator functions to support types)
Biblioteke...
STD_LOGIC_1164:
Declaration: �type std_logic is ( � 'U', -- uninitialized � 'X', -- forcing unknown � '0', -- forcing 0 � '1', -- forcing 1 � 'Z', -- high impedance � 'W', -- weak unknown � 'L', -- weak 0 � 'H', -- weak 1 � '-' ); -- "don't care"
ENTITY mux2to1 IS
PORT( d0, d1, s :IN STD_LOGIC;
f :OUT STD_LOGIC);
END mux2to1;
ARCHITECTURE behavior OF mux2to1 IS
BEGIN
WITH s SELECT
f <= d0 WHEN '0',
d1 WHEN OTHERS;
END behavior;
LIBRARY ieee;
USE ieee.std_logic_1164.all;
Sintaksa upotrebe biblioteke:
LIBRARY <any_name>;
USE <any_name>.<package_name>.all;
Pozivanje biblioteke
Mux4to1 preko Mux2to1
d0
d1
f
s
mux2to1
d0
d1
f
s
mux2to1
d0
d1
f
s
mux2to1
wo
w1
w2
w3
sel0
sel1
I1
I2
Moduli…
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE work.mux2to1_package.all;
ENTITY mux4to1 IS
PORT(w0, w1, w2, w3, sel0, sel1 :IN STD_LOGIC;
f :OUT STD_LOGIC);
END mux4to1;
ARCHITECTURE structure OF mux4to1 IS
SIGNAL I1, I2 :STD_LOGIC;
BEGIN
u1:mux2to1 PORT MAP(w0, w1, sel0, I1);
u2:mux2to1 PORT MAP(w2, w3, sel0, I2);
u3:mux2to1 PORT MAP(I1, I2, sel1, f);
END structure;
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY mux2to1 IS
PORT (d0, d1, s :IN STD_LOGIC;
f :OUT STD_LOGIC);
END mux2to1;
ARCHITECTURE LogicFunc OF mux2to1 IS
BEGIN
f <= (d0 AND (NOT s)) OR (d1 AND s);
END LogicFunc;
LIBRARY ieee;
USE ieee.std_logic_1164.all;
PACKAGE mux2to1_package IS
COMPONENT mux2to1
PORT (d0, d1, s :IN STD_LOGIC;
f :OUT STD_LOGIC);
END COMPONENT;
END mux2to1_package;
Fajl#1 u radnom direktrorijumu, mora
biti kompajliran (mux2to1.vhd)
Fajl#2, trenutni projekat (mux4to1.vhd)
NAPOMENA: Pri kompajliranju mux4to1.vhd kao projekta u
Qurtusu II, nije dovoljno ukključiti package sa USE
work.mux2to1_package.all; već treba mux2to1.vhd dodati
projektu sa Project-> Add/Remove files in Project…
C1
C1
Komponenta kao dio koda
-- Include the componente which is defined in the same file
library ieee;
use ieee.std_logic_1164.all;
entity adder4_combin is
port( X, Y : in std_logic_vector (3 downto 0);
Ci : in std_logic;
S : out std_logic_vector (3 downto 0);
Co : out std_logic);
end entity adder4_combin;
architecture structure of adder4_combin is
signal C : std_logic_vector (0 to 2);
-- declaration of the component
component fulladder is
port ( A, B, Cin : in std_logic;
Sum, Cout : out std_logic);
end component fulladder;
begin
FA_0: fulladder port map (X(0), Y(0), Ci, S(0), C(0));
FA_1: fulladder port map (X(1), Y(1), C(0), S(1), C(1));
FA_2: fulladder port map (X(2), Y(2), C(1), S(2), C(2));
FA_3: fulladder port map (X(3), Y(3), C(2), S(3), Co);
end architecture structure;
-- difinition of the component fulladder
library IEEE;
use IEEE.std_logic_1164.all;
ENTITY fulladder IS
PORT( A, B, Cin : IN STD_LOGIC;
Sum, Cout : OUT STD_LOGIC);
END ENTITY fulladder;
ARCHITECTURE logicfunc OF fulladder IS
BEGIN
Sum <= A xor B xor Cin;
Cout <= (A and B) or (( A xor B) and Cin);
END ARCHITECTURE logicfunc;
FA_0
FA_1
FA_2
FA_3
C(0)
C(1)
C(2)
C(3)
Co
X(0)
Y(0)
S(0)
C1
Library…
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity adder is
port(A,B : in std_logic_vector(7 downto 0);
SUM : out std_logic_vector(8 downto 0);
end adder;
architecture archi of adder is
begin
-- ??? SUM <= A + B;
SUM <= ('0' & A) + ('0' & B);
end archi;
VHDL concatenation operator (&) je upotrijebljen da doda nulu sa lijeva brojeva A i B prije sabiranja.
RESULT <= ('0' & NUMBER); -- join a 0 to the beginning of NUMBER and put into RESULT
RESULT <= (NUMBER & '0'); -- join a 0 to the end of NUMBER and put into RESULT
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
USE ieee.std_logic_arith.all;
entity adder is
port(A,B : in std_logic_vector(7 downto 0);
SUM : out integer);
end adder;
architecture archi of adder is
begin
SUM <= CONV_INTEGER(A+B);
end archi;
8bits adder using different libraries
C1
C1
NAČINI MODELOVANJA (kodiranja)
PARALELNO kodiranje
assignment WHEN condition ELSE
assignment WHEN condition ELSE
...;
WITH identifier SELECT
assignment WHEN value,
· Primjer:
------ With WHEN/ELSE -------------------------
outp <= "000" WHEN (inp='0' OR reset='1') ELSE
"001" WHEN ctl='1' ELSE
"010";
---- With WITH/SELECT/WHEN --------------------
WITH control SELECT
output <= "000" WHEN reset,
"111" WHEN set,
UNAFFECTED WHEN OTHERS;
Sekvencijalno modelovanje
STRUKTURALNO KODIRANJE
STRUKTURALNO KODIRANJE...
COMPONENT component_name IS
PORT ( port_name : signal_mode signal_type; port_name : signal_mode signal_type;
...);
END COMPONENT;
- Sintaksa povezivanja komponente:
label: component_name PORT MAP (port_list);
Strukturalno kodiranje, primjer #5
· Primer deklaracije PACKAGE koji sadrži komponenate:
----- File my_components.vhd: ---------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
------------------------
PACKAGE my_components IS
------ inverter: -------
COMPONENT inverter IS
PORT (a: IN STD_LOGIC; b: OUT STD_LOGIC);
END COMPONENT;
------ 2-input nand: ---
COMPONENT nand_2 IS
PORT (a, b: IN STD_LOGIC; c: OUT STD_LOGIC);
END COMPONENT;
------ 3-input nand: ---
COMPONENT nand_3 IS
PORT (a, b, c: IN STD_LOGIC; d: OUT STD_LOGIC);
END COMPONENT;
END my_components;
sa datim komponentama:
----- File project.vhd: ---------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE work.my_components.all;
---------------------------------
ENTITY project IS
PORT ( a, b, c, d: IN STD_LOGIC;
x, y: OUT STD_LOGIC);
END project;
---------------------------------
ARCHITECTURE structural OF project IS
SIGNAL w: STD_LOGIC;
BEGIN
U1: inverter PORT MAP (b, w);
U2: nand_2 PORT MAP (a, b, x);
U3: nand_3 PORT MAP (w, c, d, y);
END structural;
C1
“Behavioral”…
�
library ieee;
use ieee.std_logic_1164.all;
entity MUX41 is
port --define inputs and outputs
(
S1 : in bit; -- input S1
S0 : in bit;
D3 : in bit;
D2 : in bit;
D1 : in bit;
D0 : in bit;
Y : out bit -- output Y, note: NO ‘;’ used on the last line
);
end MUX41;
architecture logic of MUX41 is -- Note MUX41 is the same as entity name above
begin
Y <= (D0 and (not S1) and (not S0)) or
(D1 and (not S1) and S0 ) or
(D2 and S1 and (not S0)) or
(D3 and S1 and S0 ) ;
end logic; -- Note matching names ‘logic’
library ieee;
use ieee.std_logic_1164.all;
entity MUX2to1 is port(
A, B: in std_logic_vector(7 downto 0);
Sel: in std_logic;
Y: out std_logic_vector(7 downto 0));
end MUX2to1;
architecture behavior of MUX2to1 is
begin
process (Sel, A, B) -- rerun process if any changes, sensitivity list, all inputs
begin
if (Sel = '1') then
Y <= B;
else
Y <= A;
end if; -- note that *end if* is two words
end process;
end behavior;
library ieee;
use ieee.std_logic_1164.all;
entity MUX2to1 is port(
A, B: in std_logic_vector(7 downto 0);
Sel: in std_logic;
Y: out std_logic_vector(7 downto 0));
end MUX2to1;
architecture behavior of MUX2to1 is
begin
process (Sel, A, B) -- rerun process if any changes, sensitivity list, all inputs
begin
case Sel is
when '0' =>
Y <= A;
when '1' =>
Y <=B;
end case;
end process;
end behavior;
logic
if/else
case
C1
C1
C1
Vježba #2
Ideja integracije
Veza izmedju hiararhijskih nivoa u projektu
Tipovi kašnjenja
Input
delay
Output
Transport delay
-- TRANSPORT delay example
Output <= TRANSPORT NOT Input AFTER 10 ns;
0 5 10 15 20 25 30 35
Input
Output
10ns
Inertial delay
Nema uticaja jer je 5ns
Output <= NOT Input AFTER 10 ns;
-- Propagation delay and minimum pulse width are 10ns
Input
Output
0 5 10 15 20 25 30 35
target <= [REJECT time_expression] INERTIAL waveform;
Drugi impuls se invertuje poslije
10ns
Inertial delay...
Output <= REJECT 5ns INERTIAL NOT Input AFTER 10ns;
Input
Output
0 5 10 15 20 25 30 35
“klin”
Inertial vs Transport
Glavna razlika: �inertial delay je “default” delay,i.e to je
kasnjenje samih komponenti,
dok je “transport” vezan za
provodnike (zice-wire) .
Delta delay=0
A
NAND gate “okida” prvo:
IN: 1->0
A: 0->1
B: 1->0
C: 0->0
AND gate “okida” prvo:
IN: 1->0
A: 0->1
C: 0->1
B: 1->0
C: 1->0
1
IN:
1->0
B
C
NAND
AND
NOT
Jos o kasnjenju…
q<=r nor nq after 1ns;
nq<=s nor q after 1ns;
q<=transport r nor nq after 1ns;
nq<=transport s nor q after 1ns;
Delta delay
Output <= NOT Input;
-- Output assumes new value in one delta cycle
-- Primjer realizacije RS flip flopa
-- Uociti delta delay
ENTITY rsff IS
PORT (r, s: IN BIT;
q, qn: INOUT BIT);
END rsff;
ARCHITECTURE behave OF rsff IS
BEGIN
q <= r NOR qn;
qn <= s NOR q;
END behave;
Delta delay
C1
Tipovi podataka u VHDLu
Types
Access
Scalar
Composite
Array
Record
Integer
Real
Enumerated
Physical
Skalarni tipovi podataka
ARCHITECTURE test_int OF test IS
BEGIN
PROCESS (X)
VARIABLE a: INTEGER;
BEGIN
a := 1; -- OK
a := -1; -- OK
a := 1.0; -- illegal
END PROCESS;
END test_int;
Skalarni tipovi ...
ARCHITECTURE test_real OF test IS
BEGIN
PROCESS (X)
VARIABLE a: REAL;
BEGIN
a := 1.3; -- OK
a := -7.5; -- OK
a := 1; -- illegal
a := 1.7E13; -- OK
a := 5.3 ns; -- illegal
END PROCESS;
END test_real;
Nenumerisani i fizički
TYPE binary IS ( ON, OFF );
... some statements ...
ARCHITECTURE test_enum OF test IS
BEGIN
PROCESS (X)
VARIABLE a: binary;
BEGIN
a := ON; -- OK
... more statements ...
a := OFF; -- OK
... more statements ...
END PROCESS;
END test_enum;
Nenumerisani i fizički...
TYPE resistance IS RANGE 0 TO 10000000
UNITS
ohm; -- ohm
Kohm = 1000 ohm; -- i.e. 1 KΩ
Mohm = 1000 kohm; -- i.e. 1 MΩ
END UNITS;
Kompozitni tipovi
TYPE data_bus IS ARRAY(0 TO 31) OF BIT;
0
31
0
1
...element indices...
...array values...
VARIABLE X : data_bus;
VARIABLE Y : BIT;
Y := X(12); -- Y gets value of element at index 12
Kompozitni tipovi...
TYPE reg_type IS ARRAY(15 DOWNTO 0) OF BIT;
0
1
15
0
...element indices...
...array values...
VARIABLE X : reg_type;
VARIABLE Y : BIT;
Y := X(4); -- Y gets value of element at index 4
Kompozitni tipovi ...
type MEMORY is array (0 to 7, 0 to 3) of bit; �... 8×4 bit array �constant ROM: MEMORY := ( ('0','0','0','0'), � ('0','0','0','1'), � ('0','0','1','0'), � ('0','0','1','1'), � ('0','1','0','0'), � ('0','1','0','1'), � ('0','1','1','0'), � ('0','1','1','1')); �variable DATA_BIT: bit; �... �-- access to one element: �DATA_BIT := ROM (5,3);
Kompozitni tipovi...
TYPE binary IS ( ON, OFF );
TYPE switch_info IS
RECORD
status : BINARY;
IDnumber : INTEGER;
END RECORD;
VARIABLE switch : switch_info;
switch.status := ON; -- status of the switch
switch.IDnumber := 30; -- e.g. number of the switch
Pristupni tip
type CELL; -- incomplete type �type LINK is access CELL; -- access type �type CELL is --- full type declaration for CELL � record � VALUE : integer; � NEXTP : LINK; � end; �variable HEAD, TEMP : LINK; -- pointer to CELL �... �TEMP := new CELL'(0, null); -- new data object with initial values �for I in 1 to 5 loop � HEAD := new CELL; --additional objects � HEAD.VALUE := I; --access to record element � HEAD.NEXTP := TEMP; � TEMP := HEAD; �end loop; �... �deallocate(TEMP); -- free the memory ��-- allocate new memory �new CELL; -- new object �new CELL'(I, TEMP); ... with initial values
Pod-tipovi
SUBTYPE name IS base_type RANGE <user range>;
SUBTYPE first_ten IS INTEGER RANGE 0 TO 9;
VHDL objekti
koje koriste dati entitet.
Konstante
CONSTANT constant_name : type_name [:= value];
CONSTANT PI : REAL := 3.14;
CONSTANT SPEED : INTEGER;
Promjenljive
VARIABLE variable_name : type_name [:= value];
VARIABLE opcode : BIT_VECTOR(3 DOWNTO 0) := "0000";
VARIABLE freq : INTEGER;
Signali
SIGNAL signal_name : type_name [:= value];
SIGNAL brdy : BIT;
brdy <= ‘0’ AFTER 5ns, ‘1’ AFTER 10ns;
Promenljive vs signali
signal A, B, C, X, Y : integer;�begin� process (A, B, C)� variable M, N : integer;� begin� M := A;� N := B;� X <= M + N;� M := C;� Y <= M + N;� end process; | signal A, B, C, Y, Z : integer;�signal M, N : integer;�begin� process (A, B, C, M, N)� begin� M <= A;� N <= B;� X <= M + N;� M <= C;� Y <= M + N; end process; |
ENTITY var_sig_var IS
PORT( a, b, c: IN BIT;
out_4 : OUT BIT);
END var_sig_var;
ARCHITECTURE var_ex OF var_sig_var IS
BEGIN
PROCESS (a, b, c)
VARIABLE out_3 : BIT;
BEGIN
out_3 := a NAND b;
out_4 <= out_3 XOR c;
END PROCESS;
END var_ex;
ENTITY var_sig_sig IS
PORT( a, b, c: IN BIT;
out_2 : OUT BIT);
END var_sig_sig;
ARCHITECTURE sig_ex OF var_sig_sig IS
signal out_1: BIT;
BEGIN
PROCESS (a, b, c, out_1)
BEGIN
out_1 <= a NAND b;
out_2 <= out_1 XOR c;
END PROCESS;
END sig_ex;
Isto kolo
Paznja
:= i <=
C1
C1
Promenljive vs signali…
-- Ilustration of signals and variables
-- one ENTITY
ENTITY var_sig_var IS
PORT( a, b, c: IN BIT;
out_1 : OUT BIT);
END var_sig_var;
-- 3 architectures
-- architecture #1 without variables and signals
ARCHITECTURE ex OF var_sig_var IS
BEGIN
PROCESS (a, b, c)
BEGIN
out_1 <= (a NAND b) XOR c;
END PROCESS;
END ex;
-- architecture #2 by variable out_2
ARCHITECTURE var_ex OF var_sig_var IS
BEGIN
PROCESS (a, b, c)
VARIABLE out_2 : BIT; -- variable
BEGIN
out_2 := a NAND b; -- assign mid result to variable
out_1 <= out_2 XOR c; -- assign fin result to signal
END PROCESS;
END var_ex;
-- architecture #3 by signal out_2
ARCHITECTURE sig_ex OF var_sig_var IS
signal out_2: BIT; -- signal
BEGIN
PROCESS (a, b, c, out_2)
BEGIN
out_2 <= a NAND b; -- assign mid result to signal
out_1 <= out_2 XOR c; -- assign fin result to signal
END PROCESS;
END sig_ex;
-- configuration, chose architecture to assign to entity
CONFIGURATION config OF var_sig_var IS
FOR ex
END FOR;
END config;
C1
Promenljive vs signali…
Variable se upotrebljavaju kada hocete da upotrebljavte “serijski kod”, za razliku od “parallelnog coda”. Variable, samo u processu pridruzivanje nije paralelno. Na primjer:
signal a,b : std_logic_vector(0 to 4);
process (CLK)
begin
if (rising_edge(clk)) then
a <= '11111';
b <= a;
end if;
end process;
stavlja b prije starta processa, ne '11111'. Sa druge strane kod
signal a,b : std_logic_vector(0 to 4);
process (CLK)
variable var : std_logic_vector(0 to 4);
begin
if (rising_edge(clk)) then
var := '11111';
a <= var;
b <= var;
end if;
end process;
stavlja '11111' u a i b.
VHDL Operatori
VHDL Operatori, relacioni
VHDL Operatori, arithmetički
Process
Process…
IF
IF-ELSIF
IF-ELSIF
CASE
CASE...
FOR Petlja
//C
for(i=0;i<=5; i++)
{
}
%MATLAB???
for i=0: 10
A=4;
end
WHILE
[label:] WHILE condition LOOP
(sequential statements)
END LOOP [label];
· Primjer:
WHILE (i < 10) LOOP
WAIT UNTIL clk'EVENT AND clk='1';
(other statements)
END LOOP;
3 to 8 decoder…
library IEEE;�use IEEE.STD_LOGIC_1164.all;��entity decoder3_8 is� port(� din : in STD_LOGIC_VECTOR(2 downto 0);� dout : out STD_LOGIC_VECTOR(7 downto 0)� );�end decoder3_8;���architecture decoder3_8_arc of decoder3_8 is�begin�� dout <= ("10000000") when (din="000") else� ("01000000") when (din="001") else� ("00100000") when (din="010") else� ("00010000") when (din="011") else� ("00001000") when (din="100") else� ("00000100") when (din="101") else� ("00000010") when (din="110") else� ("00000001") ;��end decoder3_8_arc;
library IEEE;�use IEEE.STD_LOGIC_1164.ALL;�use IEEE.STD_LOGIC_ARITH.ALL;�use IEEE.STD_LOGIC_UNSIGNED.ALL;��entity decoder3x8 is�Port ( i : in STD_LOGIC_VECTOR (2 downto 0);�y : out STD_LOGIC_VECTOR (7 downto 0));�end decoder3x8;��architecture Behavioral of decoder3x8 is��begin
process(i)�begin�case i is�when "111" => y<="00000001";�when "110" => y<="00000010";�when "101" => y<="00000100";�when "100" => y<="00001000";�when "011" => y<="00010000";�when "010" => y<="00100000";�when "001" => y<="01000000";��when "000" => y<="10000000";�when others => null;�end case;�end process;�end Behavioral;
Paralelno kodiranje
With WHEN/ELSE
Sekvencijalno kodiranje
case
C1
C1
Atrubuti
name'attribute_identifier -- read as “tick”
X’delayed(T)
Signal koji uzima iste vrijednosti kao X samo
pomjeren u vremenu za T
X’stable(T)
Logi
čki signal koji je istinit ako u
intervalu T signal X bio stabilan
X’quiet(T)
Logi
čki signal koji je istinit ako u
intervalu T nije bilo transakcija signala
X
X’transaction
Signal koji mijenja vrijednost iz ‘0’-
‘1’
i obrnuto
svaki put kada se dogodi transakcija signala X
Atributi...
X’event
Istinit
ako
je
došlo do
doga
đaja
na signaluX u
teku
ćem
simulacionm
ciklusu
X’active
Istinit
ako
je
došlo do
transakcije
signala X u
teku
ćem
simulacionom
ciklusu
X’last_event
Vrijeme
poslednjeg
dogadjaja
X’last_active
posledenje
transakcije
X’last_value
signala X prije
poslednjeg
dogadjaja
Vrijeme
Vrijednost
VHDL podržava nekoliko tipova atributa. Vezani su za signale, promjenljive i podatke tipa „type“. Označavaju se sa (‘) iza čega slijedi naziv atributa. Sledeća tabela pokazuje nekoliko attributa vezanih za signale.
Atributi…
entity attr_ex is
port (B,C : in bit;
Z : out bit
);
end attr_ex;
architecture test of attr_ex is
signal A, C_delayed5 : bit;
begin
A <= B and C;
C_delayed5 <= A'delayed(5 ns);
Z<=C_delayed5;
end test;
C
B
A
Z
5ns
C1
Atributi, primjer
ENTITY 8_bit_reg IS
GENERIC (x_setup, prop_delay : TIME);
PORT(enable, clk : IN qsim_state;
a : IN qsim_state_vector(7 DOWNTO 0);
b : OUT qsim_state_vector(7 DOWNTO 0));
END 8_bit_reg;
Primjer atributi…
ARCHITECTURE first_attempt OF 8_bit_reg IS
BEGIN
PROCESS (clk)
BEGIN
IF (enable = '1') AND a'STABLE(x_setup) AND
(clk = '1') THEN
b <= a AFTER prop_delay;
END IF;
END PROCESS;
END first_attempt;
Kada se signal ustabili
ARCHITECTURE behavior OF 8_bit_reg IS
BEGIN
PROCESS (clk)
BEGIN
IF (enable = '1') AND a'STABLE(x_setup) AND
(clk = '1') AND (clk'LAST_VALUE = '0') THEN
b <= a AFTER delay;
END IF;
END PROCESS;
END behavior;
DFF
-- DFF
------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
------------------------------------------------
ENTITY dff IS
PORT (d, clk, rst: IN STD_LOGIC;
q: OUT STD_LOGIC);
END dff;
------------------------------------------------
ARCHITECTURE behavior OF dff IS
BEGIN
PROCESS (clk, rst)
BEGIN
IF (rst='1') THEN
q <= '0';
ELSIF (clk'EVENT AND clk='1') THEN -- atribut
q <= d;
END IF;
END PROCESS;
END behavior;
C1
Simulacija
q=d, na prednjoj ivica clk-a
q=0, za bilo koje clk, zato sto je rst=1
GENERIC
Promjenljiva koja je deklarisana korišćenjem ključne riječi GENERIC predstavlja konstantu koja se može samo čitati. Ova riječ se upotrebljava najčešće kada je potrebno projektovati dizajn čiji se neki od parametara mogu mijenjati (npr. dubina i širina memorije, dužina registra i sl.). Za dizajnera je mnogo jednostavnije da napravi komponentu koja se u daljem radu može koristiti nezavisno od parametara kakvi su već navedeni.
· Primjer:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity signed_adder is
generic (DATA_WIDTH : natural := 8);
port
(
a : in signed ((DATA_WIDTH-1) downto 0);
b : in signed ((DATA_WIDTH-1) downto 0);
result : out signed ((DATA_WIDTH-1) downto 0)
);
end entity;
Primjer Generic
entity Gen_Gates is
generic (Delay : Time := 10 ns);
port (In1, In2 : in bit;
Output : out bit);
end Gen_Gates;
architecture Gates of Gen_Gates is
begin
Output <= In1 or In2 after Delay;
end Gates;
In1
In2
Output
Simbol
Parametar se mijenja lako
C1
Brojač koji koristi generic i atribut
----------------------------------counter------------------
Library Ieee;
Use ieee.std_logic_1164.all;
Use Ieee.std_logic_arith.all;
Use ieee.std_logic_unsigned.all;
-----------------------------------------------------------
entity counter is
generic(word_length : integer:=4);
port(
clk, en, rst: in std_logic;
output : out std_logic_vector(word_length-1 downto 0)
);
end counter;
-----------------------------------------------------------
architecture counter_behav of counter is
signal counting : std_logic_vector(word_length-1 downto 0);
begin
process(clk, rst, en)
begin
if rst='1' then
output<=(others=>'0');
counting<=(others=>'0');
elsif clk'event and clk='1' then
if en='1' then
output<=counting;
counting<=counting+'1';
end if;
end if;
end process;
end architecture;
C1
...
-------------------------package---------------------------
Library Ieee;
Use ieee.std_logic_1164.all;
Use Ieee.std_logic_arith.all;
Use ieee.std_logic_unsigned.all;
-----------------------------------------------------------
package counter_package is
component counter
generic(word_length : integer:=16);
port(
clk, en, rst: in std_logic;
output : out std_logic_vector(word_length-1 downto 0)
);
end component;
end package counter_package;
Vježba #3
C1
8bitni Shift Registar
library IEEE;
use IEEE.std_logic_1164.all;
entity SHIFTR is
port (
CLK, RSTn, SI : in std_logic;
SO : out std_logic);
end SHIFTR;
architecture RTL of SHIFTR is
signal FF8 : std_logic_vector(7 downto 0);
begin
posedge : process (RSTn, CLK)
begin
if (RSTn = '0') then
FF8 <= (FF8'range => '0');
elsif (CLK'event and CLK = '1') then
FF8 <= SI & FF8(FF8'length-1 downto 1);
end if;
nd process;
SO <= FF8(0);
end RTL;
Sematski prikaz
Kod
C1
Vježba #4
Q0
Q1
Q2
Q3
not
clk
4_bit jonson counter sa DFF. Simulirati rad? Ako su ukloni not gate simulirati ring counter
C1
Podprogrami
Pod-programi
-vraćaju jedan argument
-svi parametri su ulazni
function vector2int(vec : bit_vector) return integer is
variable tmp : integer;
begin
tmp := 0;
for i in vec’range loop
if vec(i) = ‘1’ then
tmp := tmp+1;
end if;
end loop;
return tmp;
end vector2int;
function increment(val: bit_vector(7 downto 0)) return bit_vector(7 downto 0);
Pod-programi...
procedure vector2int(signal vec : in bit_vector;
variable int: inout integer) is
begin
int := 0;
for i in vec’range loop
if vec(i) = ‘1’ then
int := int+1;
end if;
end loop;
end vector2int;
Ulazno-izlaznog tipa,
moze biti inout ili out
procedure count_256( variable init: in integer; variable compteur:out word_32 )
Pod-programi...
Myproc1(my_signal,my_variable,1);
Myproc1(formal1 => ‘1’, formal2=>”111” ,formal3 =>1);
Myprocedure3; --No parameters
Pod-programi...
U biblioteci
C1
Pod-programi...
-- ilustration of function and procedure
libraryieee;
use ieee.std_logic_1164.all;
Entity comp_by_func_by_proc is
port
(
X,Y : in bit;
Z1,Z2 : out bit
);
end entity;
architecturebehav of comp_by_func_by_proc is
-- comparator by function
function COMP_BITS(A, B: in bit) return bit is
begin
if A=B then return '1'; else return '0';
end if;
end COMP_BITS;
-- comparator by procedure
procedure COMP_BITS(signal A, B: bit; signal C: out bit) is
begin
if A=B then C<='1'; else C<='0'; end if;
end procedure;
-- begin of architecture
begin
Z1<=COMP_BITS(X,Y); -- call function
COMP_BITS(X,Y,Z2); -- call procedure
end architecture;
Projektovati VHDL kod komparatora koristeći funkciju:
function COMP_BITS(A, B: in bit) return bit is
…….
end COMP_BITS;
funkcija vraća logičku “1” ako je A>B. U ostalim slucajevima “0”.
Projektovati isti kod koristeci proceduru
procedure COMP_BITS(signal A, B: bit; signal C: out bit) is
........
C1
Pod-programi...
--- DFF preko procedure
entity flop is port(clk: in bit;
data_in: in bit_vector(7 downto 0);
data_out, data_out_bar: out bit_vector(7 downto 0));
end flop;
architecture design of flop is
procedure dff(signal d: bit_vector; signal clk: bit;
signal q, q_bar: out bit_vector) is
begin
if clk'event and clk = '1' then
q <= d; q_bar <= not(d);
end if;
end procedure;
begin
dff(data_in, clk, data_out,data_out_bar);
end design;
C1
Pod-programi...
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
ENTITY design_one IS
PORT (a,b : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
f : OUT STD_LOGIC_VECTOR (15 DOWNTO 0));
END design_one;
ARCHITECTURE add_design OF design_one IS
BEGIN
f <= a * b;
END add_design;
Funkcija množenja definisana u ovoj biblioteci
package std_logic_unsigned is
......................................
function "+"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
......................................
function "-"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
......................................
function "*"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
......................................
function "<"(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN;
....................................
end std_logic_unsigned;
a[7..0]
b[7..0]
c[15..0]
a*b
C1
Vježba #5
a) Projektovati VHDL kod MAX_MIN koristeći funkciju:
function MAX_MIN(A, B,C: in integer; D: in bit, ) return integer is
…….
end MAX_MIN;
Aka je D=0 funkcija vraca maximalnu vrijednost (najveci od) ulaznih parametara
A,B,C, ako je D=1 funkcija vraca minimalnu vrijednost (najmanji od) ulaznih
parametara .
b) Realizovati isti kod koristeći proceduru.
Priložiti kod i simulacione dijagrame.
c) Napraviti package my_pack koji pored ostalog sadrzi funkciju function vector2int. Iz drugog *.vhd programa pozvati datu funkciju i ilustrovati njen rad pomoću simulacionih dijagrama.
C1
Vježba #6…
d)
Projektovati VHDL kod koji će polu-sabirač realizovati pomoću funkcije ADD_BITS(X,Y) tako da se izlazni signali mogu izraziti preko ulaznih u formi.
............
RESULT<=ADD_BITS(X,Y);
CARRY<=X AND Y;
............
Funkcija ADD_BITS ima oblik
function ADD_BITS(A, B: in bit) return bit is
begin
return(A XOR B)
end ADD_BITS;
Isti kod realizovati preko procedure ADD_BITS
procedure ADD_BITS(signal A, B: bit; signal q: out bit) is
begin
q<=A XOR B;
end procedure;
C1
Vježba #7…
State Machine:
Procitati (lektira):
https://www.allaboutcircuits.com/technical-articles/implementing-a-finite-state-machine-in-vhdl/
https://allaboutfpga.com/sequence-detector-using-mealy-and-moore-state-machine-vhdl-codes/
Zadatak:
Projektovati i simulirati kod “detektora binarne sekvence “101” .
Razmatrati a) Moor i b) Meal tip automata.
Priložiti VHDL kog i simulacione dijagrame za slucaj a) i b)
C1
C1
Vježba #7…
-- Taken from https://allaboutfpga.com/sequence-detector-using-mealy-and-moore-state-machine-vhdl-codes/
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity mealy is
Port ( clk : in STD_LOGIC;
din : in STD_LOGIC;
rst : in STD_LOGIC;
dout : out STD_LOGIC);
end mealy;
architecture Behavioral of mealy is
type state is (st0, st1, st2, st3);
signal present_state, next_state : state;
begin
syncronous_process : process (clk)
begin
if rising_edge(clk) then
if (rst = '1') then
present_state <= st0;
else
present_state <= next_state;
end if;
end if;
end process;
next_state_and_output_decoder : process(present_state, din)
begin
dout <= '0'; case (present_state) is when st0 =>
if (din = '1') then
next_state <= st1;
dout <= '0';
else
next_state <= st0;
dout <= '0'; end if; when St1 =>
if (din = '1') then
next_state <= st1;
dout <= '0';
else
next_state <= st2;
dout <= '0'; end if; when St2 =>
if (din = '1') then
next_state <= st1;
dout <= '1';
else
next_state <= st0;
dout <= '0'; end if; when others =>
next_state <= st0;
dout <= '0';
end case;
end process;
end Behavioral;
-- Taken from https://allaboutfpga.com/sequence-detector-using-mealy-and-moore-state-machine-vhdl-codes/
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity mealy is
Port ( clk : in STD_LOGIC;
din : in STD_LOGIC;
rst : in STD_LOGIC;
dout : out STD_LOGIC);
end mealy;
architecture Behavioral of mealy is
type state is (st0, st1, st2, st3);
signal present_state, next_state : state;
begin
syncronous_process : process (clk)
begin
if rising_edge(clk) then
if (rst = '1') then
present_state <= st0;
else
present_state <= next_state;
end if;
end if;
end process;
next_state_and_output_decoder : process(present_state, din)
begin
dout <= '0'; case (present_state) is when st0 =>
if (din = '1') then
next_state <= st1;
dout <= '0';
else
next_state <= st0;
dout <= '0'; end if; when St1 =>
if (din = '1') then
next_state <= st1;
dout <= '0';
else
next_state <= st2;
dout <= '0'; end if; when St2 =>
if (din = '1') then
next_state <= st1;
dout <= '1';
else
next_state <= st0;
dout <= '0'; end if; when others =>
next_state <= st0;
dout <= '0';
end case;
end process;
end Behavioral;
Present State | Input | Next State | Output |
S0 | 0 | S0 | 0 |
S0 | 1 | S1 | 0 |
S1 | 0 | S2 | 0 |
S1 | 1 | S1 | 0 |
S2 | 0 | S0 | 0 |
S2 | 1 | S1 | 1 |
The Transition Table
State diagram
Simulation
C1
Detektor sekvence "1001"
Vježba #7…
Mealy Machine | Moore Machine |
Output depends on the present state as well as the present input. | Output depends only upon the present state. |
If input changes, output also changes. | If input changes, the output does not change. |
Asynchronous output generation. | Synchronous output generation. |
Fewer states than the Moore machine. | More states than the Mealy machine. |
A Counter is not a Mealy Machine | A Counter is Moore Machine |
It requires less hardware | It requires more hardware |
Difficult to Design | Easy to Design |
C1
Vježba #7…
--Isti problem, resenje pomocu shift registra
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity shift_register_det is
Port ( CLK : in STD_LOGIC;
D : in STD_LOGIC;
LED : out STD_LOGIC);
end shift_register_det;
architecture Behavioral of shift_register_det is
signal shift_reg : STD_LOGIC_VECTOR(2 downto 0) := B"000";
signal det: STD_LOGIC;
begin
process (CLK)
begin
if (CLK'event and CLK = '1') then
shift_reg(2) <= D;
shift_reg(1) <= shift_reg(2);
shift_reg(0) <= shift_reg(1);
--condition for "101"
if shift_reg(2) = '1' and shift_reg(1) = '0' and shift_reg(0) = '1' then
det <= '1';
else
det <= '0';
end if;
end if;
end process;
-- hook up the det bi to the led
LED <= det;
end Behavioral;
C1
PLD - FPGA
Programabilna logička kola
(PLD – Programmable Logic Devices)
Lokalno Programibilne Sekvencijalne mreže
(FPGA - Field Programmable Gate Array)
Sadržaj
- Mjesto PLDs u elektronskoj industriji
- Vrste PLD
- Konfigurisanje FPGA čipova
Elektronske komponente, tehnologija
Standardna logika vs Programabilna
.
.
.
Konvecionalni AND simbol
.
.
.
Programabilni simbol
Glavna razlika!
a
b
c
F
F = a.b.c
a
b
c
F = 0
F = a.c
Mjesto PLDs u elektronskoj industriji
PLDs su ključne komponente
elektronskih sistema:
Prednosti: Brz i jeftin razvoj,
idealne za proto-tipove, mogućnost
višestruke upotrebe
i raznovrsne implementacije:
Mane: dimenzije, skupe za serijsku proizvodnju,
veća potrošnja, veće kašnjenje.
PLD
Vrste PLDs
CPLD
PLD
Block
PLD
Block
Interconnection Matrix
I/O Block
I/O Block
PLD
Block
PLD
Block
I/O Block
I/O Block
Interconnection Matrix
CPLD Primjer - Altera MAX7000
EPM7000 Series Block Diagram
CPLD Primjer - Altera MAX7000, Makroćelija
EPM7000 Series Device Macrocell
FPGA
FPGA, struktura
Programabilne
Interkonekcije
Programabilni
Logički blokovi
Programabilni
I-O Blokovi
Ostali FPGA blokovi
FPGA – Osnovni logički elemenat
LUT
Out
Select
D
Q
A
B
C
D
Clock
Look-Up Tables (LUT)
Truth-table
A
B
C
D
Z
0
0
0
0
0
0
0
0
1
1
0
0
1
0
1
0
0
1
1
1
0
1
0
0
0
0
1
0
1
1
0
1
1
0
1
0
1
1
1
1
1
0
0
0
0
1
0
0
1
1
1
0
1
0
1
1
0
1
1
1
1
1
0
0
0
1
1
0
1
0
1
1
1
0
0
LUT
A
B
C
D
Z
A
B
C
D
Z
LUT implementation
Gate implementation
=
LUT Implementacija
0/1
0/1
0/1
0/1
0/1
0/1
0/1
0/1
X1
X2
X3
F
Configuration memory
cells
X1 | X2 | X3 | F/F |
0 | 0 | 0 | 1/0 |
0 | 0 | 1 | 1/1 |
F=/X1/X2/X3 or /X1/X2X3
F=/X1/X2/X3
itd..
…………………….
Programabilne interkonekcije
LE
LE
LE
LE
LE
LE
Switch
Matrix
Switch Matrix
Prekidačka matrica
Poslije programiranja
Prije programiranja
0/1
FPGA – Altera FLEX 8000
- od 4000 do 15000 logickih kapija, izgled jedne makro ćelije (MC) ili logičkog elementa (LE)
FPGA – ALTERA Cyclone Seria
Cyclone Serie - LE
Konfigurisanje FPGA čipova
programabilnih tačka koje, u suštini, predstavljaju prekidačke
elemente koji se mogu programirati tako da se ponašaju kao
kratko-spojeni ili otvoreni prekidači. U fazi programiranja kola,
signali koji se dovode na ulaz kola otvaraju i zatvaraju
programabilne tačke (elektronske prekidače) i na taj način
ostvaruju željene oblike povezivanja internih komponenta.
korišćeni su poluprovodnički osigurači. Inicijalno svi osigurači
su "nesagoreni". Pobuđivanje kola nešto višim naponima od
radnih uslovljava da kroz PLD protiču velike struje.
Kao posledica, veze koje formiraju osigurači se raskidaju.
Treba pri ovome naglasiti da ne postoji metod za rekonstrukciju
(obnavljanje) stanja prekidača, tj. njegovo sagorevanje je
trajno ili bespovratno. Tipičan predstavnik ovakvih
kola je programabilni ROM ili PROM.
Konfigurisanje FPGA čipova...
Xilinix, Altera,
Plessey, Algotronix,
Concurent Logic i Toshiba.
Konfigurisanje FPGA čipova...
Altera, Plus Logic
Konfigurisanje FPGA čipova...
Actel, Quck Logic,
Crosspoint
REALNI FPGA CIP
Više vrsta pinova
(nSP, MSEL1, MSEL0,
DCLK, DATA0, nCONFIG
CONF_DONE, nSTATUS)
Npr: EPF8452ALC84-2
ima 84 pina od kojih 8 ide na
masu (GND), 5 na VCC, 8 na konf.
Načini konfigurisanja FPGA
Konfiguraciona šema | Akronim | Izvor podataka |
Aktivna serijska | AS | Konfiguracioni EPROM |
Aktivna paralelna gornja | APU | Paralelni EPROM |
Aktivna paralelna donja | APD | Paralelni EPROM |
Pasivna serijska | PS | Serijski kanal podataka |
Pasivna paralelna sinhrona | PPS | Inteligentni host |
Pasivna paralelna asinhrona | PPA | Inteligentni host |
Eksterni kontroleri za konfiguraciju
Izvodjenje konfiguracije, tajming
Načini konfigurisanja FPGA
Važniji proizvodjači FPGA
Implementacija u programabilno-konfiguratibilnom čipu, FPGA
Kod, kompalacija, simulacija, verifikacija simulacije
Na
racunaru
cip
Konfiguracija, verifikacija rada, pomocu konfiguratora/programatora ili na razvojnoj ploci
DC adapter
Pročitati fajl:
Quartus
+
Drivers
USB kabal
FPGA cip
Cyclone II,
EP2C70F896C
Periferije
Periferije
Implementacija ns FPGA ploči
Altera DE2-70 ploča (board)
DE2-70 raspored pinova...
Vjezba #1, konfiguracija, provjera funkcionalnosti
ENTITY half_adder IS
PORT( x, y, enable: IN BIT;
carry, result: OUT BIT);
END half_adder;
ARCHITECTURE half_adder_b OF
half_adder IS
BEGIN
carry <= enable AND (x AND y);
result <= enable AND (x XOR y);
END half_adder_b;
Kompalacija
Simulacija i ver.
Assignment i
Konfiguracija na čipu
Provjera funkcionalnosti
“Core”files za fabrikaciju
LAB- Vjezba #1, konfiguracija i provjera funkcionalnosti
5V
5V
5V
SW[0] PIN_AA23
SW[1] PIN_AB26
SW[2] PIN_AB25
LEDR[0] PIN_AJ6
LEDR[1] PIN_ AK5
FPGA cip,
Cyclone II,
EP2C70F896C
DE2-70 ploča
Demonstracija rada polusabirača preko na DE2-70 ploči
a
b
c
d
e
ao
onal
ENTITY alarm IS
PORT
(
a, b, c, d, e, onal : IN BIT;
ao,l1 : OUT BIT
);
END alarm;
ARCHITECTURE myarch OF alarm IS
BEGIN
ao<= (a or b or c or d or e) and onal;
l1<=not(not onal);
END myarch;
l1
Vcc
Sw(0..)
DE2-70 FPGA pins
Onal SW[0] PIN_AA23
a SW[1] PIN_AB26
b SW[2] PIN_AB25
c SW[3] PIN_AC27
d SW[4] PIN_AC26
e SW[5] PIN_AC24
11 LEDR[0] PIN_AJ6
ao LEDR[1] PIN_AK5
LEDR(0..)
Hocemo da konstruisemo kolo (cip) koji je alarm otvorenosti vrata automobila
Naime, izlaz “ao” koji je vezan na LEDR[1] se automatski aktivira ako su bilo koja od 5 vrata “a…e” otvorena (pri otvaranju vrata se aktiviraju odgovarajući mikroprekidači, koje ovdje simuliramo sa Sw[1]…Sw[5]. Ako je “onal” SW[0] ukljucen, to idicira LEDR[0], kolo je sposobno da funkcioniše;
Step1: Napravimo VHDL cod alarma
Step2: Dodijelimo cip
Step3: Dodijelimo pinove
Step 4: Provjerimo funkcionalnost na ploci
Alarm
onal
Lab Vježba #2, Demonstracija prostog upotrebljivog kola
Lab Vježba #3, Demonstracija prostog upotrebljivog kola �
Napredne tehnike projektovanja FPGA kola
Zašto napredni dizajn?
Prosti FPGA dizajn ima odredjene mane i ne može se koristiti u profesionalne svrhe. Optimalne performanse u procesu projektovanje FPGA kola mogu se očekivati ako smo ispoštovali veliki broj pravila proisteklih iz znanja i iskustva. Takva pravila se mogu ugraditi u VHDL kodu ili pak u šematskom prikazu. To se odnosi na tehnike kao što su prednosti sinhronog u odnosu na asinhroni dizajn, dupliciranje Flip-Flopova u svrhu smanjenja fan-outa, “Pipelining”, I/O Flip-Flops, kola za sinhronizaciju i reset itd. Takodje su važne i tehnike koje smanjuju potrošnju (konzumaciju) FPGA kola.
Sinhrona vs. asinhrona kola
Sinhrona kola su mnogo pouzdanija.
Generalno, gdje god je to moguće treba koristiti sinhroni pristup.
Asinhrona kola su manje pouzdana.
Treba ih izbjegavati prilikom projektovanja
Kombinacione Petlje
Najčešći uzrok nestabilnosti i nepouzdanosti. Moraju se izbjegavati gdje je to moguće.
Generatori impulsa i multivibratori
Asinhroni (ne preporučuju se).
Koristiti sinhroni tamo gdje je to potrebno.
“Clocking” šeme
“Registrovanje” izlaza kombinacione logike prije korišćenja kloka.
“Clocking” šeme...
“Clocking” šeme...
“Clocking” šeme...
“glitch”
“Clocking” šeme...
“Clocking” šeme...
“Clocking” šeme...
Set/Reset “Glitchevi”...
glitch
Set/Reset “Glitchevi”...
Clock “Skew”...
Expected operation
Clock
Q_A
Q_B
Q_C
3 cycles
Clock skewed version
A & C Clock
Q_A
Q_B
Q_C
B Clock
2 cycles
“kasnjenje”
Dupliciranje Flip-Flopova...
“Pipelining” Koncept...
pipe-line, cjevovod
Kašnjenja u “pipeline” arhitekturama
“Pipelining” Primjer
“Pipelining” Primjer...
Primjer
Primjer…
Kola za sinhronizaciju
Kola za sinhronizaciju...
Kola za sinhronizaciju...
Kola za sinhronizaciju...
“Leading edge detector”
Napredni dizajn
Primjer realizacije Fleksibilnog FPGA
baziranog IIR filtra.
Opšta forma funkcije prenosa digitalnog sistema
Ostali primjeri
(Pogledati radove na ovu temu, date u prilozima).