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.exe
Caso 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 sim
As 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
,quartus
WORK
: local onde os arquivos da bibliotecawork
serã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.vhdl
falhe, 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.bin
e um arquivo.mif
a partir do arquivo que possui o mesmo prefixo do alvo, porém com a extensão.s
.
Exemplo:make demos/add.bin
irá montar o arquivodemos/add.s
, gerandodemos/add.bin
edemos/add.mif
. -
%.mif
: idem. -
%.ok
: roda apenas o teste da testbenchtests/sim.vhdl
correspondente ao arquivo com o mesmo prefixo do alvo, porém com a extensão.in
.
Exemplo:make demos/add.dir/0.ok
irá 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.out
e salvar um dump do estado do simulador emdemos/add.dir/0.sim.dump
, e então rodar o testbenchtests/sim.vhdl
com 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 run
Desde 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-mcode
nvc
:nvc
modelsim
:vcom
,vsim
,vlib
quartus
: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
.