laboratÓrio iiiweb.tecnico.ulisboa.pt/~ist425292/wordpress/wp...teste teórico de sistemas digitais...
TRANSCRIPT
-
SISTEMAS DIGITAIS 2015-2016, MEEC
Página | 1
SISTEMAS DIGITAIS
LABORATÓRIO III
CIRCUITOS SEQUENCIAIS
13-11-2015
Grupo 84-Turno de laboratório (Quarta-Feira, LSD3)
Professor Francisco Garcia
Ana Bárbara Faias Mateus - 83992
Paulo Jorge Laranjeira Bernardo - 84157
-
SISTEMAS DIGITAIS 2015-2016, MEEC
Página | 2
Introdução
O laboratório L3 tinha objetivo principal servir de tutorial à escrita linguagem de simulação e prototipagem
de circuitos lógicos VHDL, através da ferramenta ISE da XILINX. Aliado à aprendizagem desta linguagem, este
projeto também pretendia instruir de uma forma prática o funcionamento de componentes como Flip- Flops e
Somadores de 4 entradas, até a este laboratório nunca antes testados experimentalmente.
Este trabalho estava separado em duas partes principais, sendo a primeira a apreensão de como utilizar o
XILINX e as suas capacidades mais úteis. A segunda nada mais era que, partindo do circuito tutorial previamente
fornecido e testado, criar o nosso próprio circuito lógico através da linguagem VHDL.
Respostas às Questões do Enunciado
1. X1 X2 X3 Y
0 0 0 0
0 0 1 0
0 1 0 1
0 1 1 0
1 0 0 0
1 0 1 1
1 1 0 1
1 1 1 1
2. A partir da análise da Tabela 1, e do logigrama do circuito, obteve-se a expressão mínima disjuntiva abaixo:
Y = f(X1, X2, X3) = X1* X3 + X2 * 𝐗𝟑̅̅ ̅̅
3. O circuito dado poderá ser substituído por um Multiplexer uma vez que é exatamente esse componente que a
função que define o circuito descreve. Isto observa-se se considerarmos como bits de entrada os bits A3 (como o
bit de escolha), A1 (quando A3=1 ⇒ Y=A1), e A2 (quando A3=0 ⇒ Y=A2).
Tabela 1- Tabela de verdade do circuito “nand_logic”
-
SISTEMAS DIGITAIS 2015-2016, MEEC
Página | 3
Tabela 2 – Valores apresentados no diagrama temporal do circuito
Tabela 3 – Tabela de Verdade do circuito “unidade_aritmetica”,
onde 𝑄0𝑡+1 = 𝑄0 + 𝑢𝑚 𝑓𝑙𝑎𝑛𝑐𝑜 𝑑𝑒 𝑟𝑒𝑙ó𝑔𝑖𝑜 𝑎𝑠𝑐𝑒𝑛𝑑𝑒𝑛𝑡𝑒 e
𝑄1𝑡+1 = 𝑄1 + 𝑢𝑚 𝑓𝑙𝑎𝑛𝑐𝑜 𝑑𝑒 𝑟𝑒𝑙ó𝑔𝑖𝑜 𝑎𝑠𝑐𝑒𝑛𝑑𝑒𝑛𝑡𝑒
Fig. 1 – Diagrama temporal obtido através do programa XILINX
4. t/ns 000 100 200 300 400 500 600 700 800 900
X1 0 0 0 0 0 1 1 1 1 0
X2 0 0 0 1 1 0 0 1 1 0
X3 0 0 1 0 1 0 1 0 1 0 Y 0 0 0 1 0 0 1 1 1 0
Os valores das 3 entradas X e da saída Y, correspondem ao longo do tempo aos valores obtidos para Y na Tabela (de verdade) 1, comprovando-se assim que esta, e consequentemente a função apresentada em (2.) se encontram corretas.
5. E 𝑸𝟎𝒕 𝑸𝟏𝒕 𝑸𝟎𝒕+𝟏 𝑸𝟏𝒕+𝟏 S
0 0 0 0 0 0
0 0 1 0 0 1
0 1 0 1 1 1
0 1 1 1 1 0
1 0 0 1 0 0
1 0 1 0 1 1
1 1 0 1 0 1
1 1 1 0 1 0
Considerando Q0 a saída do FDR “da esquerda” e Q1 a saída do FDR “da direita” no logigrama do circuito
“unidade_aritmetica” e sendo 𝑸𝑶𝒕 e 𝑸𝟏𝒕 os valores de Q0 e Q1 um flanco de relógio antes de 𝑸𝑶𝒕+𝟏 e 𝑸𝟏𝒕+𝟏 respetivamente, obtém-se a Tabela (de verdade) 3. Aqui Os valores tomados como iniciais para Q0, Q1 e E são os que dão entrada no circuito “nand_logic”. Sendo a saída destes a entrada dos Flip-Flops tipo D, cuja saída Q varia sempre que a entrada D varia (no flanco de relógio seguinte), a saída Q dos flip-flops mudará para o valor que saiu dos circuitos “nand_logic”. Assim sendo, serão estes valores que poderão ser encontrados nas saídas do circuito correspondentes a Q0 e Q1.
S provém da ligação a uma porta XOR de 𝑸𝑶𝒕+𝟏 e 𝑸𝟏𝒕+𝟏. Como tal, S só fica ativa se 𝑸𝑶𝒕+𝟏 ≠ 𝑸𝟏𝒕+𝟏.
6. É a presença da entrada E no circuito que possibilita uma alteração de estado dos Flip-Flops tipo D (ou seja, a
variação das suas saídas Q):
-
SISTEMAS DIGITAIS 2015-2016, MEEC
Página | 4
Quando E se altera de 0 para 1, é o FDR-0 (Q=Q1) a variar no flanco de relógio imediatamente seguinte (ou seja, é a saída Q0 que varia de valor).
Quando E se altera de 1 para 0, é o FDR-1 (Q=Q1) a variar no flanco de relógio imediatamente seguinte (ou seja, é a saída Q1 que varia de valor).
Estas variações devem-se à ligação de E, Q0 e Q1 às entradas X3, X2 e X3 (respetivamente) de ambos os circuitos “nand_logic” (denotar que num destes Q1 é negado, o que provoca uma ainda maior variação de valores). Partindo da Tabela (de verdade) 1, as saídas Y dos circuitos “nand_logic” correspondem às entradas D dos FDR, e como tal influenciam diretamente a variação dos valores de Q0 e Q1 (e também a saída S), ou seja, afetam diretamente o estado destes Flip-Flops.
7.
Através da observação do diagrama pode-se observar que este começa com a ativação momentânea do
RESET, forçando tanto Q1 como Q0 a "0". No momento em que há um impulso do exterior que compele o bit E a ser ativado, em concordância com a
Tabela 3, a entrada do Q0 é ativada também, ficando Q0 = "1", sendo que Q1 não é afetado por E=1. Quando E retorna a "0" os valores das entradas são novamente mudados, sendo desta vez o sinal de Q1
ativado, e mantendo-se Q0 estável, pois E=0 não o influencia. Esta variação de Q1 e Q0 dependente de E=0 e E=1 respetivamente prolonga-se indefinidamente, sempre que há variação de E. Sendo S um OU-exclusivo das saídas Q1 e Q0, este é ativado sempre que Q0 ≠ Q1, ou seja, quando um está ativado e o outro não.
8.
Fig. 3 – Diagrama de
estados do circuito
“unidade_aritmetica”
Fig. 2 – Diagrama
temporal do circuito
“unidade_aritmetica”
-
SISTEMAS DIGITAIS 2015-2016, MEEC
Página | 5
9. Quando E passa a 1, no flanco de relógio ascendente imediatamente seguinte S fica com um valor igual a Q0.
Quando E retorna a 0, no flanco de relógio ascendente imediatamente S fica com um valor igual ao de Q1. Estes valores correspondem aos apresentados na Tabela (de verdade) 3, onde efetivamente, dependendo do
valor de E, S varia de acordo com 𝑸𝟏𝒕 e 𝑸𝟎𝒕 , não sendo influenciado pelo Q oposto.
10. 1º Erro O código “is” estava em falta na linha onde se denomina a entidade do circuito na linha 30
(“entity unidade_aritmetica (is)”) 2º Erro Sendo o componente “somador_4bits” um somador de 4 bits, a entrada “pre_soma_opa” estava
definida apenas pelos bits “101”, na linha 81. Assim sendo, este foi por isso substituído por “0101” (pois o 0 não tem qualquer interferência no valor, que se mantém (5)10).
3º Erro O componente “xor_3bits” referenciado no programa na linha 81, não se encontrava definido na arquitetura da entidade “unidade_aritmetica” sendo por isso necessário defini-lo. Na verdade, a descrição do programa já la e encontrava, estando, contudo, identificada como um comentário (escrita após dois hífens). Ao retirar os hífens, o programa passou a reconhecer o “xor_3bits”.
4º Erro No final da descrição encontrada na linha 107 faltava um semi-colon ( ; - ponto e vírgula), tendo sido necessária a sua reposição.
11. (Poderá encontrar o código da “unidade_aritmetica” sem erros no final do relatório)
12.
No logigrama representado na Fig. 4 encontra-se representada a divisão inteira de A e posterior soma a 5.
Após isto é efetuado o complemento de B (ou seja, obtemos no final -B), que é depois somado com o resultado das duas operações anteriormente exercidas sobre A. Assim sendo:
S = (𝐀 𝟐⁄ + 5) - B
Fig. 4 – Logigrama do circuito
“unidade_aritmetica”
-
SISTEMAS DIGITAIS 2015-2016, MEEC
Página | 6
13. Cálculo de K0 (dígito menos significativo (base 4) do número de aluno de menor valor):
O número de aluno de menor valor entre ambos é 83992. Assim sendo, o dígito menos significativo (base 4) corresponderá ao resto da divisão de 83992 por 4. 83992= 20998 * 4 + 0 → Sendo o resto da divisão zero, K0 = 0.
Cálculo de K1 (dígito menos significativo (base 2) do número de aluno de maior valor): O número de aluno de maior valor entre ambos é 84157. Assim sendo, o dígito menos significativo (base 2) corresponderá ao resto da divisão de 84157 por 2. 84157= 42078 * 2 + 1 → Sendo o resto da divisão um, K1 = 1.
Cálculo de c0 (K0mod3 + 1): Sendo c0 a soma de 1 ao resto da divisão de K0 por 3, e sendo K0 = 3 * 0 + 0, conclui-se que K0mod3 = 0. Assim sendo, c0 = 0 + 1 = 1.
Cálculo de c1 ((−𝟏)𝑲𝟏): Sendo K1 = 1, (−1)1 = -1. Assim sendo c1 = -1.
Cálculo de Z: Z = c0 * A + c1 * B Z = 1 * A + (-1) * B Ou seja, a função aritmética é dada por Z = A – B.
14.
15. (Poderá encontrar o código da nova “unidade_aritmetica” [A – B] no final do relatório)
Fig. 5 – Logigrama do circuito
“unidade_aritmetica” (modificado
para corresponder à função Z = A – B)
-
SISTEMAS DIGITAIS 2015-2016, MEEC
Página | 7
Fig. 6 – Diagrama temporal obtido através do programa XILINX da
nova “unidade_aritmética” (A-B)
Implementação do Circuito
Inicialmente surgiam erros no circuito que não compreendíamos, e que nos impediam de fazer uma correta
implementação deste. Nem mesmo o professor foi capaz de imediatamente esclarecer que problema poderia
estar a ser criado, mas já depois da própria aula, uma análise mais aprofundada permitiu-nos corrigi-los,
garantido uma implantação do circuito eficaz, onde erros como “0 – 0 =5” já não surgiam segundo o diagrama
temporal do circuito.
Para a montagem do circuito foram seguidas as instruções dadas no guia, garantindo assim que era realizada
a operação Z = A - B, simplesmente alterando o valor de A para (0)10 = (000)2. Após isto, B foi ligado aos
interruptores a si atribuídos, garantindo assim que, apresentando um dado valor para B, este seria subtraído a A.
Isto já só foi feito na aula por necessidade de esclarecimento de certas dúvidas.
Após o término deste planeamento, enviou-se o circuito para o computador existe na sala, que tinha conexão
direta com a placa de prototipagem de VHCL “Basys”. Nesta o circuito foi estudado e verificado, após a ativação
da placa através do programa Adept.
Foi assim possível observar que os LEDs, correspondendo a um dado valor de B, coagiriam que caracteres
apresentados no display a vermelho a mostrar à saída do circuito os valores correspondentes a um dado B, ou
seja, os resultados da função Z = A – B, em numeração hexadecimal.
Conclusão
Este laboratório foi efetivamente mais complexo que qualquer um dos anteriores, e por isso mais difícil de
concretizar. Dado isto, a sua preparação foi mais morosa, principalmente por ser necessária de conjugar com o
teste teórico de Sistemas Digitais que também tivemos de enfrentar.
Não conseguimos ser 100% bem-sucedidos na aula laboratorial, devido a erros que inicialmente nem o
próprio professor conseguia corrigir, mas que, depois de analisarmos com tempo, foram reparados. Apesar disto
o funcionamento da plataforma Basys ocorreu como pretendido, ainda que ao princípio fosse difícil compreender
que informação esta nos estava a providenciar.
Podemos concluir positivamente que no fim fomos bem-sucedidos no nosso laboratório, mesmo com a
linguagem VHDL a não nos ser ainda muito acessível. Aguardamos agora as diretrizes do próximo laboratório, às
quais pretendemos dedicar mais tempo anterior à aula laboratorial, para estarmos mais familiarizados com toda
e qualquer pergunta que nos possa ser feita na aula e também com os programas utilizados.
-
SISTEMAS DIGITAIS 2015-2016, MEEC
Página | 8
Código de “unidade_aritmetica” sem erros
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 15:44:21 10/15/2015
-- Design Name:
-- Module Name: unidade_aritmetica - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity unidade_aritmetica is
port
(
-- A e B são dois operandos sem sinal
A : in std_logic_vector(2 downto 0);
B : in std_logic_vector(2 downto 0);
Y : out std_logic_vector(7 downto 0)
);
end unidade_aritmetica;
architecture Behavioral of unidade_aritmetica is
COMPONENT xor_3bits
PORT(
A : IN std_logic_vector(2 downto 0);
B : IN std_logic_vector(2 downto 0);
Y : OUT std_logic_vector(2 downto 0)
);
END COMPONENT;
COMPONENT somador_4bits
PORT(
-
SISTEMAS DIGITAIS 2015-2016, MEEC
Página | 9
A : IN std_logic_vector(3 downto 0);
B : IN std_logic_vector(3 downto 0);
CIN : IN std_logic;
S : OUT std_logic_vector(3 downto 0);
COUT : OUT std_logic
);
END COMPONENT;
signal n_b : std_logic_vector(2 downto 0);
signal sh_a : std_logic_vector(3 downto 0);
signal pre_soma_opa, pre_soma_opb : std_logic_vector(3 downto 0);
signal pre_soma_res : std_logic_vector(4 downto 0);
signal carry : std_logic;
signal soma_opa, soma_opb : std_logic_vector(7 downto 0);
signal soma_res : std_logic_vector(7 downto 0);
begin
----
sh_a '0',
S => pre_soma_res(3 downto 0),
COUT => pre_soma_res(4)
);
--------------------------------------------------------------------------
-- 3 bits XOR gate
--------------------------------------------------------------------------
----
Inst_xor_3bits: xor_3bits PORT MAP(
A => B,
B => "111",
Y => n_b
);
---------------------------------------------------------------------------
-- Operacao aritmetica sobre operandos A e B com sinal
---------------------------------------------------------------------------
----
soma_opa
-
SISTEMAS DIGITAIS 2015-2016, MEEC
Página | 10
----
low_somador_4bits: somador_4bits PORT MAP(
A => soma_opa(3 downto 0),
B => soma_opb(3 downto 0),
CIN => '1',
S => soma_res(3 downto 0),
COUT => carry
);
high_somador_4bits: somador_4bits PORT MAP(
A => soma_opa(7 downto 4),
B => soma_opb(7 downto 4),
CIN => carry,
S => soma_res(7 downto 4),
COUT => open
);
---------------------------------------------------------------------------
-- Saida
---------------------------------------------------------------------------
Y
-
SISTEMAS DIGITAIS 2015-2016, MEEC
Página | 11
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity unidade_aritmetica is
port
(
-- A e B são dois operandos sem sinal
A : in std_logic_vector(2 downto 0);
B : in std_logic_vector(2 downto 0);
Y : out std_logic_vector(7 downto 0)
);
end unidade_aritmetica;
architecture Behavioral of unidade_aritmetica is
COMPONENT xor_3bits
PORT(
A : IN std_logic_vector(2 downto 0);
B : IN std_logic_vector(2 downto 0);
Y : OUT std_logic_vector(2 downto 0)
);
END COMPONENT;
COMPONENT somador_4bits
PORT(
A : IN std_logic_vector(3 downto 0);
B : IN std_logic_vector(3 downto 0);
CIN : IN std_logic;
S : OUT std_logic_vector(3 downto 0);
COUT : OUT std_logic
);
END COMPONENT;
signal n_b : std_logic_vector(2 downto 0);
signal sh_a : std_logic_vector(3 downto 0);
signal pre_soma_opa, pre_soma_opb : std_logic_vector(3 downto 0);
signal pre_soma_res : std_logic_vector(4 downto 0);
signal carry : std_logic;
signal soma_opa, soma_opb : std_logic_vector(7 downto 0);
signal soma_res : std_logic_vector(7 downto 0);
begin
----
sh_a B,
B => "111",
Y => n_b
);
-
SISTEMAS DIGITAIS 2015-2016, MEEC
Página | 12
--