07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um...

36
1 Fundamentos de Sistemas Digitais profs. Alexandre M. Amory e Fernando G. Moraes CIRCUITOS COMBINACIONAIS modelagem VHDL 04/outubro/2018

Transcript of 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um...

Page 1: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

1

Fundamentos de Sistemas Digitais

profs. Alexandre M. Amory e Fernando G. Moraes

CIRCUITOS COMBINACIONAIS

modelagem VHDL

04/outubro/2018

Page 2: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

2

(1) (DE)CODIFICADOR • Codificador é um circuito que mapeia um conjunto de entradas em um

conjunto de saídas segundo uma função de codificação– Em outras palavras, é um circuito que transforma uma informação de um formato para

outro• Um codificador é normalmente implementado de forma combinacional• Representação gráfica de codificador genérico

E0

E1

EN

S0

S1

SM

Codificador

• Decodificador n à 2n

• Codificador 2n à n

Page 3: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

3

DECODIFICADOR – portas lógicas (nà2n) Decodificador de 3 entradas (A(2 downto 0)) e 23 (8) saídas (dec(7 downto 0))

dec

A0 100 ns 200 ns 300 n0 1 2 3 4 5 6 701 02 04 08 10 20 40 80

Timecont[2:0]dec[7:0]dec[7]dec[6]dec[5]dec[4]dec[3]dec[2]dec[1]dec[0]

A(2)

A(1)A(0)

dec(7)dec(6)dec(5)dec(4)dec(3)dec(2)dec(1)dec(0)

dec <= "00000001" when A="000" else"00000010" when A="001" else"00000100" when A="010" else"00001000" when A="011" else"00010000" when A="100" else"00100000" when A="101" else"01000000" when A="110" else"10000000";

Sempre ter condição default

Page 4: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

4

DECODIFICADOR – com sinal de habilitação

Conforme indicado pela tabela de verdade, apenas uma saída pode ser igual a 0 a qualquer momento, todas as outras saídas são iguais a 1.

TAREFA 1

Page 5: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

5

Display 7 segmentos – simplificando com VHDL

Saida <="1111110" when vetorEnt = "0000" else"0110000" when vetorEnt = "0001 " else"1101101" when vetorEnt = "0010" else"1111001" when vetorEnt = "0011" else"0110011" when vetorEnt = "0100" else"1011011" when vetorEnt = "0101" else"1011111" when vetorEnt = "0101" else"1110000" when vetorEnt = "0111" else"1111111" when vetorEnt = "1000" else"1110011" when vetorEnt = "1001" else"1110111" when vetorEnt = "1010" else"0011111" when vetorEnt = "1011" else"1000110" when vetorEnt = "1100" else"0111101" when vetorEnt = "1101" else"1001111" when vetorEnt = "1110" else"1000111” ;

vetorEnt: valor hexa

bga

cef

d

Entrada C (1100) e saída:

Notar: lógica negada –acende o LED em ’1’

G F E D C B A

G F E D C B A1 0 0 0 1 1 0

Page 6: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

6

EXERCÍCIOS:• Faça a codificação do display de elevador ilustrado abaixo

– Este tem como entrada um vetor de 2 bits que recebe a seguinte codificação

S(0)

S(1)S(2)

S(3) S(4)

E(1 ... 0)

parado 00 -subindo 01 /\

descendo 10 \/

defeito 11 todos segmentos acesos

DECODIFICADOR - exercício

TAREFA 2

Page 7: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

7

– Dois números hexadecimal como entradas, 3 saídas

FIGURE 6-21 Logic symbol for a 4-bit comparator with inequality indication.

A1B1

A2B2

A3B3

A4B4

Output

– Circuito para detectar igualdade:

(2) COMPARADOR

Page 8: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

8

COMPARADOR – unsigned

igual <= '1' when A = B else '0' ; maior <= '1' when A > B else '0' ; menor <= '1' when A < B else '0' ;

2 us 2100 ns 2200 nsB C DB C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4

11 12 1311 12 13 14 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 4

Timea[3:0]=Db[3:0]=8igual=0maior=1menor=0a[3:0]=13b[3:0]=8

