Está en la página 1de 3

Laboratrio de Sistemas, Processadores e Perifricos

Projeto da Unidade Lgica-Aritmtica


Prof. Julio C. D. de Melo DELT/EEUFMG
1.

Introduo
A Unidade Lgica-Aritmtica (ULA) de um processador o mdulo responsvel pela realizao de todas as
operaes lgicas e aritmticas definidas pelo seu conjunto de instrues. Entre as operaes lgicas esto AND,
OR, XOR e NOT, alm daquelas relativas ao deslocamento esquerda ou direita do contedo de um registrador.
As trs primeiras so binrias (operam sobre dois registradores) e as de deslocamento e o NOT so unrias (operam
sobre um nico registrador). Entre as operaes aritmticas, a adio e a subtrao esto presentes em todos os
processadores, sendo as operaes de multiplicao e diviso restritas aos processadores de maior desempenho.
Outras operaes incluem a comparao, realizada atravs da subtrao sem atualizao de registradores mas
refletindo o resultado nos sinalizadores.
O resultado de uma operao na ULA tipicamente armazenado num registrador mas pode ser descartado se o
que se deseja apenas sinalizar a condio resultante da operao tal como, por exemplo, se a adio de dois
nmeros produz um resultado positivo, negativo ou nulo. A condio armazenada em sinalizadores (flags), que
refletem condies tais como:
zero: o resultado da operao na ULA produziu o valor 0 (zero)
positivo: idem, produziu um valor positivo (formato complemento-de-2)
negativo: idem, produziu um valor negativo (formato complemento-de-2)
estouro: idem, produziu um valor que ultrapassa o limite mximo (positivo ou negativo) para nmeros em
formato complemento-de-2
vai-um (carry): idem, produziu um vai-um final do bit mais significativo (formato sem sinal)
paridade: idem, indica se o nmero de 1s no resultado par ou no
Na arquitetura MIPS, como explicado no livro-texto, decidiu-se implementar apenas um sinalizador, o de zero,
sendo os outros derivados dele em funo da realizao de outras operaes entre os operandos.
2. Objetivos
O objetivo desta aula prtica a implementao, simulao e teste de uma ULA que implemente as seguintes
operaes lgicas e aritmticas:
AND, OR, NOR: AND, OR e NOR lgicos, entre dois operandos de 32 bits
ADD: adio de dois operandos de 32 bits no formato complemento-de-2
SUB: subtrao de dois operandos de 32 bits no formato complemento-de-2
SLT: comparao entre dois operandos de 32 bits no formato complemento-de-2
O projeto lgico dever ser definido atravs da linguagem VHDL, j estudada nas disciplinas de sistemas
digitais. No site da disciplina, h vrias referncias sobre a linguagem. Aps a entrada do projeto lgico, ele dever
ser compilado e simulado, para verificao do seu correto funcionamento.
3. Parte Experimental
A parte experimental consiste em testar o projeto de uma ULA que suporte um subconjunto das instrues
definidas para o processador MIPS. Para isto, conforme descrito no captulo 4 do livro-texto (figura 4.12), sero
implementadas as funes dadas na tabela abaixo e que faro uso da ALU em seu processamento:
opcode

ALUOp

Operation

funct

ALU function

ALU control

lw

00

load word

XXXXXX

add

0010

sw

00

store word

XXXXXX

add

0010

beq

01

branch equal

XXXXXX

subtract

0110

R-type

10

add

100000

add

0010

R-type

10

subtract

100010

subtract

0110

R-type

10

AND

100100

AND

0000

R-type

10

OR

100101

OR

0001

R-type

10

set-on-less-than

101010

set-on-less-than

0111

3.1. Atividade 1
Nesta atividade, voc dever verificar o funcionamento do projeto da ULA atravs de sua simulao. Para isto,
proceda como descrito a seguir:

Curso de Engenharia Eltrica da UFMG Sistemas, Processadores e Perifricos

3.

Crie um novo projeto: FileNew Project Wizard. Clique em Next.


Selecione o seu diretrio de trabalho e entre com o nome ULA. Selecione o arquivo com o nome
ULA.vhd, clique em Add e em Next.
Selecione a famlia Cyclone II e o dispositivo do kit DE2 (EP2C35672C6N) e clique em Next e Finish.

4.
5.

Compile o projeto selecionando ProcessingStart Compilation ou o cone na barra de ferramentas.


Simule o projeto no ModelSim utilizando o arquivo ULA_tb.vhd, que realiza a operao 1+1 = 2.

1.
2.

Verifique o funcionamento da ULA alterando o arquivo de testes de forma a gerar valores diferentes para os
operandos A e B, bem como alterando a funo F.
3.2. Atividade 2
A atividade 2 consiste em verificar o funcionamento da ULA no kit DE2. Como o projeto da ULA ser, mais
tarde, incorporado ao projeto do processador, ele ser considerado como um COMPONENTE de um projeto
maior, ilustrando a natureza hierrquica dos projetos em VHDL. Para isto, os operandos A e B viro das chaves
SW(6..0) e SW(13..7), respectivamente, e a funo F ser definida pelas chaves SW(17..14). A sada dever ser ligada
aos LEDs vermelhos LEDR(6..0) e LEDG(0). Lembre-se de importar o arquivo de atribuies do kit DE2
(AssignmentsImport Assignments e selecione DE2_pin_assignments.csv)
Para isso, siga os passos:
1. Crie um novo projeto, no mesmo diretrio, com o nome ULA_DE2, para enfatizar que esta verso
para testes no kit. Ignore o aviso de que j h um projeto no mesmo diretrio.
2. Crie um arquivo em VHDL com a mesma estrutura do projeto da ULA, exceto que nele no haver
qualquer cdigo mas simplesmente uma conexo entre portas (este um conceito conhecido como
encapsulamento). Neste novo arquivo, para suas entradas e sadas utilize os nomes dos pinos
correspondentes a chaves e LEDs como descrito acima.
3. Adicione um componente ULA arquitetura deste novo arquivo, copiando a entidade ULA e
renomeando entity para component e a sequncia end ULA para end component
4. Faa o mapeamento de portas de forma que os sinais equivalentes nos dois projetos estejam
conectados. Exemplo: ... A => SW(6 downto 0), ... No caso, A o sinal que est associado ao
operando A no projeto da ULA e SW ser a entrada do projeto ULA_DE2 conectada s chaves SW[6]
a SW[0].
5. Compile o projeto e teste-o no kit.
3.3. Atividade 3
A atividade 3 consiste em adicionar, ao cdigo da atividade 2, as seguintes funes ULA: OR, NOR, SUB e
LUI, sendo esta ltima definida como no conjunto de instrues do MIPS. Para testar seu projeto, modifique o
arquivo ULA_tb.vhd e simule-o no ModelSim.
Cdigo da atividade 1: Unidade Lgica-aritmtica (ULA)
-- @2012 - Prof. Julio C. D. de Melo - DELT/EEUFMG
-- Sistemas, Processadores e Perifricos
-- Projeto do processador uMIPS: Unidade Lgica-Aritmtica
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

-- ULA

entity ULA is
port(
A, B : in std_logic_vector (31 downto 0);
F : in std_logic_vector(3 downto 0);
Y : out std_logic_vector (31 downto 0);
Z: out std_logic
);
end ULA;

-----

Entradas A e B da ULA
Controle da ULA
Sada da ULA
flag de zero

architecture beh of ULA is


signal saida : std_logic_vector (31 downto 0);
signal AX, BX : std_logic_vector (31 downto 0);
signal FN : std_logic_vector (3 downto 0);
begin
FN <= F;
AX <= A;
BX <= B;
process (AX, BX, FN)
Prof. Julio C. D. de Melo DELT/EEUFMG - 2

Curso de Engenharia Eltrica da UFMG Sistemas, Processadores e Perifricos


begin
case FN is
when "0000"=>
saida <= AX AND BX;

-- AND lgico

when "0010" =>


-- adio
saida <= std_logic_vector (signed (AX) + signed (BX));
when "0111" =>
-- SLT
if (signed (AX) < signed (BX)) then
saida <= x"00000001";
else
saida <= x"00000000";
end if;
when others => saida <= (others => '0');
end case;

-- o que no foi definido ainda

end process;
Y <= saida;
Z <= '1' when (saida = x"00000000") else '0';

-- resultado
-- flag de zero

END beh;

Arquivo de teste da Unidade Lgica-aritmtica (ULA)


-- @2012 - Prof. Julio C. D. de Melo - DELT/EEUFMG
-- Sistemas, Processadores e Perifricos
-- Projeto do processador uMIPS: Arquivo de teste da Unidade Lgica-Aritmtica
-- Declarao de bibliotecas
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
-- Entidade principal
entity ULA_tb is
port(
saida : out std_logic_vector (31 downto 0);
flag : out std_logic
);
end ULA_tb;
architecture unica of ULA_tb is
component ULA is
port(
A, B : in std_logic_vector (31 downto 0);
F : in std_logic_vector(3 downto 0);
Y : out std_logic_vector (31 downto 0);
Z: out std_logic
);
end component;

-- Sada da ULA
-- flag de zero

-----

Entradas A e B da ULA
Controle da ULA
Sada da ULA
flag de zero

signal AX, BX : std_logic_vector (31 downto 0);


signal FN : std_logic_vector (3 downto 0);
begin
teste: ULA
port map (
A => AX,
B => BX,
F => FN,
Y => saida,
Z => flag
);
process
begin
wait for 1 ns;
AX <= X"00000001";
BX <= X"00000001";
FN <= "0010";
wait;
end process;
end unica;

-- A = 1
-- B = 1
-- F = adio => sada = 2 e flag = 0

Prof. Julio C. D. de Melo DELT/EEUFMG - 3

También podría gustarte