alu - arithmetical and logical unit

3
Laboratório de Sistemas, Processadores e Periféricos Projeto da Unidade Lógica-Aritmética Prof. Julio C. D. de Melo DELT/EEUFMG 1. Introdução A Unidade Lógica-Aritmética (ULA) de um processador é o módulo responsável pela realização de todas as operações lógicas e aritméticas definidas pelo seu conjunto de instruções. Entre as operações lógicas estão AND, OR, XOR e NOT, além daquelas relativas ao deslocamento à esquerda ou à direita do conteúdo de um registrador. As três primeiras são binárias (operam sobre dois registradores) e as de deslocamento e o NOT são unárias (operam sobre um único registrador). Entre as operações aritméticas, a adição e a subtração estão presentes em todos os processadores, sendo as operações de multiplicação e divisão restritas aos processadores de maior desempenho. Outras operações incluem a comparação, realizada através da subtração sem atualização de registradores mas refletindo o resultado nos sinalizadores. O resultado de uma operação na ULA é tipicamente armazenado num registrador mas pode ser descartado se o que se deseja é apenas sinalizar a condição resultante da operação tal como, por exemplo, se a adição de dois números produz um resultado positivo, negativo ou nulo. A condição é armazenada em sinalizadores ( flags), que refletem condições tais como: zero: o resultado da operação 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 máximo (positivo ou negativo) para números 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 número de 1’s no resultado é par ou não Na arquitetura MIPS, como explicado no livro-texto, decidiu-se implementar apenas um sinalizador, o de zero, sendo os outros derivados dele em função da realização de outras operações entre os operandos. 2. Objetivos O objetivo desta aula prática é a implementação, simulação e teste de uma ULA que implemente as seguintes operações lógicas e aritméticas: AND, OR, NOR: AND, OR e NOR lógicos, entre dois operandos de 32 bits ADD: adição de dois operandos de 32 bits no formato complemento-de-2 SUB: subtração de dois operandos de 32 bits no formato complemento-de-2 SLT: comparação entre dois operandos de 32 bits no formato complemento-de-2 O projeto lógico deverá ser definido através da linguagem VHDL, já estudada nas disciplinas de sistemas digitais. No site da disciplina, há várias referências sobre a linguagem. Após a entrada do projeto lógico, ele deverá ser compilado e simulado, para verificação do seu correto funcionamento. 3. Parte Experimental A parte experimental consiste em testar o projeto de uma ULA que suporte um subconjunto das instruções definidas para o processador MIPS. Para isto, conforme descrito no capítulo 4 do livro-texto (figura 4.12), serão implementadas as funções dadas na tabela abaixo e que farão 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 através de sua simulação. Para isto, proceda como descrito a seguir:

Upload: olwenntaron

Post on 12-Jan-2016

6 views

Category:

Documents


1 download

DESCRIPTION

Instructions on how to project a simple ALU for a custom uMips architecture microprocessor. In Brazillian Portuguese. Undergraduate level.

TRANSCRIPT

Page 1: ALU - Arithmetical and Logical Unit

Laboratório de Sistemas, Processadores e Periféricos

Projeto da Unidade Lógica-Aritmética

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

1. Introdução A Unidade Lógica-Aritmética (ULA) de um processador é o módulo responsável pela realização de todas as

operações lógicas e aritméticas definidas pelo seu conjunto de instruções. Entre as operações lógicas estão AND, OR, XOR e NOT, além daquelas relativas ao deslocamento à esquerda ou à direita do conteúdo de um registrador. As três primeiras são binárias (operam sobre dois registradores) e as de deslocamento e o NOT são unárias (operam sobre um único registrador). Entre as operações aritméticas, a adição e a subtração estão presentes em todos os processadores, sendo as operações de multiplicação e divisão restritas aos processadores de maior desempenho. Outras operações incluem a comparação, realizada através da subtração sem atualização de registradores mas refletindo o resultado nos sinalizadores.

O resultado de uma operação na ULA é tipicamente armazenado num registrador mas pode ser descartado se o que se deseja é apenas sinalizar a condição resultante da operação tal como, por exemplo, se a adição de dois números produz um resultado positivo, negativo ou nulo. A condição é armazenada em sinalizadores (flags), que refletem condições tais como:

zero: o resultado da operação 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 máximo (positivo ou negativo) para números 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 número de 1’s no resultado é par ou não

Na arquitetura MIPS, como explicado no livro-texto, decidiu-se implementar apenas um sinalizador, o de zero, sendo os outros derivados dele em função da realização de outras operações entre os operandos.

2. Objetivos O objetivo desta aula prática é a implementação, simulação e teste de uma ULA que implemente as seguintes

operações lógicas e aritméticas:

AND, OR, NOR: AND, OR e NOR lógicos, entre dois operandos de 32 bits

