top of page

Duty Box

Jukebox em FPGA

A Duty Box funciona como uma jukebox tradicional, permitindo que o usuário escolha uma música para ouvir a partir de uma lista pré-determinada. A característica mais marcante deste projeto é que ele roda com um processador personalizado, implementado em uma FPGA.

O nome do projeto é um trocadilho com o nome da jukebox e os sinais de PWM (caracterizados por ciclos de trabalho, ou "duty cycles", em inglês) que são enviados para o alto-falante deste dispositivo.

Duração

Novembro/2023 - Dezembro/2023

Equipe

2

Tecnologias

FPGA, Verilog, Xylinx Vivado, ESP32, 3D CAD

Descrição Técnica

O processador que executa as funcionalidades da Duty Box foi escrito inteiramente em Verilog básico, no nível de portas lógicas; apenas módulso externos ao processador utilizaram Verilog sequencial. Esse processador utilizou uma arquitetura RISC e uma pipeline de 5 estágios, executando todas as instruções principais da linguagem Assembly MIPS. Ele também era capaz de executar instruções personalizadas voltadas para fins de E/S no design integrado. Todo o produto em Verilog foi implementado em uma FPGA com o programa Xylinx Vivado.

Devido a limites na memória da FPGA, um microcontrolador ESP32 Feather com um leitor de cartões SD embutido foi usado para armazenar o áudio das canções. Esse dispositivo se comunicava com a FPGA usando UART, junto com alguns pinos de E/S para facilitar a sincronização de todos os componentes.

As amostras de áudio eram transferidas para um buffer circular na a medida que eram requisitadas pelo processador. Essas amostras eram retiradas do buffer uma por vez e reajustadas para o intervalo [0,100], de forma a serem interpretadas como um ciclo de trabalho. Esse sinal PWM era transmitido para o alto-falante, que já possuía um amplificador embutido.

A caixa física foi feita de madeira compensada cortada e gravada a laser na frente, um arco de papelão no topo e nas laterais, e uma peça customizada de PLA impressa em 3D para conectar as demais. Essa estrutura garantia que todas as placas eletrônicas e fios estivessem seguros.

Minhas Contribuições

Além de desenvolver e testar o processador, um dos meus papéis principais nesse projeto foi escrever o código Assembly que seria executado no processador. Isso incluiu a criação de funções que cautelosamente seguiam as convenções da linguagem, e a integração da lógica interna com inputs externos. Com isso, eu pude incluir funções adicionais como a opção de pausar ou pular canções, e até mesmo um "Easter Egg", ativado quando certos botões eram pressionados simultaneamente.

Além disso, eu lidei com a maior parte do processamento e da transmissão do áudio. Eu experimentei com diferentes configurações de amostração (avaliando os custos e benefícios entre o atraso na transmissão e a qualidade do áudio), escrevi o código para o buffer circular em Verilog, e usei essa lógica para escrever o código no microcontrolador que era responsável por enviar as amostras de áudio via UART.

Demonstração em Vídeo

Apresentação das funcionalidades da Duty Box!

Galeria de Fotos

bottom of page