DMI – Corso di laurea magistrale in Informatica
Copyleft
2020 Giuseppe Scollo
in questa esercitazione si trattano:
latch di tipo D
flip-flop di tipo D
library ieee;
use ieee.std_logic_1164.all;
entity latch is
port (
d : in std_logic;
en : in std_logic;
q : out std_logic
);
end entity latch;
architecture beh of latch is
begin
process (d, en) is
begin
if (en = ’1’) then
q <= d;
end if;
end process;
end architecture beh;
library ieee;
use ieee.std_logic_1164.all;
entity dff is
port (
d : in std_logic;
clk : in std_logic;
q : out std_logic
);
end entity dff;
architecture simple of dff is
begin
process (clk) is
begin
if rising_edge(clk) then
q <= d;
end if;
end process;
end architecture simple;
library ieee;
use ieee.std_logic_1164.all;
entity register is
generic ( n : natural := 8 );
port (
d : in std_logic_vector(n−1 downto 0);
clk : in std_logic;
nrst : in std_logic;
load : in std_logic;
q : out std_logic_vector(n−1 downto 0)
);
end entity register;
architecture beh of register is
begin
process (clk, nrst) is
begin
if (nrst = ’0’) then
q <= (others => ’0’);
elsif (rising_edge(clk) and (load = 1)) then
q <= d;
end if;
end process;
end architecture beh;
flip-flop di tipo D con set e reset asincroni
contatore binario
l'uso di variabili facilita la descrizione VHDL in stile comportamentale:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity counter is
generic ( n : integer := 4 );
port (
clk : in std_logic;
rst : in std_logic;
output : out std_logic_vector(n−1 downto 0)
);
end;
architecture simple of counter is
begin
process(clk, rst)
variable count : unsigned(n−1 downto 0);
begin
if rst = ’0’ then
count := (others => ’0’);
elsif rising_edge(clk) then
count := count + 1;
end if;
output <= std_logic_vector(count);
end process;
end;
library ieee;
use ieee.std_logic_1164.all;
entity shift_register is
generic ( n : integer := 4 );
port (
clk : in std_logic;
rst : in std_logic;
din : in std_logic;
q : out std_logic_vector(n−1 downto 0)
);
end entity;
architecture simple of shift_register is
begin
process(clk, rst)
variable shift_reg : std_logic_vector(n−1 downto 0);
begin
if rst = ’0’ then
shift_reg := (others => ’0’);
elsif rising_edge(clk) then
shift_reg := shift_reg(n−2 downto 0) & din;
end if;
q <= shift_reg;
end process;
end architecture simple;
ipotesi per la realizzazione hardware:
tre regole per la realizzazione:
due definizioni:
frequenza di clock massima per il circuito: reciproco della latenza del cammino critico
algoritmo: a ogni passo rimpiazza (a, b) con (|a-b|, min(a,b))
Schaumont, Figure 3.10 - Euclid’s greatest common divisor as an SDF graph
analisi PASS:
rango(G) = 1
applichiamo le tre regole indicate per la realizzazione hardware del modello SDF:
la realizzazione degli attori è semplice, con pochi moduli di uso comune (multiplatori, comparatori e un sottrattore)
Schaumont, Figure 3.11 - Hardware implementation of Euclid’s algorithm
esempio di miglioramento del throughput mediante pipelining:
Schaumont, Figure 3.12
SDF graph of a simple moving-average application
Schaumont, Figure 3.13
Pipelining the moving-average filter by inserting additional tokens (1)
Schaumont, Figure 3.14
Pipelining the moving-average filter by inserting additional tokens (2)
Schaumont, Figure 3.15
Hardware implementation of the moving-average filter
da notare:
il pipelining, con l'aggiunta di token, può alterare il comportamento di un grafo SDF
Schaumont, Figure 3.16 - Loops in SDF graphs cannot be pipelined
per applicare il pipelining senza alterare il comportamento funzionale del grafo, quando questo contiene cicli, i token aggiuntivi vanno posti al di fuori di qualsiasi ciclo nel grafo
il circuito in figura 3.11 realizza il nucleo computazionale dell'algoritmo di Euclide per il calcolo del GCD, ma non presenta elementi di controllo atti a segnalare l'inizio e la fine del calcolo né a distinguere ingressi e uscita; gli obiettivi di questa esperienza sono: estendere il circuito a tal fine, produrne una descrizione in VHDL, simularne il comportamento, e realizzarlo sulla FPGA DE1-SoC
letture raccomandate:
readings for further consultation:
materiali utili per l'esperienza di laboratorio proposta
(fonte:
Intel Corp. - FPGA University Program, 2016)
sorgenti VHDL: