Upload
vuthuan
View
220
Download
0
Embed Size (px)
Citation preview
1
Fundamentos de Sistemas Digitais
profs. Alexandre M. Amory e Fernando G. Moraes
CIRCUITOS COMBINACIONAIS
modelagem VHDL
04/outubro/2018
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
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
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
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
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
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
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
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
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;
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
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
13
Construindo multiplexadores maiores a partir de multiplexadores menores
Mux 16 x1 usandomuxes 4x1
TAREFA 4
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:
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
16
(7) Soma e subtração
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;
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
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;
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
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
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
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
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
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
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
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
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
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;
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
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
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
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
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
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’
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