ADD: adição de dois operandos de 32 bits no formato complemento-de-2

SUB: subtração de dois operandos de 32 bits no formato complemento-de-2

SLT: comparação entre dois operandos de 32 bits no formato complemento-de-2

O projeto lógico deverá ser definido através da linguagem VHDL, já estudada nas disciplinas de sistemas digitais. No site da disciplina, há várias referências sobre a linguagem. Após a entrada do projeto lógico, ele deverá ser compilado e simulado, para verificação do seu correto funcionamento.

3. Parte Experimental A parte experimental consiste em testar o projeto de uma ULA que suporte um subconjunto das instruções

definidas para o processador MIPS. Para isto, conforme descrito no capítulo 4 do livro-texto (figura 4.12), serão implementadas as funções dadas na tabela abaixo e que farão 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 através de sua simulação. Para isto,

proceda como descrito a seguir:

Page 2: ALU - Arithmetical and Logical Unit

Curso de Engenharia Elétrica da UFMG – Sistemas, Processadores e Periféricos

Prof. Julio C. D. de Melo – DELT/EEUFMG - 2

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

2. Selecione o seu diretório de trabalho e entre com o nome “ULA”. Selecione o arquivo com o nome “ULA.vhd”, clique em Add e em Next.

3. Selecione a família Cyclone II e o dispositivo do kit DE2 (EP2C35672C6N) e clique em Next e Finish.

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

5. Simule o projeto no ModelSim utilizando o arquivo “ULA_tb.vhd”, que realiza a operação 1+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 função 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 hierárquica dos projetos em VHDL. Para isto, os operandos A e B virão das chaves SW(6..0) e SW(13..7), respectivamente, e a função F será definida pelas chaves SW(17..14). A saída deverá ser ligada aos LEDs vermelhos LEDR(6..0) e LEDG(0). Lembre-se de importar o arquivo de atribuições do kit DE2

(AssignmentsImport Assignments e selecione “DE2_pin_assignments.csv”)

Para isso, siga os passos: 1. Crie um novo projeto, no mesmo diretório, com o nome ULA_DE2, para enfatizar que esta versão é

para testes no kit. Ignore o aviso de que já há um projeto no mesmo diretório.

2. Crie um arquivo em VHDL com a mesma estrutura do projeto da ULA, exceto que nele não haverá qualquer código mas simplesmente uma conexão entre portas (este é um conceito conhecido como encapsulamento). Neste novo arquivo, para suas entradas e saídas 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 sequência “end ULA” para “end component”

4. Faça 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 código da atividade 2, as seguintes funções à ULA: OR, NOR, SUB e

LUI, sendo esta última definida como no conjunto de instruções do MIPS. Para testar seu projeto, modifique o arquivo ULA_tb.vhd e simule-o no ModelSim.

Código da atividade 1: Unidade Lógica-aritmética (ULA)

-- @2012 - Prof. Julio C. D. de Melo - DELT/EEUFMG

-- Sistemas, Processadores e Periféricos

-- Projeto do processador uMIPS: Unidade Lógica-Aritmética

library ieee; -- ULA

use ieee.std_logic_1164.all;

use ieee.numeric_std.all;

entity ULA is

port(

A, B : in std_logic_vector (31 downto 0); -- Entradas A e B da ULA

F : in std_logic_vector(3 downto 0); -- Controle da ULA

Y : out std_logic_vector (31 downto 0); -- Saída da ULA

Z: out std_logic -- flag de zero

);

end ULA;

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)

Page 3: ALU - Arithmetical and Logical Unit

Curso de Engenharia Elétrica da UFMG – Sistemas, Processadores e Periféricos

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

begin

case FN is

when "0000"=> -- AND lógico

saida <= AX AND BX;

when "0010" => -- adição

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'); -- o que não foi definido ainda

end case;

end process;

Y <= saida; -- resultado

Z <= '1' when (saida = x"00000000") else '0'; -- flag de zero

END beh;

Arquivo de teste da Unidade Lógica-aritmética (ULA)

-- @2012 - Prof. Julio C. D. de Melo - DELT/EEUFMG

-- Sistemas, Processadores e Periféricos

-- Projeto do processador uMIPS: Arquivo de teste da Unidade Lógica-Aritmética

-- Declaração 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); -- Saída da ULA

flag : out std_logic -- flag de zero

);

end ULA_tb;

architecture unica of ULA_tb is

component ULA is

port(

A, B : in std_logic_vector (31 downto 0); -- Entradas A e B da ULA

F : in std_logic_vector(3 downto 0); -- Controle da ULA

Y : out std_logic_vector (31 downto 0); -- Saída da ULA

Z: out std_logic -- flag de zero

);

end component;

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"; -- A = 1

BX <= X"00000001"; -- B = 1

FN <= "0010"; -- F = adição => saída = 2 e flag = 0

wait;

end process;

end unica;