library IEEE;use IEEE.std_logic_1164.all;use ieee.std_logic_unsigned.all; --****---

entity comparador is generic(N : integer := 4); port( A, B : in std_logic_vector(N-1 downto 0); igual : out std_logic; maior : out std_logic; menor : out std_logic );end entity;

architecture a1 of comparador is begin

igual <= '1' when A = B else '0' ; maior <= '1' when A > B else '0' ; menor <= '1' when A < B else '0' ;

end architecture a1;

123456789

10111213141516171819202122

Page 9: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

9

COMPARADOR – complemento de dois

2 us 2100 ns 2200 nsB C DB C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4

11 12 1311 12 13 14 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 4

Timea[3:0]=Db[3:0]=8igual=0maior=1menor=0a[3:0]=13b[3:0]=8

use ieee.std_logic_signed.all;

use ieee.std_logic_unsigned.all;

C = 1100 = -4

Page 10: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

10

• É um circuito que permite selecionar uma dentre várias entradas em função de uma variável de controle

(4) MULTIPLEXADOR

2-to-1 MUX

YI0I1

S

EQUIVALENTE EM SOFTWARE: if then elseVHDL: Y <= I0 when S = '0’ else I1;

Page 11: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

11

MULTIPLEXADOR

Atribuição com when ... else

Y <= I(0) when S = “00” elseI(1) when S = “01” elseI(2) when S = “10” elseI(3) ;

I1

I0

S1

YI2

I3

S0

Page 12: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

12

Multiplexadores (2x1 - 4 bits com enable)

Y3

Y2

Y1

Y0

S E

A3

A2

A1

A0

B3

B2

B1

B0

YA

B

S E

4

4

4

TAREFA 3

Page 13: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

13

Construindo multiplexadores maiores a partir de multiplexadores menores

Mux 16 x1 usandomuxes 4x1

TAREFA 4

Page 14: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

14

Demultiplexador

I

Y3

Y2

Y1

Y0

S0S1

I

Y0

Y1

S0

Y2

Y3

S1

• É um circuito que opera de forma inversa ao multiplexador. Ou seja, recebe uma entrada e distribui esta em uma de várias saídas conforme um sinal de seleção

• Exemplo de um multiplexador 1x4:

Page 15: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

15

Demultiplexador

I

Y0

Y1

S0

Y2

Y3

S1

• É um circuito que opera de forma inversa ao multiplexador. Ou seja, recebe uma entrada e distribui esta em uma de várias saídas conforme um sinal de seleção

• Exemplo de um multiplexador 1x4:

2 bits de seleção (S(1...0)) e 22 bits de saídas (Y(3...0))

Y <= "000"& I when S = "00" else"00"&I&’0’ when S = "01" else‘0’&I&"00" when S = "10" elseI&“000”;

& è operador de concatenação

Page 16: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

16

(7) Soma e subtração

Page 17: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

17

(7) Soma e subtração

Entidade com generic

biblioteca

Cria n instâncias da lógica

Cuidado com o generate: curto circuitos

library IEEE;use IEEE.std_logic_1164.all;

entity soma_sub isgeneric(N : integer := 4); port( A, B : in std_logic_vector(N-1 downto 0);

S : out std_logic_vector(N-1 downto 0); mode : in std_logic; --- modo

Cout : out std_logic; OV : out std_logic

);end entity;

architecture a1 of soma_sub issignal c : std_logic_vector(N downto 0);signal bb : std_logic_vector(N-1 downto 0);

beginc(0) <= mode; -- se o cin for 0 é soma, senão é subtração Cout <= c(N); OV <= c(N) xor c(N-1);

add: for i in 0 to N-1 generatebegin

bb(i) <= b(i) xor mode;S(i) <= c(i) xor A(i) xor bb(i);c(i+1) <= (c(i) and A(i)) or (c(i) and bb(i)) or (A(i) and bb(i));

end generate;

end architecture a1;

Page 18: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

18

Testando o soma_sub genérico

Número de bits do somador

Vetores de teste

bibliotecaslibrary ieee,work;use ieee.std_logic_1164.all;use IEEE.std_logic_arith.CONV_STD_LOGIC_VECTOR;

