Uma CPU de 8 bits descrita em VHDL, aplicando os conceitos de máquina de estados abordados em Sistemas Digitais. Projeto final de Prática em Sistemas Digitais.
demos: programas em assembly (.s) demonstrando o funcionamento da CPU, além de casos de teste (entradas,.in) para cada programa para realizar testes usando a testbenchtests/sim.vhdl.rtl: código VHDL descrevendo a CPU e componentes auxiliares.tools: ferramentas para facilitar o desenvolvimento e teste da CPU.tests: testbenches.
O projeto em si e utilitários auxiliares podem ser compilados, executados e testados no Windows ou no GNU/Linux.
- Python 3.10+ (para rodar o assembler,
as.py, e oobjdump.py) - GNU make (para rodar os comandos de compilação e testbenches automaticamente)
- Um compilador C que suporte C99 (para compilar o simulador da CPU)
- MinGW (para compilar o simulador para Windows no GNU/Linux)
Você já deve saber como instalar essas dependências no GNU/Linux. No Windows, para
não perder tempo, você pode usar o script bootstrap.bat disponibilizado nesse
repositório para instalar o GNU make do ezwinports e o Python do projeto cosmos
(cosmopolitan libc).
Note
No Windows, o Python instalado em C:\windows\py.exe será usado, se existir.
Certifique-se de que a versão do Python usada é 3.10 ou superior. Se necessário,
especifique o caminho para o executável do intepretador Python manualmente usando
a variável PYTHON ou use o script bootstrap.bat.
Um executável do simulador para Windows é disponibilizado como um release no GitHub. Para baixá-lo:
make -C tools/sim sim.exeCaso queira compilar o simulador para Windows no GNU/Linux, use o mesmo comando acima. Caso queira compilar o simulador para Windows no Windows, rode o comando de compilação manualmente.
Para compilar o simulador no GNU/Linux, use:
make -C tools/sim simAs seguintes variáveis podem ser passadas como argumento ao executar o comando make:
ENV: (obrigatório) determina o ambiente usado para compilação/síntese/teste. Possíveis valores:ghdl,nvc,modelsim,quartusWORK: local onde os arquivos da bibliotecaworkserão salvos. Padrão:work/$(ENV)(não é usado quandoENV=quartus)TOPLEVEL: entidade de design top-levelTEST_SIM_ABORT_ON_ERROR: se for especificada, caso algum teste usando a harnesstests/sim.vhdlfalhe, os demais testes não serão executados.- ... (específicas a cada ambiente)
Os seguintes alvos podem ser executados:
all: (padrão) realiza a compilação/síntese no ambiente especificado.run: roda a simulação ou, no ambientequartus, programa a placa FPGA (assumindo que há apenas uma placa conectada).test: roda os testbenches disponibilizados emtests/. Obviamente, apenas os ambientes de simulação são suportados.clean: remove os artefatos de compilação/síntese/teste.defaults: imprime os valores de algumas variáveis que podem ser úteis.
Alguns alvos adicionais, que se referem diretamente a arquivos, podem ser usados:
-
%.bin: usa o assembler para gerar um arquivo.bine um arquivo.mifa partir do arquivo que possui o mesmo prefixo do alvo, porém com a extensão.s.
Exemplo:make demos/add.binirá montar o arquivodemos/add.s, gerandodemos/add.binedemos/add.mif. -
%.mif: idem. -
%.ok: roda apenas o teste da testbenchtests/sim.vhdlcorrespondente ao arquivo com o mesmo prefixo do alvo, porém com a extensão.in.
Exemplo:make demos/add.dir/0.okirá rodar o teste que consiste em rodar o simulador C com a memória inicializada pordemos/add.bin, entradas dadas emdemos/add.dir/0.in, salvar as saídas emdemos/add.dir/0.oute salvar um dump do estado do simulador emdemos/add.dir/0.sim.dump, e então rodar o testbenchtests/sim.vhdlcom as mesmas entradas e, por fim, comparar as saídas e o dump do estado (registradores e memória).
Por exemplo, make ENV=nvc TEST_SIM_ABORT_ON_ERROR=1 test irá preparar todos os arquivos
necessários e rodar os casos de teste que ainda não foram rodados ou que não passaram na
última vez que foram rodados, usando o simulador de VHDL nvc e abortando a execução caso
algum caso de teste da testbench tests/sim.vhdl falhe.
Important
Devido à forma que os makefiles são estruturados, é necessário passar a variável ENV
ao rodar qualquer comando, mesmo aqueles que não tenham relação alguma com VHDL. Para
esses comandos, qualquer valor dentre os valores permitidos pode ser usado. O valor
common também pode ser usado nesses casos, se você preferir.
O projeto foi desenvolvido e testado na placa FPGA DE0-CV, portanto as atribuições de
pinos no arquivo .qsf do projeto já estão configuradas para uso com essa placa. O sinal
de reset da CPU corresponde ao botão KEY4/RESET_N/DEV_CLRN. O sinal int corresponde ao
botão KEY0. Os slide switches correspondem ao valor de entrada, sendo SW0 o LSB e SW7 o
MSB; os LEDs correspondem ao valor de saída, sendo LEDR0 o LSB e LEDR7 o MSB. Além disso,
as entradas e saídas também são exibidas nos displays de sete segmentos: HEX1 e HEX0
exibem o valor de saída, enquanto HEX3 e HEX2 exibem o valor de entrada.
Normalmente (para os outros projetos nesse repositório) basta rodar make ENV=quartus run
para realizar a síntese e programar a placa FPGA, usando o Quartus. No entanto, para esse
projeto, há a possibilidade de escolha entre vários arquivos .mif para inicializar a
memória. Essa escolha pode (e deve) ser feita usando a variável MIF_FILE. Por exemplo:
make ENV=quartus MIF_FILE=demos/fibonacci.mif runDesde que haja um arquivo .s correspondente, o comando acima irá montar esse arquivo e
gerar o arquivo .mif, caso ainda não exista ou esteja desatualizado, para então proceder
com a síntese e a programação da placa FPGA.
Note
O makefile irá copiar o arquivo .mif especificado para um outro arquivo com nome
current.mif, e irá criar um arquivo current.mif.d. Caso você ainda prefira compilar
o projeto e programar a placa FPGA manualmente, pela interface gráfica do Quartus, basta
criar o arquivo current.mif (o arquivo current.mif.d é usado internamente no
makefile apenas para rastreamento de dependências).
Uma vez que a variável MIF_FILE foi especificada, pode ser omitida em execuções
subsequentes do make run para usar o mesmo arquivo .mif.
Como já mencionado na seção sobre alvos de compilação,
arquivos em assembly (.s) podem ser compilados usando o comando make ENV=common file.bin
(supondo que exista um arquivo assembly file.s). Também é possível invocar o assembler
manualmente rodando o programa ./tools/binutils/as.py com algum interpretador Python.
Para ler sobre a sintaxe suportada no assembly, clique aqui.
Para uma explicação mais detalhada do funcionamento, detalhes da implementação da CPU e instruções implementadas, confira o relatório.
Para que seja possível usar os makefiles para compilar o projeto, é necessário
que os programas de cada ambiente estejam disponíveis no caminho de busca
(variável de ambiente PATH). Essas ferramentas são:
ghdl:ghdl/ghdl-gcc/ghdl-llvm/ghdl-mcodenvc:nvcmodelsim:vcom,vsim,vlibquartus:quartus_sh,quartus_pgm
Note
No Windows, esses programas terão a extensão .exe.
Os makefiles foram feitos para funcionar nos PCs do lab 6-305/6, usando o local
de instalação padrão do Quartus e do Modelsim. Em outros contextos, pode ser
necessário atribuir a variável de ambiente PATH manualmente.
No Windows, cmd:
set PATH=%PATH%;...
No Windows, powershell:
$env:Path += ';...'No GNU/Linux, bash/sh:
PATH=$PATH:...Caso queira compilar, simular e executar os testbenches do projeto (em especial
a unidade de testbench tests/sim.vhdl) usando o GHDL, será necessário usar o
GHDL 4, com a backend mcode, uma vez que versões anteriores e outras backends
não suportam o uso de "external names", podendo abortar com mensagens de erro,
como dereferência de ponteiro NULL.