Post on 05-Aug-2020
16. Descripción Estructural•Instancias interconectadas por señales. Tres tipos instanciación:
•Instanciación de un componente (por defecto)•Requiere la previa declaración del componente•No se indica la arquitectura, se usa la última compilada. Si hay varias arquitecturas se puede especificar la arquitectura con una configuración, además del “binging”
instancia: entity librería.entidad[(arquitectura)] [generic map(lista_genéricos)] [port map(lista_señales)];
instancia:[component] componente [generic map(lista_genéricos] [port map(lista_señales)];
instancia: configuration librería.configuración [generic map(lista_genéricos] [port map(lista_señales)];
•Instanciación de una entidad (y arquitectura) •No requiere la previa declaración del componente•Se puede especificar la arquitectura. Si no se especifica la arquitectura, se usa la última compilada
•Instanciación de una configuración•Generalmente los sintetizadres no admiten configuraciones•Igual que instanciación a entidad (y arquitectura)
16. Descripción Estructural•Asignaciones de señales a los puertos (y genéricos). Dos tipos de asociación:
•Asociación ordenada•Asociación nombrada
•La palabra open indica puerto (o genérico) no asociado. Los puertos (o genéricos) no asociados toman open
...port map(señal1, open, señal3, ...);
...port map(actm=>señalm, actn=>open, actp=>señalp, ...);
...port map(señal1, señal2, ...);
...port map(actm=>señalm, actn=>señaln, ...);
myMUX21a
bo
n
nn
s
mNOR(RTL)
a
bo
n
nn mNOT
(RTL)a on n
mAND(RTL)
a
bo
n
nn mAND
(beh)
a
bo
n
nn
16. Descripción Estructural•Ejemplo: Descripción estructural de myMUX21, a partir de:
•Entidad myNOT con una arquitectura RTL•Entidad myOR con una arquitectura RTL•Entidad myAND con dos arquitecturas: RTL, beh. Ambas usan declaraciones dentro del paquete myPACK
entity myNOT isgeneric(
n: integer:=8;t: time:=10 ns);
port(a: in bit_vector(n-1 downto 0);o: out bit_vector(n-1 downto 0));
end entity myNOT;
architecture RTL of myNOT isbegin
o<=not a after t;end architecture RTL;
entity myOR isgeneric(
n: integer:=8;t: time:=10 ns);
port(a,b: in bit_vector(n-1 downto 0);o: out bit_vector(n-1 downto 0));
end entity myOR;
architecture RTL of myOR isbegin
o<=a or b after t;end architecture RTL;
mOR(RTL)
a
bo
n
nnmNOT
(RTL)a on n
16. Descripción Estructural
mAND(RTL)
a
bo
n
nn
16. Descripción Estructural
library work;use work.myPACK.all;
entity myAND isport(a,b: in DATABUS;o: out DATABUS);
end entity myAND;
architecture RTL of myAND isbegin
o<=a and b after DELAY/3;end architecture RTL;
architecture BEH of myAND isbegin
o<=funAND(a,b) after DELAY/3; end architecture BEH;
mAND(beh)
a
bo
n
nn
package body myPACK isfunction funAND(a,b: DATABUS) return DATABUS is
...end function funAND;constant DELAY: time:=20 ns;
end package body myPACK;
package myPACK isconstant DELAY: time;constant WIDTH: integer:=16;subtype DATABUS is bit_vector(WIDTH-1 downto 0)function funAND(a,b: DATABUS) return DATABUS;component myAND
port(a,b: in DATABUS; o: out DATABUS);end component myAND;
end package myPACK;
myPACK:•DELAY•WIDTH•DATABUS•funAND•myAND
u1:mNOT(RTL)
n
16. Descripción Estructural
use work.myPACK.all;entity myMUX21 is
generic(n: integer:=WIDTH; t: time:=DELAY);port( a,b: in DATABUS; s: in bit; o: out DATABUS);
end entity myMUX21;
architecture STR of myMUX21 iscomponent myNOT generic(n:integer:=8; t:time:=10 ns);
port(a: in bit_vector(n-1 downto 0); o: out bit_vector(n-1 downto 0));
end component myNOT;signal x,y,sx,sn: bit_vector(n-1 downto 0); begin
sx<=(others=>s);u1: myNOT generic map(WIDTH,open) port map(sx,zx);
u2: component myAND port map(o=>x,a=>a,b=>zx);
u3: entity work.myAND(beh) port map(b,sx,y);
u4: entity work.myOR generic map(WIDTH) port map(x,y,o);end architecture STR;
Instanciación de componente myNOTdeclarado en la zona de declaracionesde la arquitectura. El genérico t esasociado a open y tomará el valor por defecto
Instanciación a componente myAND:declarado el paquete myPACKUsa asignación nombrada¿Qúe arquitectura usará: RTL o beh?Usara la última compilada
Instanciación de entidad myOR: no requiere declaración. La arquitectura es RTL por tener sólo una
u4:mOR(RTL)
n
u2:mAND(???)
n
nn
u3:mAND(beh)
n
nns
a
b
o
sxx
y
sn
Instanciación de entidad myAND, y arquitectura beh. No requiere declaración
myMUX21a
bo
n
nn
s
16. Descripción Estructural
use work.myPACK.all;configuration CFG of myMUX21 is
for STRfor u1: myNOT
use entity work.myNOT(RTL) generic map(WIDTH,DELAY/3); end for;for all: myAND
use entity work.myAND(RTL); end for;
end for;end configuration CFG;
u1:mNOT(RTL)
n
DUT:CFGb1
b2b3
n
nn
s
u4:mOR(RTL)
n
u2:mAND(RTL)
n
nn
u3:mAND(beh)
n
nns
a
b
o
sxx
y
sn
La configuración define arquitecturas parainstancias a componentes. Tambiénpermite asociar puertos y genéricos sobreescribiendo la asociación que sehabía descrito en la arquitectura STR
architecture test1 of test_myMUX21 is...begin
DUT: configuration work.CFG port map(o=>b3,s=>s,a=>b1,b=>b2);...
end architecture;
CFGa
bo
n
nn
s
Instanciación a configuración CFG:No hay que declarar la configuración.Muchos sintetizadores no admitenconfiguraciones
a
b s
o
16. Descripción Estructural•La sentencia generate se usa para generar arquitecturas con estructuras regulares de instancias (asignaciones y procesos)
•for...in...generate: genera instancias con un bucleetiqueta: for parámetro in rango generate [--declaraciones; begin]
--instancias;--asignaciones concurrentes y procesos;
end generate [etiqueta];
etiqueta: if condición generate [--declaraciones; begin]
--instancias; --asignaciones concurrentes y procesos;
end generate [etiqueta];
•if...generate: genera instancias condicionalmente
16. Descripción Estructural•Ejemplo: Descripción estructural de contador BCD ascendente genérico de n-bits y entrada de habilitación, usando generate para instanciar componentes TFF
contBCD one
clk
rst
rst T Q Qn 1 X 0 1 0 0 Q- !Q- 0 1 !Q- Q-
Qnclk
T QT Q
Qnrst
TFF
r
library ieee;use ieee.std_logic_1164.all;
entity TFF is port(clk: in std_logic;rst: in std_logic;T: in std_logic;Q,Qn: out std_logic);
end entity;
architecture beh of TFF issignal q_int: std_logic;begin
process(clk) variable s: std_logic;begin
if rising_edge(clk) thenif rst='1' then
s:='0';elsif T='1' then
s:=not s;end if;
end if;Q<=s;Qn<=not s; --No es lo mismo que
end process; --Qn<=not Q;end architecture;
clk
o(2)
rst
a(1)o(1)
o(3) o(2) o(1) o(0) 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 1 0 0 0 1 0 0 1 ... ... ... ... 1 1 1 1 0 0 0 0 ... ... ... ...
o(0)
rst
clk
e o(1)
rst
o(0)
16. Descripción Estructural
clk
a(2)
clk
o(i)
rst
a(i-1)o(i-1)
a(i)
a(1)a(0)T Q
Qnrst
TFFT Q
Qnrst
TFF
T Q
Qnrst
TFF
T Q
Qnrst
TFF
16. Descripción Estructural
library ieee;use ieee.std_logic_1164.all;
entity contBCD is generic(n: integer:=4);port(
clk: in std_logic;rst,e:in std_logic;o: out std_logic_vector
(n-1 downto 0));end entity;
contBCD one
clk
rst
library ieee;use ieee.std_logic_1164.all;
architecture str of contBCD issignal o_int: std_logic_vector(o'range);signal a: std_logic_vector(o'range);begin
o<=o_int;gen0: for i in 0 to n-1 generate
begingen1: if i=0 generate
a(0)<=e;end generate; gen2: if i>=1 generate
a(i)<=o_int(i-1) and a(i-1); end generate;Ui: entity work.TFF port map(clk,rst,
a(i),o_int(i),open);end generate;
end architecture;
rstclk
o(0)a(0)
o(n-1)a(n-1)
e
o(1)a(1)
T Q
Qnrst
TFF
o(2)a(2)
T Q
Qnrst
TFF
o(3)a(3)
T Q
Qnrst
TFFT Q
Qnrst
TFFT Q
Qnrst
TFF
17. Descripción RTL•Asignaciones concurrentes de señales. Tipos de asignaciones:
•Asignaciones simples (no condicional)[etiqueta:] señal<=[mecanismo retardo] expresión;
•Asignaciones condicional when...else. Codificador prioridad[etiqueta:] señal<=[mecanismo retardo1] expresión1 when condición1 else [[mecanismo retardo2] expresión2 when condición2 else] [...] [mecanismo retardoN] expresiónN;
•Asignaciones selectiva with...select. Multiplexor[etiqueta:] with selección select señal<=[mecanismo retardo1] expresión1 when selección1, [[mecanismo retardo2] expresión2 when selección2,] ... [mecanismo retardoN] expresiónN when others;
•Asignaciones compuesta (no condicional). No sintetizable, usado para benchtest rst<=’0’, ’1’ after 10 ns, ’0’ after 50 ns;
[etiqueta:] señal<=[mecanismo retardo1] expresión1, [[mecanismo retardo2] expresión2,] [...]
[mecanismo retardoN] expresiónN;
•La expresión unaffected no varía el valor de la señal
17. Descripción RTL•Ejemplo: Descripción RTL de SEL3 usando los tipos de asignaciones simple, condicional when...else y case...select
library ieee; use ieee.std_logic_1164.all;entity SEL3 is port(
s: in std_logic_vector(1 downto 0);a,b,c:in std_logic; o: out std_logic);
end entity;
architecture RTL1a of SEL3 isbegin
o<=(a and (not s(1)) and (not s(0))) or(b and (not s(1)) and s(0)) or(c and s(1));
end architecture;
architecture RTL3a of SEL3 isbegin
with s selecto<=a when "00",
b when "01",c when others;
end architecture;
architecture RTL2a of SEL3 isbegin
o<=a when s="00" elseb when s="01" elsec;
end architecture;
El sintetizador genera para la arquitecturas un circuito equivalente aldel multiplexor
El sintetizador genera para la arquitecturas un codificador de prioridad,que equivale al multiplexorsi se simplifican lasecuaciones
Ecuaciones booleanasequivalentes a la delmultiplexor
s(1)s(0)
cba
o
ab
c
s2
o
00
01
10
11
1
0
s(0)
ab
s(1)
o1
0
c
SEL3
ao
s
bc
2
17. Descripción RTLarchitecture RTL1b of SEL3 issignal ox: std_logic;begin
o<=ox;ox<=(a and (not s(1)) and (not s(0))) or
(b and (not s(1)) and s(0)) or (c and s(1) and (not s(0)));
end architecture; architecture RTL1bx of SEL3 issignal ox: std_logic;begin
o<=ox;ox<=(a and (not s(1)) and (not s(0))) or
(b and (not s(1)) and s(0)) or (c and s(1) and (not s(0))) or ('X' and s(1) and s(0));
end architecture;
architecture RTL3b of SEL3 isbegin
with s selecto<=a when "00",
b when "01",c when "10",'X' when others;
end architecture;
architecture RTL2b of SEL3 isbegin
o<=a when s="00" elseb when s="01" elsec when s="10" else'X';
end architecture;
El simulador simula la entrada ‘X’. El sintetizador simplifica y genera circuito con X como ‘0’,’1’,u otra señal
abc
s2
00
01
10
110
o
1
0
s(0)
ab
s(1)
o1
0
c
La síntesis genera el primer circuito, que puede sersimplicado y genera circuito con X como ‘0’,’1’ u otra señal
s(1)s(0)
cba
o
s(1)s(0)
cba
oabc
s2
00
01
10
11X
oa
bc
s2
00
01
10
11
o
1
0
s(0)
a
s(1)
o1
0
1
0c b
X
ab
c
s2
o
00
01
10
11
17. Descripción RTLabc
s2
00
01
10
11X
D QDLatch
e(0)(1)
o
architecture RTL3c of SEL3 isbegin
with s selecto<= a when "00",
b when "01", c when "10", unaffected when others;
end architecture;
architecture RTL2c of SEL3 isbegin
o<= a when s="00" else b when s="01" else c when s="10"; --else unaffected es opcional;
end architecture;
1
0
s(0)
a
s(1)
o1
0
1
0c b D QDLatch
eX
Las combinaciones no asignadas infieren latchesSi se desea lógica combinacional es necesario quetodas las combinaciones de señales de entrada tenganun valor asignado a ‘0’ ‘1’ ‘X’ ‘Z’ y otra señal
•Ejemplo: Descripción RTL de bus 8-bits bidireccional triestado17. Descripción RTL
library ieee;use ieee.std_logic_1164.all;
package packBiZ is constant WIDTH: integer:=8;subtype \Bus I/O/Z\ is
std_logic_vector(WIDTH-1 downto 0);end package;
library ieee;use ieee.std_logic_1164.all;use work.packBiZ.\Bus I/O/Z\;
entity BiZ is port(s: in std_logic;O: in \Bus I/O/Z\;I: out \Bus I/O/Z\;B: inout \Bus I/O/Z\);
end entity;
architecture RTLb of BiZ isbegin
I<=B;B<=O when s='1' else (others=>'Z');
end architecture;
architecture RTLc of BiZ isbegin
I<=B;with s select
B<=O when '1',(others=>'Z') when others;end architecture;
architecture RTLa of BiZ issignal Zx,sx: \Bus I/O/Z\;begin
I<=B;B<=(O and sx) or (Zx and not sx);sx<=(others=>s);Zx<=(others=>'Z');
end architecture;
‘Z’ and ‘0’=‘0’ ‘Z’ or ‘1’=‘1’‘Z’ and ‘1’=‘X’ ‘Z’ or ‘1’=‘X’
Error: Resultado de síntesis no deseado!B queda a ‘X’ si e=‘1’
Ok: Resultado de síntesis es el deseado
s OB
0
XI
BO
I
e8 8
8BiZ
O8
I8 B
8
e
17. Descripción RTL•Es posible asignaciones de elementos en señales compuestas. El rango debe ser ascendente o descendente, según la señal compuesta haya sido declarada como ascendente o descendente
•Los agregados permiten definir el valor de cada elemento en un tipo compuesto. El agregado others=> da un valor al resto de elementos no asignados. Se permiten rangos de agregados.
...señal(elemento)<=...
...señal(left to|downto max)<=......<=expresión(elemento)......<=expresión(left to|downto right)...
...señal(elemento0=>valor0, elemento1=>valor1, ..., elementoN=>valorN);
...señal(elemento0=>valor0, elemento1=>valor1, ..., others=>valor);
...señal(elementoleft to|downto elementoright=>valor1,...);
architecture arquitectura of entidad is...signal a: std_logic_vector(7 downto 0);signal b: std_logic_vector(0 to 7);begin
...a(7)<=b(0); a(6)<=b(1); a(5)<=b(2); a(4)<=b(3);
a(7 downto 4)<=b(0 to 3);
a(7 downto 4)<=(5=>b(2), 7=>b(0), 4=>b(3), others=>b(1));...
end architecture;
Copia el nibble alto de b al nibble alto de a. Asignaciones equivalentes entresi, para los elementos de la señal compuesta:•Elemento a elemento•Rango de elementos•Usando agregados
17. Descripción RTL•La sentencia block...end block permite la agrupación de varias asignaciones concurrentes (procesos e instancias) para mejorar legibilidad con la partición de la arquitectura
•Es posible anidar de bloques•La condición de guarda es opcional. Si no se usa, las asignaciones se realizan siempre que exista un evento sobre alguna de las señales que se leen•Si existe condición de guarda, se realiza la asignación de forma condicional como señal<=guarded asignación; La señal debe ser de tipo resuelta (std_logic o std_logic_vector)•Hay sintetizadores que no admiten bloques con guarda
etiqueta: block [condición_guarda] --declaraciones;begin
--asignaciones concurrentes;--instancias y procesos;
end block etiqueta;
17. Descripción RTL
library ieee;use ieee.std_logic_1164.all;
architecture RTL of entidad is--declaracionessignal R,S,Q,Qn,e: std_logic;begin
--procesos;--asignaciones concurrentes;--instancias;
Latch_RS: block(e='1')signal \Q\: std_logic;signal RS: std_logic_vector(0 to 1);begin
Q<=guarded \Q\;Qn<=guarded not \Q\; with RS select
\Q\<= unaffected when "00", '1' when "01", '0' when "10", 'X' when others;
RS<=(1=>S, 0=>R);end block;
--procesos;--asignaciones concurrentes;--instancias;
end architecture;
•Ejemplo: Descripción RTL de un Latch RS, dentro de un bloque
Partición del diseño con bloque con guarda para descripción RTL de un Latch RS
El orden de las asignaciones de señales dentrodel bloque no afecta su funcionalidad, por serasignaciones concurrentes. No confundir conun proceso, donde las asignaciones sonsecuenciales
Las señales con guarda se actualizancuando se cumple la condición de guarda, que es e=‘1’ en este ejemplo
Señales locales al bloque: RS, \Q\Señales globales a la arquitecutura: R,S,Q,Qn,e,...
RS_LatchRSe
Q
Qn
entidadAsignacionesconcurrentes
procesos
instancias
18. Descripción Comportamiento•Asignaciones secuenciales de señales y variables, dentro de un proceso
•Variable: Actualización inmediata. Son locales al proceso (excepto tipo shared)•Señal: Actualización al suspenderse el proceso. No pueden ser locales al proceso
•Los procesos se ejecutan concurrentemente entre sí y con las asignaciones concurrentes•Un proceso permite la descripción de algorítmica de un sistema o parte de un sistema (nivel de comportamiento)•Los procesos se comunican entre si con señales
[proceso:] process [(lista_sensibilidad)] [is]variable vble : tipo [:= valor_inicial];... begin
vble:=expresión1;señal<=[mecanismo retardo] expresión2;[wait [on...|until...|for...]...; --si no existe lista_sensibilidad]...
end process [proceso];
•Una asignación concurrente de señal es en realidad un proceso, y puede ser descrito como tal•Un proceso pueden incluir una lista de sensibilidad, activando el proceso cuando exista un evento sobre una o varias de las señales de la lista•Si no existe lista de sensibilidad, es necesario el uso de wait [on...|until...|for...];
18. Descripción Comportamiento
p: a<=b and c;
p: process(b,c) begin
a<=b and c;end process;
p: process(b,c)variable o: std_logic;begin
o:='0';if b='1' then
if c='1' theno:='1';
end if;end if;a<=o;
end process;
Asignación concurrente
Proceso equivalenteLista de sensibilidadson las señales leidas
Descripción de comportamientoequivalente
p: processvariable o: std_logic;begin
wait on b,c;o:='0';if b='1' then
if c='1' theno:='1';
end if;end if;a<=o;
end process;
Descripción de comportamientoequivalente sinlista de sensibilidady sentencia wait on
18. Descripción Comportamiento•wait [on...|until...|for...]; suspende el proceso bajo unas determinadas condiciones:
•wait; suspende el proceso indefinidamente•wait on señal1,señal2,...; suspende el proceso hasta el próximo evento en la/s señal/es de la lista•wait until condición; suspende el proceso hasta que se cumpla la condición booleana por un evento de la/s señal/es que forman parte de la condición•wait for tiempo; suspende el proceso durante un tiempo
•Normalmente son sintetizables wait on... y wait until..., si existe uno por proceso, y como primera sentencia•wait y wait for... se suelen usar en testbench b<='0', '1' after 10 ns, '0' after 20 ns, '1' after 35 ns; c<='0', '1' after 10 ns, '0' after 35 ns, '1' after 40 ns;
process beginb<='0'; c<='0'; wait for 10 ns;b<='1'; c<='1'; wait for 10 ns;b<='0'; wait for 15 ns;c<='0'; b<='1'; wait for 5 ns;c<='1'; wait;
end process;
process(clk) beginclk<=not clk after 5 ns;
end process;
process beginwait for 5 ns;clk<=not clk;
end process;
Ejemplo del usode wait… para generación deltestbench a,b
Ejemplo del usode wait… para generación deltestbench de un reloj clk
18. Descripción Comportamiento•Asignaciones Secuenciales de señales y variables. Tipos:
•Asignaciones simples (no condicional)señal<=[mecanismo retardo] expresión; variable:=expresión;
•Asignaciones compuesta (no condicional). No sintetizableseñal<=[mecanismo retardo1] expresión1, [...] [mecanismo retardoN] expresiónN;
if condición1 then --sentencias secuenciales 1;
[elsif condición2 then --sentencias secuenciales 2;]
[...][else
--asignaciones secuenciales defecto;]end if;
•Selectivo case...is. Multiplexor. Es posible usar en las condiciones rangos y varias condiciones con |case expresión is
when condición1 => --sentencias secuenciales 1;[when condición2 => --sentencias secuenciales 2;][...]when others => --sentencias secuenciales defecto;
end case;
•Control Secuencial. Tipos:•Condicional if...then. Codificador prioridad
18. Descripción Comportamiento
•Bucles. Tipos:•for...loop. Se especifica un rango
•while...loop. Se especifica una condición[etiqueta]: while condición loop
--sentencias secuenciales;end loop [etiqueta];
[etiqueta]: for rango loop --sentencias secuenciales;
end loop [etiqueta];
•La asignación null no cambia/n la/s señal/es
function reverse_bits(a: std_logic_vector) return std_logic_vector isvariable i: integer;variable b: std_logic_vector(a'high downto a'low);begin
for i in a'low to a'high loopb(a'high-i):=a(i);
end loop; return b;end function;
function reverse_bits(a: std_logic_vector) return std_logic_vector isvariable i: integer:= a'low;variable b: std_logic_vector(a'high downto a'low);begin
while i<=a'high loopb(a'high-i):=a(i); i:=i+1;
end loop; return b;end function;
Funciones equivalentesusando bucle for…loopy bucle while…loop
18. Descripción Comportamiento•Ejemplo: Sistema de medida de periodo T y nivel alto D de una señal digital i.
•Diseño síncrono con un solo reloj•Obtención de la lectura del anterior D/T con sel=0/1. •Ovflw si hubo overflow en D/T con sel=0/1
1 2 D 1 2
1 2 1 2TT-1T-2
D-1
D,Te_regs
clr_cnts
clr_cnts
clr_cnts
clr_cnts
/e_cntDe_cntD e_cntD
D=D(t)/TCLK
T=T(t)/TCLK
clk
rst
i
Meter_D
Meter_T
Reg_D,Reg_T /e_regs
•Metodología Top-Down:•Unidad de proceso (UP):
•cntT: Contador ascendente, reset a X”01”, detección overflow•cntD: Contador ascendente con habilitación, reset a X”01”, detección overflow•regs: Conjunto de registros para almacenamiento de la últimas medidas de Meter_T/D y Overflow_T/D•mux: Multiplexor con sel=0/1 para lectura de D/T y overflow D/T
•Unidad de control (UC): generación señales de control clr_cnt, e_cntD, e_regs
18. Descripción Comportamiento
UC
clk
i
rst
cntTclk
cntDclk
8 Meter_T
Ovflw_T
8 Meter_D
Ovflw_D
clr_cnt
e_cntD regs
clk
e_regs
8 reg_T
reg_Ovflw_T
8 reg_D
reg_Ovflw_D
mux
sel
8 meterovflw
TDmeter
8
clk
i
rst
sel
18. Descripción Comportamientolibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;
entity TDmeter is port(
clk: in std_logic;rst: in std_logic;i,sel: in std_logic;meter: out std_logic_vector(3 downto 0);ovflw: out std_logic);
end entity;
architecture beh1 of TDmeter issignal Meter_D,Meter_T: unsigned(meter'range);signal Ovflw_T,Ovflw_D: boolean;signal reg_T,reg_D: unsigned(meter'range);signal reg_Ovflw_T,reg_Ovflw_D: boolean;signal clr_cnt,e_regs,e_cntD: boolean;begin
UC: process...end process;cntT: process...end process;cntD: process...end process;regs: process...end process;mux: process...end process;
end architecture;
UC
clk
i
rst
cntTclk
cntDclk
8 Meter_T
Ovflw_T
8 Meter_D
Ovflw_D
clr_cnt
e_cntD regs
clk
e_regs
8 reg_T
reg_Ovflw_T
8 reg_D
reg_Ovflw_D
mux
sel
8 meterovflw
•Cada unidad se ha implementado usando un procesoDeclaración de señales de comunicación entre los procesos•Meter_T/D, y reg_T/D son tipo unsigned(meter’range)•Ovflw_T/D, y reg_Ovflw_T/D son tipo boolean•Señales control son tipo boolean
Conjunto de procesos
•cntT: Contador ascendente, reset a X=“01”, detección overflow18. Descripción Comportamiento
cntT: processvariable var_T: unsigned(meter'range);begin
wait until clk'event and clk='1';if clr_cnt then
var_T:=(0=>'1',others=>'0');Ovflw_T<=false;
elsevar_T:=var_T+1;if var_T=0 then
Ovflw_T<=true;end if;
end if;Meter_T<=var_T;
end process;
Se activa el proceso con de clk(el proceso no tiene lista de sensibilidad)
Reset síncrono a X”01” usando agregadosOvflw_T a false
Cuenta +1 usando la variable (asignación inmediata)Detección de overflow cuando variable=X”00”
Asignación de la variable a la señal
Declaración de una variable usada para contar
•cntD: Contador ascendente, reset a X=“01”, detección overflowcntD: process(clk)
constant MAX: unsigned(meter'range):=(others=>'1');begin
if clk'event and clk='1' thenif clr_cnt then
Meter_D<=conv_unsigned(1,meter'length);Ovflw_D<=false;
elsif e_cntD thenMeter_D<=Meter_D+1;if Meter_D=MAX then
Ovflw_D<=true;end if;
end if;end if;
end process;
Lista de sensibilidad del proceso. Se activa por evento en clk
Detección del de clk
Si e_cntD es true (habilitación del contador D):Cuenta +1 usando la señal (asignación no inmediata)Detección de overflow cuando la señal=MAX=X”FF”
Declaración de constante local MAX=X”FF”
Reset síncrono a X”00” usando conv_unsigned(…);Ovflw_D a false
18. Descripción Comportamiento•regs: Conjunto de registros para almacenamiento de las últimas medidas de Meter_T/D y Ovrflw_T/D
regs: process beginwait until rising_edge(clk) and e_regs;--if e_regs thenreg_T<=Meter_T;reg_D<=Meter_D;reg_Ovflw_T<=Ovflw_T;reg_Ovflw_D<=Ovflw_D;--end if;
end process;
Escritura síncrona de los registrosNo existe valor inicial por reset, (valor inicial indeterminado)
Se activa el proceso por de clk y e_regs=true (habilitación de los registros)(Proceso sin lista de sensibilidad)
•mux: Multiplexor con sel=0/1 para lectura de D/T y overflow D/T
Puede ser no sintetizable. Se puede colocara condición de habilitación fuera del wait until...
mux: process--(sel,reg_T,reg_D,reg_Ovflw_T,reg_Ovflw_D)function convierte(a: boolean) return std_logic isbegin
if a then return '1';else return '0'; end if;
end function;begin
wait on sel,reg_T,reg_D,reg_Ovflw_T,reg_Ovflw_D;if sel='1' then
ovflw<=convierte(reg_Ovflw_T);meter<=std_logic_vector(reg_T);
elseovflw<=convierte(reg_Ovflw_D);meter<=std_logic_vector(reg_D);
end if;end process;
end architecture;
Declaración local de una función de conversión de boolean a std_logic
Señales de activación del procesoSi no es sintetizable, se puede usarlista de sensibilidad en el procesoSi se modela un combinacional, esnecesario que estén todas las señalesque son leídas en el proceso
Todas las opciones están cubiertas:no se infiere ‘latch’
18. Descripción Comportamiento•Unidad de control (UC): generación señales de control clr_cnt, e_cntD, e_regs
S0 S1 S2
S3 S4
S5
0 1
01
1
11
1
0
0
S0 S1 S2 S4S3 S5 S3
1 2 D 1 2
1 2 1 2TT-1T-2
D-1
D,Te_regs
clr_cnts
clr_cnts
clr_cnts
clr_cnts
/e_cntDe_cntD e_cntD
D=D(t)/TCLK
T=T(t)/TCLK
clk
rst
i
Meter_D
Meter_T
Reg_D,Reg_T /e_regs
0
0
FSM Moore
18. Descripción Comportamiento•Unidad de control (UC): generación señales de control clr_cnt, e_cntD, e_regs
S0 S1 S2
S3 S4
S5
0 1
01
1
11
1
0
0
0
0
UC: process(clk,rst)type estados is (S0,S1,S2,S3,S4,S5);variable s: estados;begin
if rst='1' thens:=S0;
elsif rising_edge(clk) then case s is
when S1=> if i='1' then s:=S2; end if;when S2|S5=> if i='1' then s:=S3; else s:=s4; end if;when S3=> if i='0' then s:=S4; end if;when S4=> if i='1' then s:=S5; end if;when others=> if i='0' then s:=S1; end if;
end case;case s is
when S2 downto S0=> clr_cnt<=true; e_cntD<=false; e_regs<=false; when S3=> clr_cnt<=false; e_cntD<=true; e_regs<=false; when S4=> clr_cnt<=false; e_cntD<=false; e_regs<=false; when S5=> clr_cnt<=true; e_cntD<=false; e_regs<=true; when others=> clr_cnt<=true; e_cntD<=false; e_regs<=false;
end case;end if;
end process;
FSM Moore
Reset asíncrono
Control del cambio entre estados
Sel
ecci
ón
mú
ltip
leS
elec
ció
nco
n r
ang
o
Señales de salidason función sólodel estado (no delas entradas)FSM Moore