SISTEMAS DIGITAIS - UFRGSfglima/aula6e7.pdf · SISTEMAS DIGITAIS Linguagem de ... Comando...

61
SISTEMAS DIGITAIS SISTEMAS DIGITAIS Linguagem de Descrição de Hardware VHDL Prof. Fernanda Gusmão de Lima Kastensmidt [email protected]

Transcript of SISTEMAS DIGITAIS - UFRGSfglima/aula6e7.pdf · SISTEMAS DIGITAIS Linguagem de ... Comando...

SISTEMAS DIGITAISSISTEMAS DIGITAIS

Linguagem de Descrição de HardwareVHDL

Prof. Fernanda Gusmão de Lima [email protected]

7 e 87 e 8ComandosComandos SequenciasSequencias

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

VHDL Communication Model VHDL Communication Model

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.

UsoUso de de VariaveisVariaveis emem VHDLVHDL

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

UsoUso de de VariaveisVariaveis

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.

Maquinas de EstadosMaquinas de Estados

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.