Upload
ngodieu
View
231
Download
0
Embed Size (px)
Citation preview
SISTEMAS DIGITAISSISTEMAS DIGITAIS
Linguagem de Descrição de HardwareVHDL
Prof. Fernanda Gusmão de Lima [email protected]
CMP238 – Prof. Fernanda Lima Kastensmidt
ComandosComandos SequenciaisSequenciais
• Execução de acordo com a ordem com que oscomandos sequenciaisaparecem.
• Permitido apenas dentroda estrutura process
• Usado para representaralgoritmos.
CMP238 – Prof. Fernanda Lima Kastensmidt
Process Process • Contem comandos sequenciais• Existe apenas dentro da arquitetura• Todos os process rodam ao mesmo tempo de maneira
concorrente. • A execução dos process são controladas por:
– Lista de sensibilidade (sinais de trigger para a execução do process), ou
– Comandos de wait • O label do process é opcional
nome: process (lista)begin
<comandos>
end process;
CMP238 – Prof. Fernanda Lima Kastensmidt
ExemploExemplo de Process de Process entity AND_OR_XOR isport (A,B : in std_logic;
Z_OR, Z_AND, Z_XOR : out std_logic);end AND_OR_XOR;
architecture RTL of AND_OR_XOR isbegin
A_O_X: process (A, B) beginZ_OR <= A or B;Z_AND <= A and B;Z_XOR <= A xor B;end process A_O_X ;
end RTL;
CMP238 – Prof. Fernanda Lima Kastensmidt
ExemploExemplo de Process de Process entity AND_OR_XOR isport (A,B : in std_logic;
Z_OR : out std_logic);end AND_OR_XOR;
architecture RTL of AND_OR_XOR isbegin
A_O_X: process (A, B) beginZ_OR <= A or B;Z_OR <= A and B;Z_OR <= A xor B;end process A_O_X ;
end RTL;
O que é sintetisado?
CMP238 – Prof. Fernanda Lima Kastensmidt
ComandoComando: IF… then … else ….: IF… then … else ….if CONDITION then
-- sequential statementsend if;
if CONDITION then-- sequential statements
else-- sequential statements
end if;
if CONDITION then-- sequential statements
elsif CONDITION then-- sequential statements
· · ·else
-- sequential statementsend if;
A condição é umaexpressão booleanaOpcional:-elsif-else
CuidadoCuidado: : todastodas as as opçõesopções de ifs de ifs devemdevem estarestar cobertascobertas no no comandocomando, se , se nãonão, latches e flip, latches e flip--flops flops indesejadosindesejados surgirãosurgirão nanasintesesintese..
CMP238 – Prof. Fernanda Lima Kastensmidt
IF Statement: IF Statement: ExamploExamplo
entity IF_STATEMENT isport (A, B, C, X : in std_logic_vector (3 downto 0);
Z : out std_logic_vector (3 downto 0);end IF_STATEMENT;
architecture EXAMPLE1 of IF_STATEMENT isbegin
process (A, B, C, X)begin
Z <= A;if (X = "1111") then
Z <= B;elsif (X > "1000") then
Z <= C;end if;
end process;end EXAMPLE1;
architecture EXAMPLE2 of IF_STATEMENT isbegin
process (A, B, C, X)begin
if (X = "1111") thenZ <= B;
elsif (X > "1000") thenZ <= C;
elseZ <= a;
end if;end process;
end EXAMPLE2;
Todos os sinaisusados no process estão na lista de sensibilidade
CMP238 – Prof. Fernanda Lima Kastensmidt
TenteTente nãonão cobrircobrir todastodas as as opçõesopções parapara verver o o quequeaconteceacontece…. ….
entity IF_STATEMENT isport (A, B, C, X : in std_logic_vector (3 downto 0);
Z : out std_logic_vector (3 downto 0);end IF_STATEMENT;
architecture EXAMPLE1 of IF_STATEMENT isbegin
process (A, B, C, X)begin
-- Z <= A;if (X = "1111") then
Z <= B;elsif (X > "1000") then
Z <= C;end if;
end process;end EXAMPLE1;
architecture EXAMPLE2 of IF_STATEMENT isbegin
process (A, B, C, X)begin
if (X = "1111") thenZ <= B;
elsif (X > "1000") thenZ <= C;
--else-- Z <= a;
end if;end process;
end EXAMPLE2;
Todos os sinaisusados no process estão na lista de sensibilidade
CMP238 – Prof. Fernanda Lima Kastensmidt
ComandoComando: CASE … is… WHEN ….: CASE … is… WHEN ….
case EXPRESSION is
when VALUE_1 =>-- sequential statements
when VALUE_2 | VALUE_3 =>-- sequential statements
when VALUE_4 to VALUE_N =>-- sequential statements
when others =>-- sequential statements
end case ;
• Opções não podem ser coincidentes.
• Todas as opções devemser cobertas:
• valores simples • intervalo de valores• seleção de valores por("|" que significa "or") • uso obrigatorio de "when others" paracobrir a(s) ultima(s) opções.
CMP238 – Prof. Fernanda Lima Kastensmidt
entity CASE_STATEMENT isport (A, B, C : in std_logic_vector(3 downto 0);
X : in std_logic_vector(3 downto 0);Z : std_logic_vector(3 downto 0));
end CASE_STATEMENT;
architecture EXAMPLE of CASE_STATEMENT issignal X_int : integer range from 0 to 15;beginX_int <= conv_integer(X);
process (A, B, C, X_int)begin
case X_int iswhen 0 =>
Z <= A;when 7 | 9 =>
Z <= B;when 1 to 5 =>
Z <= C;when others =>
Z <= 0;end case;
end process;end EXAMPLE;
CMP238 – Prof. Fernanda Lima Kastensmidt
entity RANGE_2 isport (A, B, C, X : in std_logic_vector(3 downto 0);
Z : out std_logic_vector(3 downto 0);end RANGE_2;
architecture EXAMPLE of RANGE_2 isbegin
process (A, B, C, X)begin
case X iswhen "0000" =>
Z <= A;when "0111" | "1001" =>
Z <= B;when "0001" to "0101" => -- wrong
Z <= C;when others =>
Z <= 0;end case;
end process;end EXAMPLE;
A sequencia de valores é indefinida para arrays.
CMP238 – Prof. Fernanda Lima Kastensmidt
entity CONDITIONAL_ASSIGNMENT isport (A, B, C, X : in bit_vector (3 downto 0);
Z_CONC : out bit_vector (3 downto 0);Z_SEQ : out bit_vector (3 downto 0));
end CONDITIONAL_ASSIGNMENT;
architecture EXAMPLE of CONDITIONAL_ASSIGNMENT isbegin
-- Concurrent version of conditional signal assignmentZ_CONC <= B when X = "1111" else
C when X > "1000" elseA;
-- Equivalent sequential statementsprocess (A, B, C, X)begin
if (X = "1111") thenZ_SEQ <= B
elsif (X > "1000") thenZ_SEQ <= C;
elseZ_SEQ <= A;
end if;end process;
end EXAMPLE;
Comando concorrente
Comando sequencial no process
IMP: ambos comandos são concorrentes entre si e geram o mesmo circuito combinacional.
CMP238 – Prof. Fernanda Lima Kastensmidt
ComandoComando: FOR Loops : FOR Loops
entity FOR_LOOP isport (A : in integer range 0 to 3;
Z : out std_logic_vector (3 downto 0));end FOR_LOOP;
architecture EXAMPLE of FOR_LOOP isbegin
process (A)begin
Z <= "0000";for I in 0 to 3 loop
if (A = I) thenZ(I) <= `1`;
end if;end loop;
end process;end EXAMPLE;
Se o LOOP é para ser sintetizado, o intervalo do loop não pode dependerdo valor de um sinal ouvariavel, ou seja, deve ser totalmente estático o intervalo.
CMP238 – Prof. Fernanda Lima Kastensmidt
Loop Loop SintaxeSintaxe
[LOOP_LABEL :]for IDENTIFIER in DISCRETE_RANGE loop
-- sequential statementsend loop [LOOP_LABEL] ;
[LOOP_LABEL :]while CONDITION loop
-- sequential statementsend loop [LOOP_LABEL] ;
CMP238 – Prof. Fernanda Lima Kastensmidt
entity CONV_INT isport (VECTOR: in bit_vector(7 downto 0);
RESULT: out integer);end CONV_INT;
architecture A of CONV_INT isbegin
process(VECTOR)variable TMP: integer;
beginTMP := 0;
for I in 7 downto 0 loopif (VECTOR(I)='1') then
TMP := TMP + 2**I;end if;
end loop;
RESULT <= TMP;end process;
end A;
architecture B of CONV_INT isbegin
process(VECTOR)variable TMP: integer;
beginTMP := 0;
for I in VECTOR'range loopif (VECTOR(I)='1') then
TMP := TMP + 2**I;end if;
end loop;
RESULT <= TMP;end process;
end B;
architecture C of CONV_INT isbegin
process(VECTOR)variable TMP: integer;variable I : integer;
beginTMP := 0;I := VECTOR'high;while (I >= VECTOR'low) loop
if (VECTOR(I)='1') thenTMP := TMP + 2**I;
end if;I := I - 1;
end loop;RESULT <= TMP;
end process;end C;
CMP238 – Prof. Fernanda Lima Kastensmidt
GeraçãoGeração de de códigocódigo
[LOOP_LABEL :]for IDENTIFIER in DISCRETE_RANGE generate
-- statementsend generate [LOOP_LABEL] ;
signal A, B : std_logic_vector(8 downto 0);signal F : std_logic_vector(7 downto 0);
architecture B of CONV_INT isbegint1: for I in 1 to 7 generate
F(i) <= A(I+1) or B(I-1);end generate;
end B;
CMP238 – Prof. Fernanda Lima Kastensmidt
entity PARITY isport (DATA: in std_logic_vector (3 downto 0);
ODD : out std_logic);end PARITY;
architecture RTL of PARITY isbegin
process (DATA)variable TMP : bit;
beginTMP := `0`;
for I in DATA`low to DATA`high loopTMP := TMP xor DATA(I);
end loop;
ODD <= TMP;end process;
end RTL;
CMP238 – Prof. Fernanda Lima Kastensmidt
ComandoComando: WAIT: WAIT
O comando wait' para a execução do process – O process é continuado quando a instrução é completada.
– wait para um especifico tempo
– wait por um evento do sinal
– wait por uma condição verdadeira(necessita de um evento do sinal)
– indefinido (process não é mais ativado)
CMP238 – Prof. Fernanda Lima Kastensmidt
WAIT Statement: WAIT Statement: ExemplosExemplos
STIMULUS: processbegin
SEL <= `0`;BUS_B <= "0000";BUS_A <= "1111";wait for 10 ns;
SEL <= `1`;wait for 10 ns;
SEL <= `0`;wait for 10 ns;
wait;end process STIMULUS;
CMP238 – Prof. Fernanda Lima Kastensmidt
READ_CPU : processbegin
wait until CPU_DATA_VALID = `1`;CPU_DATA_READ <= `1`;wait for 20 ns;LOCAL_BUFFER <= CPU_DATA;wait for 10 ns;CPU_DATA_READ <= `0`;
end process READ_CPU;
CMP238 – Prof. Fernanda Lima Kastensmidt
WAIT Statement: WAIT Statement: ExemplosExemplos
entity FF isport (D, CLK : in bit;
Q : out bit);end FF;
architecture BEH_2 of FF isbegin
processbegin
wait until CLK=`1`;
Q <= D;
end process;end BEH_2;
AprendendoAprendendo porpor exemplosexemplos
Recapitulando VHDL de comandos quegeram circuitos combinacionais
CMP238 – Prof. Fernanda Lima Kastensmidt
SomadorSomador 1 bit1 bitComandos concorrentes de atribuição simples
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity somador1bit isPort ( a : in STD_LOGIC;
b : in STD_LOGIC;cin : in STD_LOGIC;sum : out STD_LOGIC;cout : out STD_LOGIC);
end somador1bit;
architecture Behavioral of somador1bit is
begin
sum <= a xor b xor cin;cout <= (a and b) or (a and cin) or (b and cin);
end Behavioral;
CMP238 – Prof. Fernanda Lima Kastensmidt
Somador 8 bitsSomador 8 bitsComandos concorrentes de atribuição simples e instanciação hierarquica deComponentes.
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity somador8bits isPort ( dadoa : in STD_LOGIC_VECTOR (7 downto 0);
dadob : in STD_LOGIC_VECTOR (7 downto 0);carry_in : in STD_LOGIC;dado_soma : out STD_LOGIC_VECTOR (7 downto 0);carry_out : out STD_LOGIC);
end somador8bits;
architecture Behavioral of somador8bits is
component somador1bit isPort ( a : in STD_LOGIC;
b : in STD_LOGIC;cin : in STD_LOGIC;sum : out STD_LOGIC;cout : out STD_LOGIC);
end component;
signal carry_int : std_logic_vector(6 downto 0);
begin
bit0: somador1bitport map(dadoa(0), dadob(0), carry_in, dado_soma(0), carry_int(0));bit1: somador1bitport map(dadoa(1), dadob(1), carry_int(0), dado_soma(1), carry_int(1));bit2: somador1bitport map(dadoa(2), dadob(2), carry_int(1), dado_soma(2), carry_int(2));bit3: somador1bitport map(dadoa(3), dadob(3), carry_int(2), dado_soma(3), carry_int(3));bit4: somador1bitport map(dadoa(4), dadob(4), carry_int(3), dado_soma(4), carry_int(4));bit5: somador1bitport map(dadoa(5), dadob(5), carry_int(4), dado_soma(5), carry_int(5));bit6: somador1bitport map(dadoa(6), dadob(6), carry_int(5), dado_soma(6), carry_int(6));bit7: somador1bitport map(dadoa(7), dadob(7), carry_int(6), dado_soma(7), carry_out);
end Behavioral;
CMP238 – Prof. Fernanda Lima Kastensmidt
Somador de 8 bitsSomador de 8 bitsUso de componentes e do comando FOR - GENERATE
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity somador8bits_vfor isPort ( dadoa : in STD_LOGIC_VECTOR (7 downto 0);
dadob : in STD_LOGIC_VECTOR (7 downto 0);carry_in : in STD_LOGIC;dado_soma : out STD_LOGIC_VECTOR (7 downto 0);carry_out : out STD_LOGIC);
end somador8bits_vfor;
architecture Behavioral of somador8bits_vfor is
component somador1bit isPort ( a : in STD_LOGIC;
b : in STD_LOGIC;cin : in STD_LOGIC;sum : out STD_LOGIC;cout : out STD_LOGIC);
end component;
signal carry_int : std_logic_vector(7 downto 0);
begin
bit0: somador1bitport map(dadoa(0), dadob(0), carry_in, dado_soma(0), carry_int(0));
l1: for i in 1 to 7 generatebitx: somador1bitport map(dadoa(i), dadob(i), carry_int(i-1), dado_soma(i), carry_int(i));end generate;
carry_out <= carry_int(7);
end Behavioral;
CMP238 – Prof. Fernanda Lima Kastensmidt
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity comparador_4bits isPort ( dadox : in STD_LOGIC_VECTOR (3 downto 0);
dadoy : in STD_LOGIC_VECTOR (3 downto 0);comp : out STD_LOGIC_VECTOR (1 downto 0));
end comparador_4bits;
architecture Behavioral of comparador_4bits is
begin
process(dadox, dadoy)begin
if (dadox>dadoy) thencomp <= "10";
elsif (dadox=dadoy) and dadox="1111" thencomp <= "11";
elsif (dadox=dadoy) and dadox="0000" thencomp <= "00";
elsecomp <= "01";
end if;end process;
end Behavioral;
CMP238 – Prof. Fernanda Lima Kastensmidt
MultiplexadorMultiplexadorUSA PROCESS e comandos sequenciais como CASE
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity mux isPort ( d0 : in STD_LOGIC_VECTOR (7 downto 0);
d1 : in STD_LOGIC_VECTOR (7 downto 0);d2 : in STD_LOGIC_VECTOR (7 downto 0);d3 : in STD_LOGIC_VECTOR (7 downto 0);d4 : in STD_LOGIC_VECTOR (7 downto 0);d5 : in STD_LOGIC_VECTOR (7 downto 0);d6 : in STD_LOGIC_VECTOR (7 downto 0);d7 : in STD_LOGIC_VECTOR (7 downto 0);sel : in STD_LOGIC_VECTOR (2 downto 0);out_mux : out STD_LOGIC_VECTOR (7 downto 0));
end mux;
architecture Behavioral of mux is
begin
process(d0, d1, d2, d3, d4, d5, d6, d7, sel)begincase sel isWHEN "000" => out_mux <=d0;WHEN "001" => out_mux <=d1;WHEN "010" => out_mux <=d2;WHEN "011" => out_mux <=d3;WHEN "100" => out_mux <=d4;WHEN "101" => out_mux <=d5;WHEN "110" => out_mux <=d6;WHEN others => out_mux <=d7;end case;end process;
end Behavioral;
CMP238 – Prof. Fernanda Lima Kastensmidt
ULA de 8 bits c/ 4 operaçõesULA de 8 bits c/ 4 operações
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ULA_8bits isPort ( A : in STD_LOGIC_VECTOR (8 downto 0);
B : in STD_LOGIC_VECTOR (8 downto 0);controle : in STD_LOGIC_VECTOR(1 downto 0);saida : out STD_LOGIC_VECTOR (8 downto 0));
end ULA_8bits;
architecture Behavioral of ULA_8bits is
begin
process(A, B, controle)beginCASE controle ISWHEN "00" => saida <= A + B;WHEN "01" => saida <= A - B;WHEN "10" => saida <= A xor B;WHEN others => saida <= A and (not B);END CASE;
end process;
end Behavioral;
CMP238 – Prof. Fernanda Lima Kastensmidt
ULA de 8 bits c/ 4 operaçõesULA de 8 bits c/ 4 operações
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ULA_8bits_sp isPort ( A : in STD_LOGIC_VECTOR (8 downto 0);
B : in STD_LOGIC_VECTOR (8 downto 0);controle : in STD_LOGIC_VECTOR(1 downto 0);saida : out STD_LOGIC_VECTOR (8 downto 0));
end ULA_8bits_sp;
architecture Behavioral of ULA_8bits_sp is
begin
saida <= A+B when controle="00" elseA-B when controle="01" elseA xor B when controle="10" elseA and (not B);
end Behavioral;
ImplementaçãoImplementação de de circuitoscircuitossequenciaissequenciais
Sensíveis ao relógio (clk)
CMP238 – Prof. Fernanda Lima Kastensmidt
Clocked Process: Clocked Process: DetecçãoDetecção dada bordaborda do Clock do Clock
ifclock_signal_ name'EVENT and clock_signal_ name='1' clock_signal_ name='1' and clock_signal_ name'EVENTnot clock_signal_ name'STABLE and clock_signal_ name='1' clock_signal_ name='1' and not clock_signal_ name'STABLERISING_EDGE ( clock_signal_ name)
IEEE 1076.6 is not fully supported by all tools
CMP238 – Prof. Fernanda Lima Kastensmidt
Clocked Process: Clock Edge DetectionClocked Process: Clock Edge Detection
wait until•clock_signal_ name'EVENT andclock_signal_ name='1' •clock_signal_ name='1' and clock_signal_ name'EVENT•not clock_signal_ name'STABLE and clock_signal_ name='1' •clock_signal_ name='1' and not clock_signal_ name'STABLE•RISING_EDGE ( clock_signal_ name) •clock_signal_ name='1'
IEEE 1076.6 is not fully supported by all tools
CMP238 – Prof. Fernanda Lima Kastensmidt
Detection of a Rising Edge by Use of Functions Detection of a Rising Edge by Use of Functions
• Defined in std_logic_1164 package
processbegin
wait until RISING_EDGE (CLK);Q <= D;
end process;
function RISING_EDGE (signal CLK : std_ulogic)return boolean is
beginif (CLK`event and CLK = `1` and CLK`last_value = `0`) then
return true;else
return false;end if;
end RISING_EDGE;
CMP238 – Prof. Fernanda Lima Kastensmidt
Clocked Process: Rules Clocked Process: Rules
processbegin
wait until CLK'event and CLK='1';if RESET = '1' then
-- synchronous register resetelse
-- combinatoricsend if;
end process;
Wait-form:no sensitivity list Synchronous reset
If-form:only clock and asynchronous signals (reset) in sensitivity list Synchronous and asynchronous reset
process(CLK, RST)begin
if (RST = `1`) then-- asynchronous register reset
elsif (CLK`event and CLK=`1`) then-- combinatorics
end if;end process;
Elementos de memoria são inferidos, ouseja, gerados sempre que os sinaisreceberem assinalamentos dentro de uma process controlado por relógio(clock)
CMP238 – Prof. Fernanda Lima Kastensmidt
RegistradorRegistrador: Asynchronous Set/Reset : Asynchronous Set/Reset library IEEE;use IEEE.std_logic_1164.all;
entity ASYNC_FF isport (CLK, SET, RST : in std_logic;D : in std_logic_vector(7 downto 0);Q : out std_logic_vector(7 downto 0));end ASYNC_FF;
architecture RTL of ASYNC_FF isbegin
process (CLK, RST, SET)begin
if (RST = `1`) thenQ <= `0`;
elsif SET ='1' thenQ <= '1';
elsif (CLK`event and CLK = `1`) thenQ <= D;
end if;end process;
end RTL;
CMP238 – Prof. Fernanda Lima Kastensmidt
RegistradorRegistrador: Synchronous Set/Reset : Synchronous Set/Reset library IEEE;use IEEE.std_logic_1164.all;
entity ASYNC_FF isport (CLK, SET, RST : in std_logic;D : in std_logic_vector(7 downto 0);Q : out std_logic_vector(7 downto 0));end ASYNC_FF;
architecture RTL of ASYNC_FF isbegin
process (CLK)begin
if (CLK’event and CLK = ’1’) then if (RST = ’1’) then
Q <= `0`;elsif SET ='1' then
Q <= '1';else
Q <= D;end if;
end if;end process;
end RTL;
CMP238 – Prof. Fernanda Lima Kastensmidt
RegistradorRegistrador: Synchronous Set/Reset : Synchronous Set/Reset library IEEE;use IEEE.std_logic_1164.all;
entity ASYNC_FF isport (D, CLK, SET, RST : in std_logic;
Q : out std_logic);end ASYNC_FF;
architecture RTL of ASYNC_FF isbegin
process (CLK)begin
if (CLK`event and CLK = `1`) then if (RST = `1`) then
Q <= `0`;elsif SET ='1' then
Q <= '1';else
Q <= D;end if;
end if;end process;
end RTL;
CMP238 – Prof. Fernanda Lima Kastensmidt
RegistradorRegistrador ContadorContadorlibrary IEEE;use IEEE.std_logic_1164.all;
entity COUNTER isport (CLK: in std_logic;
Q : out std_logic_vector(3 downto 0);end COUNTER;
architecture RTL of COUNTER issignal COUNT : std_logic_vector(3 downto 0); begin
process (CLK)begin
if CLK’event and CLK = ’1’ thenif (COUNT >= “1001”) then
COUNT <= “0000”;else
COUNT <= COUNT +1;end if;
end if;end process;
Q <= COUNT ;
COUNT: 4 flip flops Q: not used in clocked process pois é um pino de saida e NÃO pode ser lido no process.
CMP238 – Prof. Fernanda Lima Kastensmidt
VariaveisVariaveis
• Variaveis são usadasapenas em processes – São declaradas antes do
begin do process – Conhecidas apenas
localmente no process ondeforam declaradas
• VHDL 93: variaveis globais– Não sintetizavel
• Assinalamento global – signal to variable – variable to signal – types have to match
architecture RTL of XYZ issignal A, B, C : integer range 0 to 7;signal Y, Z : integer range 0 to 15;
beginprocess (A, B, C)
variable M, N : integer range 0 to 7;begin
M := A;N := B;Z <= M + N;M := C;Y <= M + N;
end process;end RTL;
CMP238 – Prof. Fernanda Lima Kastensmidt
VariaveisVariaveis vs. vs. SinaisSinais
• Valores de sinais são assinalados depois da execução do process.
• Apenas o ultimo assinalamento é levado em consideração• M <= A;
é sobre escrito por M <= C; • A segunda entrada do somador é conectado a C.
signal A, B, C, Y, Z : integer;
beginprocess (A, B, C)
variable M, N : integer;begin
M := A;N := B;Z <= 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)
beginM <= A;N <= B;Z <= M + N;M <= C;Y <= M + N;
end process;
CMP238 – Prof. Fernanda Lima Kastensmidt
entity PARITY isport (DATA: in std_logic_vector (3 downto 0);
ODD : out bit);end PARITY;
architecture RTL of PARITY isbegin
process (DATA)variable TMP : bit;
beginTMP := `0`;
for I in DATA`low to DATA`high loopTMP := TMP xor DATA(I);
end loop;
ODD <= TMP;end process;
end RTL;
CMP238 – Prof. Fernanda Lima Kastensmidt
Global Variables (VHDL'93) Global Variables (VHDL'93)
architecture BEHAVE of SHARED isshared variable S : integer;
beginprocess (A, B)begin
S := A + B;end process;
process (A, B)begin
S := A - B;end process;
end BEHAVE;
Acessivel por todosos processos.
Não é sintetizavel
Pode ocasionar errosmuito comuns de valores de saidaindeterminado.
CMP238 – Prof. Fernanda Lima Kastensmidt
Maquinas de EstadoMaquinas de Estado
f
clk
Entrada
estado
Proximo estado
saida
Reset
Tipo Melay and Moore
LOGIC + RegisterProcess(clk, reset)Begin
CASE entrada&estado IS......WHEN ... =>estado <= Proximo estado ;Saida <= .....;.....End process;
clk
Registradores: saida e estado
CMP238 – Prof. Fernanda Lima Kastensmidt
Maquinas de EstadoMaquinas de Estado
f
clk
Entrada
estado
Proximo estado
saida
Reset
Tipo Melay e Moore
REGISTER
LOGICProcess(entrada, estado)Begin.....Saida <= ...;Proximo estado <= ....;.....End process;
Process(clk, reset)Begin.....estado <= Proximo estado ;.....End process;Registradores: estado
CMP238 – Prof. Fernanda Lima Kastensmidt
Maquinas de EstadoMaquinas de Estado
f
clk
Entrada
estado
Proximo estado
saida
Reset
Tipo Moore
REGISTER
LOGICProcess(entrada, estado)Begin.....Proximo estado <= ....;.....End process;
Process(clk, reset)Begin.....estado <= Proximo estado ;.....End process;
Registradores: estado
Process(estado)Begin.....saida <= ....;.....End process;
LOGIC
CMP238 – Prof. Fernanda Lima Kastensmidt
Maquinas de EstadoMaquinas de Estado
Reset=1A=0
A=1
A=1
A=0
Z=0
Z=1
s0
s1
Exemplo 1: Moore
Process(clk, reset)BeginIf reset=‘1’ then
estado <= s0;Elsif (clk’event and clk=‘1’) then
estado <= prox_estado;End if;End process;
Process(A, estado)BeginCASE estado isWhen s0 => if A=‘0’ then prox_estado <= s0;
else prox_estado <= s1;When s1 => if A=‘0’ then prox_estado <= s0;
else prox_estado <= s1;END CASE;End process;
Process(estado)BeginIf estado = s0 then
Z<=0;Else Z<=1;End if;End process;
CMP238 – Prof. Fernanda Lima Kastensmidt
Maquinas de EstadoMaquinas de Estado
Reset=1A=0
A=1
A=1
A=0
Z=0
Z=1
s0
s1
Exemplo 1: Moore
Process(clk, reset)BeginIf reset=‘1’ then
estado <= s0;Elsif (clk’event and clk=‘1’) then
estado <= prox_estado;End if;End process;
Process(A, estado)BeginCASE estado isWhen s0 => Z<=‘0’;
if A=‘0’ then prox_estado <= s0;else prox_estado <= s1;
When s1 => Z<=‘1’;if A=‘0’ then prox_estado <= s0; else prox_estado <= s1;
END CASE;End process;
CMP238 – Prof. Fernanda Lima Kastensmidt
Maquinas de EstadoMaquinas de Estado
Reset=1A=0
A=1
A=1
A=0
Z=0
Z=1
s0
s1
Exemplo 2: MealyProcess(clk, reset)BeginIf reset=‘1’ then
estado <= s0;Elsif (clk’event and clk=‘1’) then
estado <= prox_estado;End if;End process;
Process(A, estado)BeginCASE estado isWhen s0 => if A=‘0’ then prox_estado <= s0; Z<=‘0’;
else prox_estado <= s1; Z<=‘1’;When s1 => if A=‘0’ then prox_estado <= s0; Z<=‘1’;
else prox_estado <= s1; Z<=‘0’;END CASE;End process;
Z=0
Z=1
CMP238 – Prof. Fernanda Lima Kastensmidt
Maquinas de EstadoMaquinas de Estado
Reset=1A=0
A=1
A=1
A=0
Z=0
Z=1
s0
s1
Exemplo 3: Mealy
Process(clk, reset)BeginIf reset=‘1’ then
estado <= s0;Elsif (clk’event and clk=‘1’) thenCASE estado isWhen s0 => if A=‘0’ then estado <= s0; Z<=‘0’;
else estado <= s1; Z<=‘1’;When s1 => if A=‘0’ then estado <= s0; Z<=‘1’;
else estado <= s1; Z<=‘0’;END CASE;End process;
Z=0
Z=1
CMP238 – Prof. Fernanda Lima Kastensmidt
Codificação FSMCodificação FSM
• 1) Não defina previamente os estados com uma codificação em binário, e sim deixe o nome do estado textual
type T_STATE is (RESET, START, EXECUTE, FINISH);
signal estado, prox_estado : T_STATE ;
• 2) Deixe a ferramenta codificar o estado
CMP238 – Prof. Fernanda Lima Kastensmidt
Codificação de EstadosCodificação de Estados
• Binária: – Usa um baixo numero de bits para armazenar o estado. Ou seja, n bits
de armazenamento representa 2n estados. – Pode ser na ordem crescente ou não– Existem algoritmos para determinar a melhor ordem de codificação de
estados para minimizar área e maximizar o desempenho.• One-hot
– Cada estado tem o seu bit na decodificação, logo uma máquina de n estados vai precisar de n bits para armazenar o estado.
– Apenas um bit é setado por vez.– Apresenta um baixo consumo de potencia na transíção de estados pois
apenas dois bits são alterados por transição.– Pode apresentar maior confiabilidade a erros.
• Gray– A codificação dos estado segue o codigo Gray, logo há apenas uma
transição de bit por estado o que reduz ainda mais a potencia natransição de estados.
CMP238 – Prof. Fernanda Lima Kastensmidt
Exercicio 1:Exercicio 1:
• Represente a maquina de estados a seguir em VHDL e sintetize no ISE com a opção de codificação: binaria, one-hot e gray e compare area, desempenho e potencia.
Start=0, t=xStart=1, t=x
Idle S0
t=x, start=x t=0, start=x
S1 doneResetr =1Resetd = 1Resets = 1LDRaiz = 0LDr = 0LDs = 0LDd = 0Ca = 0Cb = 00Cin = 0
Resetr =0Resetd = 0Resets = 0LDRaiz = 1LDr = 0LDs = 0LDd = 0Ca = 0Cb = 00Cin = 0
Resetr =0Resetd = 0Resets = 0LDRaiz = 0LDr = 1LDs = 0LDd = 0Ca = 0Cb = 01Cin = 0
Resetr =0Resetd = 0Resets = 0LDRaiz = 0LDr = 0LDs = 0LDd = 0Ca = 0Cb = 0Cin = 0
S2
Resetr =0Resetd = 0Resets = 0LDRaiz = 0LDr = 0LDs = 0LDd = 1Ca = 1Cb = 00Cin = 0
S3
Resetr =0Resetd = 0Resets = 0LDRaiz = 0LDr = 0LDs = 1LDd = 0Ca = 1Cb = 10Cin = 1
t=1, start=x
CMP238 – Prof. Fernanda Lima Kastensmidt
Exercicio 2:Exercicio 2:
• Implemente o datapath a seguir em VHDL
dado
Raiz r d s
Resetd
somadorCin
ResetsResetr
≤
LDRaiz LDr LDd LDS
Ca
2 1
Cb
t
0 1 00 01 10
CMP238 – Prof. Fernanda Lima Kastensmidt
Exercicio 3:Exercicio 3:
• Você acaba de implementar o controle ( a maquina de estados ) e a parte operativa (datapath) do extrator de raiz quadrada.
• Então una os dois modulos em um modulo de VHDL topo, e simule o extrator de raiz quadrata.
CMP238 – Prof. Fernanda Lima Kastensmidt
Exercício 4:Exercício 4:
• Lembrando que o algoritmo da extração de raiz quadrada é:
Ler X-- inicializaçãor=1; d=2; s=4;Enquanto (t==1) {r=r+1;d=d+2;s=s+d+1;t=ac(s,x);}devolve(r);}ac(a,b)semsinal a, b;{Se (a<=b) retorna (1); Senão retorna
(0);}
Tente implementar em VHDL o algoritmo usando apenas um process
CMP238 – Prof. Fernanda Lima Kastensmidt
ConclusãoConclusão
• Você acaba de implemetar de duas maneiras diferentes o mesmo circuito em VHDL.
• A primeira aboradagem é chamada de descrição RTL (Register Transfer Level), ou seja, a parte de controle e a parte operativa com os registradores esta toda muito bem definida.
• A segunda implementação é chamada de “alto nível” pois a implementação é mais em nível algoritmo e a ferramenta de sintese terá que identificar os registradores e operadores.