Guião completo do 3º trabalho laboratorial

Propaganda
FEUP/DEEC/MIEEC - Laboratório de Sistemas Digitais 2006/07
Laboratório 3
LSDI 2006/07 - Laboratório 3: Construção de uma Unidade Lógica e Aritmética
1 - Introdução
Neste trabalho laboratorial será construído e ensaiado um circuito designado por Unidade Lógica e Aritmética (ou
ALU de Arithmetic Logic Unit). Este circuito é um componente importante de um microprocessador, responsável
pela realização das operações aritméticas e lógicas. O sistema digital que foi ensaiado no primeiro trabalho
laboratorial incluía uma unidade deste tipo que apenas suportava as operações de adição e subtracção,
semelhante ao que foi desenvolvido no laboratório 2 (addsub4).
Neste trabalho pretende-se desenvolver uma ALU mais completa que realize operações entre números de 8 bits (A
e B) e suporte um total de 8 funções definidas pelo valor de 3 bits dado na entrada OPR (tabela 1). O símbolo
lógico que representa esse circuito é mostrado na figura 1.
8
8
A
3
B
OPR
FLAGS
4
R
8
Figura 1 – Símbolo lógico representando a ALU a desenvolver.
Tabela 1 – Operações a realizar pela ALU determinadas pelo valor na entrada OPR
OPR Valor a produzir em R Comentários
000
B
R é igual ao valor de B
001
A-B
R é igual à diferença A – B
010
A+B
R é igual à adição A + B
011
A^B
R é igual ao valor do OU-Exclusivo entre A e B
100
A >> 1
R é igual ao valor A dividido por 2 (ver nota)
101
A << 1
R é igual ao valor A multiplicado por 2
110
A&B
R é igual à operação AND entre os bits de A e B
111
A|B
R é igual à operação OR entre os bits de A e B
nota: esta operação deve considerar A como representando um valor com sinal em
complemento para 2. Assim, ao deslocar os bits de A uma posição para a direita deverá ser
feita a extensão de sinal de forma a manter o sinal do valor representado em A.
O interface do circuito a desenvolver é representado pelo código Verilog seguinte:
module
input
input
output
output
lsdalu( A, B, OPR, R, FLAGS );
[7:0] A, B; // os dois operandos de 8 bits, A e B
[2:0] OPR;
// 3 bits que definem a operação a realizar
[7:0] R;
// resultado da operação entre A e B definida pelo valor em OPR
[3:0] FLAGS; // 4 bits que assinalam propriedades do resultado R (ver tabela 2)
http://www.fe.up.pt/~jca/feup/lsdi
1/4
AJA/ASG/HSM/JCA
FEUP/DEEC/MIEEC - Laboratório de Sistemas Digitais 2006/07
Laboratório 3
Tabela 2 – Significado dos 4 bits da saída FLAG; nos casos contrários aos indicados o
bit correspondente deverá ser igual a zero.
bit da saída FLAGS
Comentários
FLAGS[0]
flag ZERO: é igual a 1 se o resultado R for igual a zero
FLAGS[1]
flag SINAL: é igual a 1 se R for negativo (bit de sinal igual a 1)
FLAGS[2]
flag CARRY: é igual a 1 se ocorrer carry na adição ou subtracção
FLAGS[3]
flag OVFL: é igual a 1 se ocorrer overflow na adição ou subtracção
nota: “flag” é uma designação corrente atribuída a um bit num sistema digital que serve para
assinalar o estado verdadeiro ou falso de uma condição associada ao resultado de uma
operação aritmética ou lógica
Este trabalho é composto por duas partes: projecto, a realizar em casa e entregar ao docente no início da aula
laboratorial, e a implementação e ensaio que será realizada na aula de laboratório. O trabalho de preparação em
casa consiste no desenvolvimento do módulo referido, que poderá ser complementado com a sua simulação caso
tenha acesso a um simulador de Verilog (por exemplo o ModelSim). Para isso é fornecido como anexo a este guião
um modelo de teste que o permite simular, verificando o seu funcionamento para algumas operações (ficheiro
lsdalu_testbench.v).
2 - Projecto
Uma forma de implementar o circuito pretendido consiste em construir diferentes circuitos combinacionais (com
declarações assign) que representem cada uma das operações realizadas, e depois numa declaração always @*
usar uma só instrução case...endcase que represente um multiplexer para escolher para a saída R o resultado
adequado em função do valor dado na entrada OPR. Por sua vez, cada um dos bits da saída FLAGS pode também
ser definido como circuitos combinacionais à custa de outras declarações assign ou always @*. Pode ser
seguido como exemplo o circuito somador-subtractor que foi apresentado na aula teórica no slide 58, que tem
uma funcionalidade parecida com a da ALU a desenvolver embora só faça 2 operações, adição e subtracção.
a) Considerando o interface referido acima, escreva as 8 declarações assign que implementam cada uma das
funções referidas na tabela 1. “Ligue” ao resultado de cada operação um wire de 8 bits com o nome ROPR0,
ROPR1,...,ROPR7, respectivamente para a operação efectuada quando OPR é igual a 0, 1,...,7
b) Escreva as 4 declarações assign (ou always @*) que definem os valores para os 4 bits da saída FLAGS. Note
que FLAGS[3] se refere ao bit 3 (o mais significativo) do sinal FLAGS e FLAGS[0] é o bit menos significativo.
Note que se utilizar declarações always @* os sinais a quem são atribuídos valores devem ser declarados
como sinais do tipo reg.
c) Escreva agora a declaração always @* que representa o multiplexer de 8 entradas que escolhe para a saída
R o sinal que representa o resultado de cada uma das declarações assign que foram construídas em a)
3 – Simulação do circuito
Após projectar o circuito lsdalu, simule-o usando para modelo de teste o que é dado no ficheiro anexo
lsdalu_testbench.v. Note que o circuito que pretende simular tem um total de 19 entradas (3+8+8) e 12 (4+8)
saídas e por isso uma simulação exaustiva (i.e. aplicando nas entradas todos os valores possíveis) obrigaria a testar
todas as 219=524288 situações diferentes. O modelo de teste não faz esta verificação exaustiva e aplica apenas
alguns valores em A e B para cada uma das operações (OPR), imprimindo o valor do resultado na janela de texto
do simulador.
a) Analise o código Verilog contido na declaração initial do modelo de teste e acrescente mais valores de
teste que lhe permitam verificar o correcto funcionamento das partes do seu circuito que produzem os valores
para a saída FLAGS.
b) Simule o seu circuito usando o módulo de teste dado e verifique que funciona conforme o esperado.
http://www.fe.up.pt/~jca/feup/lsdi
2/4
AJA/ASG/HSM/JCA
FEUP/DEEC/MIEEC - Laboratório de Sistemas Digitais 2006/07
Laboratório 3
4 – Implementação e ensaio
~
4.1 – Projecto ISE
Para ensaiar a unidade lógica e aritmética desenvolvida esta será integrada num projecto do programa ISE para a
placa S3BOARD, que implementa uma unidade de cálculo elementar. O circuito lógico que está construído neste
projecto é ilustrado na figura 2 onde se mostra a ligação das entradas e saídas aos botões de pressão,
interruptores, LEDs e mostradores.
Liga aos 8 interruptores
(sw7,sw6,…sw0)
8
Liga ao botão btn3
clock
pressionar o botão provoca
uma transição 0->1 de clock
Liga aos 3 botões
(btn2,btn1,btn0)
Liga aos 2 mostradores
da direita
A
8
A
3
OPR
Liga aos 2 mostradores
da esquerda
B
FLAGS
4
R
8
FLAGS
Liga aos 4 LEDs
(ld3, ld2, ld1, ld0)
Figura 2 – Circuito lógico implementado no projecto fornecido.
As entradas e saídas do circuito dado são as seguintes:
Os 8 interruptores de 2 posições (sob os mostradores) permitem definir, em binário, o valor do operando B da
ALU: colocando um interruptor para cima define um 1 e para baixo representa um zero. O valor colocado nestes
interruptores é afixado nos 2 mostradores da direita em hexadecimal.
O valor da entrada OPR da ALU é definido com os 3 botões de pressão do lado direito (btn2, btn1, btn0):
pressionando um botão coloca o bit correspondente igual a 1 (por exemplo, para definir a operação OU-Exclusivo
deve ser aplicada na entrada OPR o valor 011 o que é feito pressionando os botões btn1 e btn0).
A e FLAGS são registos (conjuntos de flip-flops do tipo D) que são actualizados sempre que o sinal clock passa de
0 para 1; esta acção é realizada pressionando o botão de pressão btn3 (botão mais à esquerda), o que faz carregar
o registo A com o resultado corrente na saída R da ALU e o registo FLAGS com o valor que a ALU produz na saída
FLAGS. O valor presente no registo A é afixado nos 2 mostradores do lado esquerdo e o estado das 4 flags é
mostrado no 4 LEDs (ld3, ld2, ld1, ld0).
4.2 – Implementação do projecto
Para implementar o projecto dado com a sua ALU basta abrir o projecto lsdi-lab3 no programa ISE, editar o
ficheiro lsdalu.v e incluir o código Verilog do modelo que construiu para a sua ALU. Note que deve respeitar
rigorosamente o interface dado na parte 1 do guião, nomeadamente no que se refere aos nomes dos sinais de
interface e ao nome do módulo, caso contrário a implementação não será realizada com sucesso.
Seleccionando o módulo lsdi-lab3, active a opção “Generate Programming File” ou então “Configure Device”; caso
não ocorram erros na implementação, programe a FPGA da placa e experimente o seu circuito.
4.3 - Como utilizar o circuito?
O circuito permite efectuar operações elementares entre um número de 8 bits e o valor presente no registo A.
Para realizar uma operação basta definir o valor do operando B actuando nos 8 interruptores, pressionar os botões
que definem a operação a realizar e (mantendo estes premidos) pressionar e largar o botão btn3 (o que provoca
http://www.fe.up.pt/~jca/feup/lsdi
3/4
AJA/ASG/HSM/JCA
FEUP/DEEC/MIEEC - Laboratório de Sistemas Digitais 2006/07
Laboratório 3
uma transição de 0 para 1 do sinal clock). O resultado produzido pela ALU é carregado no registo A e mostrado
em hexadecimal nos 2 mostradores da esquerda.
Por exemplo, para efectuar a adição 5 + 23 devem ser efectuados os seguintes passos:
1 - carregar o valor 5 para o registo A: colocar os interruptores com 00000101, não pressionar nenhum
dos botões que definem OPR (ou seja, OPR=000 o que coloca na saída da ALU o valor de B) e actuar
a entrada clock para carregar o registo A com o valor presente na saída da ALU que é o valor de B
2 – adicionar 23 ao valor de A e colocar o resultado no registo A: colocar os interruptores com 00010111
(B=23), colocar OPR=010 e actuar a entrada clock.
Combinando várias destas operações simples é possível efectuar cálculos com alguma complexidade, embora
restritos apenas a valores numéricos representados com 8 bits. Cada operação elementar, como as referidas no
exemplo acima, pode ser representada com uma notação simbólica que torna mais fácil especificar uma sequência
de operações necessárias para efectuar um determinado cálculo (tabela 3).
Tabela 3 – Operações elementares realizadas pelo circuito dado e representação simbólica de cada uma
OPR
000
001
010
011
100
101
110
111
Valor colocado no registo A
B
A-B
A+B
A^B
A >> 1
A << 1
A&B
A|B
operação simbólica
A←B
A←A-B
A←A+B
A←A^B
A ← A >> 1
A ← A << 1
A←A&B
A←A|B
Comentários
A fica como valor de B
A fica com o resultado de A - B
A fica com o resultado de A - B
A fica com o resultado do XOR entre A e B (A ^ B)
A fica com o valor de A deslocado para a direita 1 bit
A fica com o valor de A deslocado para a esquerda 1 bit
A fica com o resultado do E entre A e B (A & B)
A fica com o resultado do OU entre A e B (A | B)
Por exemplo, para calcular o valor da expressão ( ( (23-56) / 2 ) + 34 ) * 2 podemos escrever uma lista de 5
operações simbólicas que podem depois ser executadas na nossa calculadora, uma em cada transição do sinal
clock:
Operação simbólica
Como realizar
A
A
A
A
A
←
←
←
←
←
23
A – 56
A >> 1
A + 34
A << 1
Colocar
Colocar
Colocar
Colocar
Colocar
B com 23 e OPR com 000
B com 56 e OPR com 001
OPR com 100 (o valor de B não interessa)
B com 34 e OPR com 010
OPR com 101 (o valor de B não interessa)
4.4 – Ensaio do circuito
a) Defina um conjunto de dados e de operações que lhe permitam verificar todas as operações que a ALU
consegue realizar, verificando o valor das saídas FLAGS para cada caso.
b) Construa conjuntos de operações elementares, usando a notação simbólica introduzida acima, que permitam
calcular as expressões aritméticas seguintes:
4+4+5+6
-89 – ( 9 * 4 ) - 45
( 13 * 9 ) / 2
–3 * ( 15 + 8 ) - 99
127 + (- 128)
c) Experimente executar as sequências de operações elementares que construiu na alínea anterior e confirme os
resultados obtidos.
http://www.fe.up.pt/~jca/feup/lsdi
4/4
AJA/ASG/HSM/JCA
Download