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.