entity testa_soma isend;

architecture a1 of testa_soma is

constant N : natural := 12; -- tamanho do somadores

signal a,b, sum : std_logic_vector(N-1 downto 0); signal cout,mode, ov : std_logic;

type test_record is record a, b : integer; mode : std_logic; end record;

type padroes is array(natural range <>) of test_record;

constant padrao_de_teste : padroes := ( (a => 234, b => 890, mode => '1'), (a => 234, b => 890, mode => '0'), (a => 89 , b => 630, mode => '1'), (a => 89 , b => 630, mode => '0'), (a => 999, b => 710, mode => '1'), (a => 999, b => 710, mode => '0'), (a => 12, b => 501, mode => '1'), (a => 12, b => 501, mode => '0'), (a => 123, b => 432, mode => '1'), (a => 123, b => 432, mode => '0'), (a => 345, b => 323, mode => '1'), (a => 345, b => 323, mode => '0'), (a => 888, b => 121, mode => '1'), (a => 100, b => 900, mode => '0'), (a => 300, b => 124, mode => '1'), (a => 300, b => 124, mode => '0') );begin

sb: entity work.soma_sub generic map(N) port map( a=> a, b=> b, mode=>mode, S=> sum, cout=> cout, ov=>ob); test: process begin

for i in 0 to padrao_de_teste'high loop a <= CONV_STD_LOGIC_VECTOR(padrao_de_teste(i).a, a'length); b <= CONV_STD_LOGIC_VECTOR(padrao_de_teste(i).b, b'length); cin <= padrao_de_teste(i).cin; wait for 10 ns; end loop; end process; end architecture;

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758

Entity sem pinos

Sinais internos

Estrutura de dados para os estímulos

Array sem dimensão

Page 19: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

19

Testando o soma_sub genérico

instância

Loop de varredura

http://www.inf.pucrs.br/moraes/fsd/vhds/tb_somasub.vhd

begin

sb: entity work.soma_subgeneric map(N) port map( a=> a, b=> b, mode=>mode, S=> sum, cout=> cout, ov=>ov);

test: processbegin

for i in 0 to padrao_de_teste'high loopa <= CONV_STD_LOGIC_VECTOR(padrao_de_teste(i).a, a'length); b <= CONV_STD_LOGIC_VECTOR(padrao_de_teste(i).b, b'length); mode <= padrao_de_teste(i).mode; wait for 10 ns;

end loop;end process;

end architecture;

Page 20: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

20

Resultado

TAREFA 5 : realizar esta simulação

0 100 ns834 890 999 501 4095 123 345 888 442 3573134 635 710 101 4095 432 323 121 3874 60700 968 255 1525 289 1709 400 602 0 4094 3787 555 22 668 767 1009 664 220 3513

Timea[11:0]=442b[11:0]=3874sum[11:0]=220mode=0cout=1ov=0

Page 21: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

21

(8) ULA - UNIDADE LÓGICO E ARITMÉTICA

• Unidade Lógica e Aritmética (ULA) é um circuito que realiza funções lógicas e aritméticas

• É um dos componentes de transformação de dados principais de um processador

• Normalmente implementado de forma combinacional

• Representação:Seleção

(comando)

Vetor de saída

Vetor de entrada A

Qualificadores (flags)

Vetor de entrada B

Page 22: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

22

Package:• Declara constantes, tipos de dados,

subprogramas. • Objetivo: reutilização de código

Exemplo de package com operações para a ula(arquivo ula_pack.vhd):

library IEEE;use IEEE.Std_Logic_1164.all;

package p_ula istype op_alu is

( uAND, uOR, uXOR, uSLL, uSRL, uADD, uSUB, uINC, uNEG);end p_ula;

ULA - comandos

op1 op2

outalu

op_alucoutovz

8 8

8

ULA

Page 23: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

23

x”01”

cout

ov

Instanciação do somador (soma/sub/inc/neg)

8 8 8 8

8 8

op1

uINC

aa

op1 x”00”

uNEGdefaultopmode

opmode

uNEG default

8op2

bb

SOMA / SUB

8

soma

0mode

1 default

uADD, uINC

opmode Ação

uINC op1 + 1 + 0

uADD op1+ op2 + 0

uSUB op1+ not(op2) + 1

uNEG (2’s comp) 0 + not(op1) + 1

Obs: o not do segundo operando deve-se ao mode=1

O somador

realiza 4

operações

aritméticas

Page 24: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

24

Instanciação do somador – operações

x”01”

coutov

op1

uINC

op1 x”00”

uNEGdefaultopmode

uNEG default

op2

SOMA / SUB

soma

0mode

1 default

uADD, uINC

Inc: op1 + 1 + 0

x”01”

coutov

op1

uINC

op1 x”00”

uNEGdefaultopmode

uNEG default

op2

SOMA / SUB

soma

0mode

1 default

uADD, uINC

ADD: op1 + op2 + 0

x”01”

coutov

op1

uINC

op1 x”00”

uNEGdefaultopmode

uNEG default

op2

SOMA / SUB

soma

0mode

1 default

uADD, uINC

Sub: op1 + not(op2) + 1

x”01”

coutov

op1

uINC

op1 x”00”

uNEGdefaultopmode

uNEG default

op2

SOMA / SUB

soma

0mode

1 default

uADD, uINC

NEG (2’s com): 0 + not(op1) + 1

Page 25: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

25

VHDL--------------------------------------------------------------------------------- ULA-------------------------------------------------------------------------------library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_unsigned.all;use work.p_ula.all;

entity alu is port( op1, op2 : in std_logic_vector(7 downto 0); opmode : in op_alu; z, cout, ov: out std_logic; outalu : out std_logic_vector(7 downto 0) );end alu;

architecture alu of alu is signal aa, bb, soma: std_logic_vector(7 downto 0) ; signal mode: std_logic ;begin

z <= '1' when op1 = x"00" else '0';

--- --- instancia a soma --- mode <= '0' when opmode=uADD or opmode=uINC else '1';

aa <= x"00" when opmode=uNEG else op1;

bb <= x"01" when opmode=uINC else op1 when opmode=uNEG else op2;

sb: entity work.soma_sub generic map(8) port map( a=> aa, b=> bb, mode=>mode, S=> soma, cout=> cout, ov=>ov); --- --- ULA --- outalu <= op1 and op2 when opmode=uAND else op1 or op2 when opmode=uOR else op1 xor op2 when opmode=uXOR else op1 xor op2 when opmode=uXOR else op1(6 downto 0) & '0' when opmode=uSLL else '0' & op1(7 downto 1) when opmode=uSRL else soma; --- uADD, uSUB, uINC, uNEG

end alu;

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051

op1 op2

outalu

op_alucoutovz

8 8

8

ULA

Page 26: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

26

VHDLop1 op2

outalu

op_alucoutovz

8 8

8

ULA

--------------------------------------------------------------------------------- ULA-------------------------------------------------------------------------------library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_unsigned.all;use work.p_ula.all;

entity alu is port( op1, op2 : in std_logic_vector(7 downto 0); opmode : in op_alu; z, cout, ov: out std_logic; outalu : out std_logic_vector(7 downto 0) );end alu;

architecture alu of alu is signal aa, bb, soma: std_logic_vector(7 downto 0) ; signal mode: std_logic ;begin

z <= '1' when op1 = x"00" else '0';

--- --- instancia a soma --- mode <= '0' when opmode=uADD or opmode=uINC else '1';

aa <= x"00" when opmode=uNEG else op1;

bb <= x"01" when opmode=uINC else op1 when opmode=uNEG else op2;

sb: entity work.soma_sub generic map(8) port map( a=> aa, b=> bb, mode=>mode, S=> soma, cout=> cout, ov=>ov); --- --- ULA --- outalu <= op1 and op2 when opmode=uAND else op1 or op2 when opmode=uOR else op1 xor op2 when opmode=uXOR else op1 xor op2 when opmode=uXOR else op1(6 downto 0) & '0' when opmode=uSLL else '0' & op1(7 downto 1) when opmode=uSRL else soma; --- uADD, uSUB, uINC, uNEG

end alu;

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051

Page 27: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

2723

x”01”

cout

ov

Instanciação do somador (soma/sub/inc/neg)

8 8 8 8

8 8

op1

uINC

aa

op1 x”00”

uNEGdefaultopmode

opmode

uNEG default

8op2

bb

SOMA / SUB

8

soma

0mode

1 default

uADD, uINC

opmode Ação

uINC op1 + 1 + 0

uADD op1+ op2 + 0

uSUB op1+ not(op2) + 1

uNEG (2’s comp) 0 + not(op1) + 1

Obs: o not do segundo operando deve-se ao mode=1

O somador

realiza 4

operações

aritméticas

--------------------------------------------------------------------------------- ULA-------------------------------------------------------------------------------library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_unsigned.all;use work.p_ula.all;

entity alu is port( op1, op2 : in std_logic_vector(7 downto 0); opmode : in op_alu; z, cout, ov: out std_logic; outalu : out std_logic_vector(7 downto 0) );end alu;

architecture alu of alu is signal aa, bb, soma: std_logic_vector(7 downto 0) ; signal mode: std_logic ;begin

z <= '1' when op1 = x"00" else '0';

--- --- instancia a soma --- mode <= '0' when opmode=uADD or opmode=uINC else '1';

aa <= x"00" when opmode=uNEG else op1;

bb <= x"01" when opmode=uINC else op1 when opmode=uNEG else op2;

sb: entity work.soma_sub generic map(8) port map( a=> aa, b=> bb, mode=>mode, S=> soma, cout=> cout, ov=>ov); --- --- ULA --- outalu <= op1 and op2 when opmode=uAND else op1 or op2 when opmode=uOR else op1 xor op2 when opmode=uXOR else op1 xor op2 when opmode=uXOR else op1(6 downto 0) & '0' when opmode=uSLL else '0' & op1(7 downto 1) when opmode=uSRL else soma; --- uADD, uSUB, uINC, uNEG

end alu;

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051

--------------------------------------------------------------------------------- ULA-------------------------------------------------------------------------------library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_unsigned.all;use work.p_ula.all;

entity alu is port( op1, op2 : in std_logic_vector(7 downto 0); opmode : in op_alu; z, cout, ov: out std_logic; outalu : out std_logic_vector(7 downto 0) );end alu;

architecture alu of alu is signal aa, bb, soma: std_logic_vector(7 downto 0) ; signal mode: std_logic ;begin

z <= '1' when op1 = x"00" else '0';

--- --- instancia a soma --- mode <= '0' when opmode=uADD or opmode=uINC else '1';

aa <= x"00" when opmode=uNEG else op1;

bb <= x"01" when opmode=uINC else op1 when opmode=uNEG else op2;

sb: entity work.soma_sub generic map(8) port map( a=> aa, b=> bb, mode=>mode, S=> soma, cout=> cout, ov=>ov); --- --- ULA --- outalu <= op1 and op2 when opmode=uAND else op1 or op2 when opmode=uOR else op1 xor op2 when opmode=uXOR else op1 xor op2 when opmode=uXOR else op1(6 downto 0) & '0' when opmode=uSLL else '0' & op1(7 downto 1) when opmode=uSRL else soma; --- uADD, uSUB, uINC, uNEG

end alu;

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051

23

x”01”

cout

ov

Instanciação do somador (soma/sub/inc/neg)

8 8 8 8

8 8

op1

uINC

aa

op1 x”00”

uNEGdefaultopmode

opmode

uNEG default

8op2

bb

SOMA / SUB

8

soma

0mode

1 default

uADD, uINC

opmode Ação

uINC op1 + 1 + 0

uADD op1+ op2 + 0

uSUB op1+ not(op2) + 1

uNEG (2’s comp) 0 + not(op1) + 1

Obs: o not do segundo operando deve-se ao mode=1

O somador

realiza 4

operações

aritméticas

VHDL - multiplexadores

Page 28: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

28

VHDL - ULA

--------------------------------------------------------------------------------- ULA-------------------------------------------------------------------------------library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_unsigned.all;use work.p_ula.all;

entity alu is port( op1, op2 : in std_logic_vector(7 downto 0); opmode : in op_alu; z, cout, ov: out std_logic; outalu : out std_logic_vector(7 downto 0) );end alu;

architecture alu of alu is signal aa, bb, soma: std_logic_vector(7 downto 0) ; signal mode: std_logic ;begin

z <= '1' when op1 = x"00" else '0';

--- --- instancia a soma --- mode <= '0' when opmode=uADD or opmode=uINC else '1';

aa <= x"00" when opmode=uNEG else op1;

bb <= x"01" when opmode=uINC else op1 when opmode=uNEG else op2;

sb: entity work.soma_sub generic map(8) port map( a=> aa, b=> bb, mode=>mode, S=> soma, cout=> cout, ov=>ov); --- --- ULA --- outalu <= op1 and op2 when opmode=uAND else op1 or op2 when opmode=uOR else op1 xor op2 when opmode=uXOR else op1 xor op2 when opmode=uXOR else op1(6 downto 0) & '0' when opmode=uSLL else '0' & op1(7 downto 1) when opmode=uSRL else soma; --- uADD, uSUB, uINC, uNEG

end alu;

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051

Page 29: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

29

à soma_sub: somador/subtrator com generic

à Exemplo de script para ula conforme este esquema de arquivos:

Estrutura de Arquivostb_ula.vhd

http://www.inf.pucrs.br/moraes/fsd/vhds/tb_ula.vhd

ula.vhd

soma_sub.vhd

ula_pack.vhd

vcom -work work ula_pack.vhdvcom -work work soma_sub.vhdvcom -work work ula.vhdvcom -work work tb_ula.vhd

library IEEE;use IEEE.Std_Logic_1164.all;

package p_ula istype op_alu is

( uAND, uOR, uXOR, uSLL, uSRL, uADD, uSUB, uINC, uNEG);end p_ula;

Page 30: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

30

Testando a ULA

Padrões de teste

Neste exemplo para cadavetor de teste são testadas todas as operações

Varre o tipo enumeradoModo de operação

library ieee,work;use ieee.std_logic_1164.all;use work.p_ula.all;

entity tb isend tb;

architecture a1 of tb is

signal op1, op2, outalu, high : std_logic_vector(7 downto 0); signal produto : std_logic_vector(15 downto 0); signal z, cout, ov : std_logic; signal opmode : op_alu;

type test_record is record a, b : std_logic_vector(7 downto 0); end record;

type padroes is array(natural range <>) of test_record;

constant padrao_de_teste : padroes := ( (a => x"AA", b => x"55"), (a => x"FF", b => x"FF"), (a => x"34", b => x"00"), (a => x"56", b => x"01"), (a => x"05", b => x"0A") );

begin

produto <= high & outalu;

sb: entity work.alu port map( op1=> op1, op2=> op2, outalu=>outalu, high=>high, z=>z, cout=>cout, ov=>ov, opmode=>opmode); test: process begin

for op in op_alu loop

opmode <= op;

for i in 0 to padrao_de_teste'high loop op1 <= padrao_de_teste(i).a; op2 <= padrao_de_teste(i).b; wait for 10 ns; end loop;

end loop;

end process; end architecture;

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354

library ieee,work;use ieee.std_logic_1164.all;use work.p_ula.all;

entity tb isend tb;

architecture a1 of tb is

signal op1, op2, outalu, high : std_logic_vector(7 downto 0); signal produto : std_logic_vector(15 downto 0); signal z, cout, ov : std_logic; signal opmode : op_alu;

type test_record is record a, b : std_logic_vector(7 downto 0); end record;

type padroes is array(natural range <>) of test_record;

constant padrao_de_teste : padroes := ( (a => x"AA", b => x"55"), (a => x"FF", b => x"FF"), (a => x"34", b => x"00"), (a => x"56", b => x"01"), (a => x"05", b => x"0A") );

begin

produto <= high & outalu;

sb: entity work.alu port map( op1=> op1, op2=> op2, outalu=>outalu, high=>high, z=>z, cout=>cout, ov=>ov, opmode=>opmode); test: process begin

for op in op_alu loop

opmode <= op;

for i in 0 to padrao_de_teste'high loop op1 <= padrao_de_teste(i).a; op2 <= padrao_de_teste(i).b; wait for 10 ns; end loop;

end loop;

end process; end architecture;

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354

http://www.inf.pucrs.br/moraes/fsd/vhds/tb_ula.vhd

Page 31: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

31

0 100 ns00000001 00000002 00000003 00000004AA FF 34 00 56 05 AA FF 34 00 56 05 AA FF 34 00 56 05 AA55 FF 00 22 01 0A 55 FF 00 22 01 0A 55 FF 00 22 01 0A 5500 FF 00 FF 34 22 57 0F FF 00 34 22 57 0F 54

3800 FEFF 0000 38FF FEFF 0034 0022 0057 000F 38FF FE00 0034 0022 0057 000F 3854

Timedebug[31:0]=00000001op1[7:0]=AAop2[7:0]=55outalu[7:0]=00cout=1ov=1z=0produto[15:0]=3800

AND: AA.55= 0, FF.FF=FF, 34.00=0, 00.22=0, 56.1=0, 5.A=0

OR: AA+55= FF, FF+FF=FF, 34+00=34, 00+22=22, 56+1=57, 5+A=F

XOR: AA⊕55= FF, FF⊕FF=00,34⊕00=34, 00⊕22=22,56⊕1=57, 5⊕A=F

ZERO=1

AND OR XOR

ZERO=1

Page 32: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

32

200 ns 300 ns00000004 00000005 00000006 00000007AA FF 34 00 56 05 AA FF 34 00 56 05 AA FF 34 00 56 05 AA55 FF 00 22 01 0A 55 FF 00 22 01 0A 55 FF 00 22 01 0A 5554 FE 68 00 AC 0A 55 7F 1A 00 2B 02 FF FE 34 22 57 0F 55

3854 FEFE 0068 0000 00AC 000A 3855 FE7F 001A 0000 002B 0002 38FF FEFE 0034 0022 0057 000F 3855

Timedebug[31:0]=00000001op1[7:0]=AAop2[7:0]=55outalu[7:0]=00cout=1ov=1z=0produto[15:0]=3800

SSL: AA=54, FF=FE, 34=68, 00=00, 56=AC, 5=A

SSR: AA=55, FF=7F, 34=1A, 00=00, 56=2B, 5=2

ADD: AA+55= FF, FF+FF=(1)FE, 34+00=34, 00+22=22, 56+1=57, 5+A=F

SSL SSR ADD

Page 33: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

33

400 ns 500 ns+ 00000007 00000008 00000009 0000000A+ AA FF 34 00 56 05 AA FF 34 00 56 05 AA FF 34 00 56 05 AA+ 55 FF 00 22 01 0A 55 FF 00 22 01 0A 55 FF 00 22 01 0A 55+ 55 00 34 DE 55 FB AB 00 35 01 57 06 56 01 CC 00 AA FB 72

+ 3855 FE00 0034 00DE 0055 00FB 38AB FE00 0035 0001 0057 0006 3856 FE01 00CC 0000 00AA 00FB 3872

Timedebug[31:0]=00000001op1[7:0]=AAop2[7:0]=55outalu[7:0]=00cout=1ov=1z=0produto[15:0]=3800

SUB: AA-55= 55, FF-FF=00, 34-00=34, 00-22=DE, 56-1=55, 5-A=FB

INC: AA-AB, FF= 00, 34=35, 00=01, 56=57, 5=6

2’s: AA=56, FF=01, 34=CC, 00=00, 56=AA, 5=FB

SUB INC 2’S COMP

Page 34: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

34

Tarefas de implementação e teste:– (3,0 pontos) Implementar a ULA de 12 bits conforme os slides anteriores e as

operações abaixo (10 operações)– (2,0 pontos) Entregar um ZIP contendo: fontes VHDLs, script de simulação,

arquivo wave, e um PDF comentado – a ausência de um destes arquivos zera o trabalho, pois impossibilita o professor de simular a ULA

– (5,0 pontos) Apresentar no PDF comentado a simulação para vetores de teste conforme as lâminas anteriores e uma tabela de avaliação de resultados (próxima lâmina). Atenção: plágio é impossível, pois cada grupo terá vetores de teste diferentes – plágio é nota zero para ambos grupos.

Projeto da ULA de 12 (DOZE) bits

op1 op2

outalu

opmodecoutovz

12

ULA

Operações da ULA a ser entregue:• op1 AND op2• op1 OR op2• op1 XNOR op2• op1 SSL op2 (deslocamento parametrizável)• op1 SSR op2 (deslocamento parametrizável)• op1 + op2• op1 – op2• op2 – op1• op1 (deixa passar o operando op1)• – op1 (complemento de dois de op1)

12

12

Page 35: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

35

Para cada operação mostrar dois exemplos, destacados nas formas de onda

Operação Caso 1 Caso2 AND

OR

XNOR

SSL OP1 ssl OP2 (usar para OP2 valores

entre 0 e 11) – mostrar os valores de entrada e saída (binário e hexa)

OP1 ssl OP2 (usar para OP2 valores entre 0 e 11) – mostrar os valores de entrada e saída

(binário e hexa) SSR OP1 ssr OP2 (usar para OP2 valores

entre 0 e 11) – mostrar os valores de entrada e saída (binário e hexa)

OP1 ssr OP2 (usar para OP2 valores entre 0 e 11) – mostrar os valores de entrada e saída

(binário e hexa) SOMA

Cout =____ Ov = _____

Cout =____ Ov = _____

SUB

2’s

AND

Valor hexa:

op1 (binário)

op2 (binário)

resultado (binário)

OR

Valor hexa:

op1 (binário)

op2 (binário)

resultado (binário)

OR

Valor hexa:

op1 (binário)

op2 (binário)

resultado (binário)

XNOR

Valor hexa:

op1 (binário)

op2 (binário)

resultado (binário)

XNOR

Valor hexa:

op1 (binário)

op2 (binário)

resultado (binário)

+

Valor hexa:

op1 (binário)

op2 (binário)

resultado (binário)

+

Valor hexa:

op1 (binário)

op2 (binário)

resultado (binário)

-

Valor hexa:

op1 (binário)

op2 (binário)

resultado (binário)

-

Valor hexa:

op1 (binário)

op2 (binário)

resultado (binário)

-

Valor hexa:

op1 (binário)

resultado (binário)

-

Valor hexa:

op1 (binário)

resultado (binário)

AND

Valor hexa:

op1 (binário) op2 (binário)

resultado (binário)

Apresentar para cada operação a avaliação de dois casos de teste (destacando-os na forma de onda)

Não usar para os testes valores constantes, tipo x”000”, x”FFF”, ter operadores com variação nos ‘0’s e ‘1’ s.

Acrescentar uma linhapara OP2– OP1

Mostrar o complemento de 1 de OP2 e a soma com `1’

Mostrar o complemento de 1 de OP1 e a soma com `1’

Page 36: 07 combinacionais VHDL 2018 2moraes/fsd/aulas/07_combinacionais_VHDL.pdf · • Codificador é um circuito que mapeia um ... • Um codificador é normalmente implementado de forma

36

ULA

use IEEE.std_logic_unsigned.all;….menorU <= '1' when op1 < op2 else '0'; menorS <= '1' when ieee.std_Logic_signed."<"(op1, op2) else '0' ; -- signed

outalu <= ….(0=>menorU, others=>'0') when op_alu=SLTU or op_alu=SLTIU else -- signed(0=>menorS, others=>'0’) when op_alu=SLT or op_alu=SLTI else -- unsigned

….

• Operações comum em processadores

• Comparação (ula retorna ’1’ se op1 < op2)

ext16 <= x"FFFF" & IR(15 downto 0) when IR(15)='1' else x"0000" & IR(15 downto 0);

• Extensão de sinal (neste exemplo op1 só tem 16 bits e precisa 32)

….to_StdLogicVector( to_bitvector(op1) sll CONV_INTEGER(op2) ) when op_alu=SSLL else….

• Deslocamento de n bits – uso de ssl