alu - arithmetical and logical unit
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](https://reader031.vdocuments.net/reader031/viewer/2022020417/563dbbb7550346aa9aafa5cc/html5/thumbnails/1.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020417/563dbbb7550346aa9aafa5cc/html5/thumbnails/2.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020417/563dbbb7550346aa9aafa5cc/html5/thumbnails/3.jpg)
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;