Laboratório: Unidade Lógica e Aritmética

Laboratório: Unidade Lógica e Aritmética

Este laboratório propõe o desenvolvimento de uma unidade lógica e aritmética. O objetivo principal é projetar uma Unidade Lógica e Aritmética funcional e avaliar o seu funcionamento. Esse objetivo envolve o projeto de circuitos combinacionais para avaliação de operadores lógicos e aritméticos, bem como o projeto de circuitos decodificadores para comunicação com os periféricos da placa DE1-SoC.

Ver histórico de mudanças

Changelog

Versão Data Descrição
v2025.1 06/mar/2025 Versão inicial
v2025.1 12/mar/2025 Corrigidas inconsistências nas atribuições de sinais
v2025.2 31/mar/2025 Removidas unidades bin2dec e bin2hex
v2025.3 12/abr/2025 Removidas últimas referências às unidades bin2dec e bin2hex

Disciplina

Este laboratório faz parte da disciplina MC613 - Laboratório de Circuitos Digitais. Ver oferecimento mais recente.

Entrega

  • A entrega deverá estar em único arquivo .ZIP contendo todos e apenas os arquivos listados abaixo.
  • O nome do arquivo ZIP deve ser RA<RA>.zip, onde <RA> é o RA do componente do grupo que fará a entrega. Por exemplo, RA123456.zip é a entrega do grupo do aluno com o RA 123456.
  • Os nomes dos arquivos dentro do ZIP devem ser seguidos.
  • Se mais do que um arquivo for recebido para a mesma entrega, apenas o último recebido dentro do prazo será considerado.
  • O cumprimento ou não dessas instruções fará parte dos critérios de avaliação.

Arquivos que fazem parte da entrega:

  • alu.pdf: Diagrama de blocos para a entidade da ALU.
  • alu.vhd: Descrição em VHDL da entidade da ALU.
  • alu_tb.vhd: Testbench da entidade da ALU.
  • two_comp_to_7seg.vhd: Descrição em VHDL da entidade do decodificador para complemento de dois.
  • alu_board.vhd: Descrição em VHDL da entidade de interface de comunicação entre a ALU e as conexões na placa DE1-SoC.
  • *.vhd: Descrição em VHDL de quaisquer módulos auxiliares pra construção da ALU e da ALU Board.

Link para entrega: https://ic.unicamp.br/~isaias/mc613/entrega.

ALU - Unidade Lógica e Aritmética

Uma Unidade Lógica e Aritmética é um módulo capaz de realizar um conjunto de funções aritméticas e lógicas orientado pelos sinais de controle que recebe. Para isso, a ALU tem vetores de entrada e saída de dados, uma entrada que indica a operação a ser executada, e uma série de saídas denominadas flags que indicam determinadas condições da execução da operação ou do valor da saída. Neste laboratório, a tarefa é descrever em VHDL uma ALU compatível com um processador simples.

As entradas e saídas são:

Nome Largura Descrição
Entradas
A 32 bits Primeiro operando, representado como um inteiro em complemento de dois para as operações aritméticas.
B 32 bits Segundo operando, representado como um inteiro em complemento de dois para as operações aritméticas.
ALUCtl 2 bits Operação a ser executada.
Saídas
R 32 bits Resultado da operação, representado como um inteiro em complemento de dois para as operações aritméticas.
Zero 1 bit 1 se o resultado da operação for zero, 0 em caso contrário.
Overflow 1 bit 1 se a execução de uma operação aritmética resultar em overflow, 0 em caso contrário.
Cout 1 bit 1 se a execução de uma operação aritméticas apresentar carry-out, 0 em caso contrário.

As funções lógicas e aritméticas que a ALU executa, conforme o sinal de entrada ALUCtl, e os respectivos valores da saída R são:

ALUCtl Função Valor de R
00 AND R = A and B
10 OR R = A or B
01 Soma R = A + B
11 Subtração R = A - B

Atividades do laboratório

Parte I - Desenvolvimento da ALU

Crie em VHDL uma entidade chamada ALU que descreva o hardware especificado no enunciado acima. Salve o código da entidade ALU em um arquivo alu.vhd. Sua entidade deverá ter as entradas e saídas mencionadas, sem adicionar ou remover nenhum sinal, utilizando exatamente os nomes informados. Entradas ou saídas de um único bit deverão ser do tipo std_logic, e entradas ou saídas de múltiplos bits do tipo std_logic_vector.

Você pode utilizar os métodos que julgar mais conveniente para representar cada uma das operações dentro da ALU, desde que todo o código seja legítimo e de sua autoria, utilizando-se apenas de bibliotecas e pacotes disponíveis no software por padrão. Caso decida utilizar instanciar módulos auxiliares dentro da ALU, crie cada módulo como uma entidade separada e salve em um arquivo com o nome da entidade. Caso decida utilizar pacotes auxiliares, crie o pacote em um arquivo separado e salve com o nome do pacote.

Desenhe um diagrama de blocos em alto nível da entidade alu e salve em um novo arquivo alu.pdf.

Parte II - Teste por Simulação

Desenvolva uma simulação para testar o funcionamento da ALU. A simulação deve ser um testbench, descrito em uma entidade VHDL ALU_tb, que inclua casos de teste para todas as operações necessárias, e casos de teste que ativem ou desativem cada uma das flags de saída. Salve a entidade de teste no arquivo alu_tb.vhd.

Parte II - Teste na placa DE1-SoC

Desenvolva uma interface de comunicação entre a sua ALU e as conexões na placa DE1-SoC. A interface deve permitir controlar os valores do sinal de entrada ALUCtl e, pelo menos, de parte dos sinais A e B através de dispositivos de entrada da placa, e mostrar os valores dos sinais de saída (R pode ser mostrado só em parte). Salve sua entidade de interface como alu_board.vhd.

Implemente um decodificador para mostrar nos visores de 7 segmentos entradas de 4 bits em complemento de 2. Utilize o arquivo two_comp_to_7seg.vhd, em que a entrada bin(3..0) é o número a ser representado, a saída segs(6..0) são os segmentos de g a a (segs(0)=a, segs(6)=g) do visor e a saída neg é 1 quando o número for negativo e 0 em caso contrário. Você pode se basear no modelo abaixo.

entity two_comp_to_7seg is
	port (
		bin : in std_logic_vector(3 downto 0);
		segs : out std_logic_vector(6 downto 0);
		neg : out std_logic
	);
end two_comp_to_7seg;

Utilize os switches SW[9..8] para ALUCtl, SW[7..4] para A e SW[3..0] para B. Utilize extensão de sinal para completar os valores de A e B. Mostre as flags nos LEDs LEDR[2..0] e o resultado R em hexadecimal nos visores de sete segmentos utilizando as entidades desenvolvidas anteriormente, sendo HEX4[6..0] para A, HEX2[6..0] para B e HEX0[6..0] para R, e com o segmento g do visor logo à esquerda (HEX5, HEX3 e HEX1, respectivamente) represente o sinal negativo, quando necessário.