CPU Zilog Z80 - clone em silício moderno, gratuito e de código aberto
(github.com/rejunity)- Depois que a Zilog anunciou o End-of-Life do Z80 em 15 de abril de 2024, este projeto passou a mirar uma implementação Free and Open Source Silicon(FOSSi) para substituir o Z80
- O objetivo é desenvolver um substituto drop-in compatível em pinos para uso em computadores de 8 bits e kits DIY como ZX Spectrum e RC2014
- A implementação é baseada no núcleo TV80 em Verilog de Guy Hutchison e é sintetizada em silício real usando OpenROAD e PDKs abertos como SKY130, SG13 e GF180
- Em 2025, os dois primeiros chips tapeout foram entregues, o primeiro silício SKY130 do Tiny Tapeout 7 está em estado FUNCTIONAL, e a versão QFN64 com 40 pinos expostos também está em teste após a entrega
- Nos testes, o Z80 se comunica usando RP2040/RP2350 como se fosse RAM, o bug da instrução DAA foi corrigido, mas dois testes de flags não documentadas do ZEXALL ainda falham
Objetivo do projeto e estado atual
- rejunity/z80-open-silicon é um projeto para criar um clone em silício moderno, gratuito e de código aberto do Zilog Z80
- A Zilog anunciou o End-of-Life do Z80 em 15 de abril de 2024
- O projeto tem como meta oferecer um substituto FOSSi do Z80 para a comunidade de preservação de hardware e de código aberto
- Em 2025, os dois primeiros chips tapeout foram entregues, os chips estão em estado funcional e seguem em teste
- Atualmente, uma versão DIP40 para GF180MCU está em desenvolvimento
Como o silício é implementado
- O hardware-alvo é um chip que funcione como substituto drop-in do Z80 em computadores domésticos de 8 bits e kits de computador DIY mais recentes
- Os exemplos citados são ZX Spectrum e RC2014
- A implementação sintetiza silício fabricável usando o fluxo do OpenROAD e PDKs de código aberto
- A infraestrutura do Tiny Tapeout é usada para agrupar vários projetos e reduzir o custo de fabricação de chips reais na Skywater Foundries
- O núcleo de CPU usado como base é o núcleo TV80 em Verilog de Guy Hutchison, disponível em TV80
PDKs suportados e tapeouts
- Há suporte para 3 PDKs abertos
- Estado do andamento dos tapeouts
- FUNCTIONAL: primeiro tapeout em silício SKY130 de 130nm via Tiny Tapeout 7
- DELIVERED/TESTING: encapsulamento QFN64 com todos os 40 pinos expostos via shuttle CI2406 da eFabless, em processo SKY130 de 130nm
- A versão multiplexada SG13g2 de 24 pinos tem uma entrada no shuttle experimental IHP 2024, e a versão do shuttle IHP 2025a já foi entregue
- WIP: formato clássico DIP40 baseado em COB via GF180MCU Run 1 da Wafer.Space
O primeiro silício FOSSi do Z80
- A primeira iteração foi desenvolvida com a infraestrutura do Tiny Tapeout em processo de 130nm, cabendo em uma área de die de 0,064mm²
- O primeiro tapeout foi submetido ao eFabless ChipIgnite CI2406 Shuttle em junho de 2024
- O layout de circuito integrado em GDSII é resultado do fluxo automatizado de posicionamento e roteamento do OpenROAD, usando elementos de lógica de portas de 130nm
Testes e trabalho restante
- Plano já concluído
- Tapeout da revisão de 24 pinos no nó de 130nm via Tiny Tapeout 07
- Tapeout em QFN64 com todos os 40 pinos expostos via eFabless ChipIgnite
- Tapeouts em SKY130 e SG13 concluídos, GF180 em andamento
- Execução de testes do chip
- Resumo dos testes
- O Z80 se comunica usando RP2040/RP2350 como se fosse RAM
- O bug da instrução DAA identificado pela suíte de testes ZEXDOC/ZEXALL foi corrigido
- Dois testes do ZEXALL relacionados a flags não documentadas ainda falham
- Trabalho em andamento ou restante
- Produção de um adaptador PCB para converter de QFN64 para DIP40
- Produção de uma PCB COB DIP40
- Testes de temporização dos sinais de entrada e saída comparados com o Z80 original
- Reforço do testbench para cobrir todas as instruções do Z80 e também instruções
illegal - Comparação com outras implementações, como o núcleo em Verilog A-Z80 e o Z80Explorer baseado em netlist
- Criação de um layout em nível de portas com aparência semelhante ao layout do Z80 original
- Encapsulamento cerâmico DIP40 e logo/chip art do projeto
Código e execução local
- São fornecidos um slide deck com visão geral do projeto e um vídeo de discussão com Matthew Venn
- Principais locais do código
- src/tt_um_rejunity_z80.v: módulo de topo, segue as restrições do Tiny Tapeout e multiplexa os pinos de saída nos 8 pinos do chip Tiny Tapeout
- src/tv80: implementação principal do Z80 em Verilog
- src/config.tcl: configuração de síntese, posicionamento e roteamento do OpenROAD
- src/test/test.py: testbench
- Os artefatos de layout gerados ficam na pasta
gdse podem ser inspecionados com KLayout- Arquivo GDSII do núcleo Z80
- Arquivo OASIS do chip Tiny Tapeout 07
- Para testar localmente, siga o guia de testes do Tiny Tapeout, instale
iverilog,verilator,cocotbepytest, e executemakeemsrc
Dispositivos Z80 considerados para teste
- Computadores e consoles clássicos são listados como casos de teste para um substituto de hardware do Z80
- ZX Spectrum 48K: Z80 de 3,5MHz
- ZX Spectrum 128K: Z80 de 3,54690MHz
- Amstrad CPC: Z80 de 4MHz
- Família MSX: 3,579MHz
- SG-1000, Sega Master System, ColecoVision, TRS-80, Sinclair ZX80/ZX81 etc.
- Kits de computador DIY mais recentes também são citados como casos de teste
- RC2014 modular computer: 8K ROM, 32K RAM, 7,3728MHz
- Zeal 8-bit Computer: 32K ROM, 128KB~512KB RAM, 10MHz
- LiNC80 microcomputer kit: 16K/64K ROM, 64K RAM, 7,3728MHz
Coleção de materiais de referência
- Documentação relacionada ao Z80
- Z80 Datasheet
- Manual do Usuário da Zilog, Manual do Usuário da Mostek, Data Book da Zilog
- Instruções não documentadas, tabela de opcodes e documentação de temporização
- História e patentes do Z80
- Material de painel de história oral do desenvolvimento do Z80
- Material de projeto de microprocessadores de M. Shima
- Patentes expiradas relacionadas ao Z80, como proteção contra picos de tensão de entrada e circuito de reset
- Dieshots e materiais de engenharia reversa
- Dieshots do Zilog Z8400, Z84C00, SGB-CPU 01 do Nintendo Super Game Boy, Mostek MK3880 e outros
- Materiais de engenharia reversa sobre registradores de instruções do Z80, bus gates, PLA, implementação de registradores, ALU de 4 bits e mais
- Implementações existentes
- Implementação TV80 em Verilog
- A-Z80
- Z80Explorer
- Emulador online de netlist do Z80 da Visual6502.org
1 comentários
Comentários do Hacker News
O que a Tiny Tapeout faz é incrível. Quem imaginaria que makers e estudantes poderiam transformar seus próprios projetos de chip em algo real com tão pouco dinheiro?
As ferramentas também parecem excelentes. Você não vai projetar o próximo CPU da Intel em um processo de 130 nm, mas é impressionante que um Z80 caiba em 0,064 mm²
Também é bom que ainda exista uma alternativa agora que o chip oficial não é mais produzido. Agora fiquei com vontade de ter aquele lindo encapsulamento cerâmico roxo com tampa banhada a ouro em cima do chip
https://twitter.com/l_vanek/status/1783557817133039738/photo...
https://tinytapeout.com/
Tiles adicionais custam US$ 50 cada, e pinos analógicos extras começam em US$ 40 por pino. Se eu não errei feio, 160 x 100 µm dá 0,16 x 0,1 mm, então um tile tem 0,016 mm², e um die de 0,064 mm² usaria 4 slots
Para quem estiver curioso, o 6502 e várias de suas derivadas ainda são produzidos por uma das empresas dos desenvolvedores originais. Então não parece que algo parecido vá acontecer tão cedo com o arquirrival do Z80
[0] https://www.westerndesigncenter.com/wdc/chips.php
https://hackaday.com/2024/04/19/end-of-life-for-z80-cpu-and-...
https://arstechnica.com/gadgets/2024/04/after-48-years-zilog...
https://en.wikipedia.org/wiki/Zilog_eZ80
http://www.zilog.com/docs/um0077.pdf
https://www.zilog.com/docs/ez80acclaim/ps0153.pdf
Deve haver milhões deles espalhados por aí, mas quando somem de distribuidores como Mouser ou Farnell, para quem precisa deles sobra basicamente eBay e similares, e aí vira bastante loteria
O Z80 era a CPU do ZX Spectrum. Traz muitas lembranças
https://en.wikipedia.org/wiki/ZX_Spectrum
Como eu só tinha unidade de cassete, quando havia algum erro no código normalmente era preciso apertar reset e recarregar o EDTASM e meu código da fita
0. https://forums.nesdev.org/viewtopic.php?t=18335
https://en.wikipedia.org/wiki/Coleco_Adam
Ainda tenho o livro Programming the Z80 que comprei quando era criança
https://en.wikipedia.org/wiki/Programming_the_Z80
A verdadeira graça dessas antigas CPUs de 8 bits está na simplicidade e no fato de que uma pessoa consegue montar um computador manualmente, fazendo toda a fiação
Na faculdade, construí uma placa com 8088 numa disciplina de microprocessadores, e foi uma das melhores matérias que já fiz, porque tirou muito do ar de mistério sobre drivers e hardware. Depois tentei redesenhar tudo no KiCAD, adicionando portas de expansão de E/S, um layout melhor e uma porta LCD para um LCD de caracteres 2x16
Fiz um protótipo na Futurlec, mas cometi um erro grande na definição do footprint e acabei precisando de um interposer. Depois de chegar ao ponto de soldar o 8284 e o soquete de CI, a vida atropelou tudo e o projeto continua numa caixa até hoje
Microcontroladores são ótimos porque colocam tudo num único encapsulamento, mas existe uma satisfação enorme em poder projetar e construir um computador com as próprias mãos. FPGA recupera um pouco dessa sensação, mas o ecossistema de ferramentas é bizantino de tão horrível
[1] https://theopenroadproject.org/
Fui ver e me surpreendi ao descobrir que o Z80 já é uma CPU de 50 anos
O layout do circuito chamou atenção porque parece mais um arranjo uniforme de portas lógicas do que o layout sob medida que normalmente se vê em fotos do die
Por exemplo, o “payload da instrução” de LD A,(DE) está aqui
https://github.com/rejunity/z80-open-silicon/blob/974c7711b2...
E a parte correspondente no meu emulador em software, que implementa o mesmo ciclo de máquina, está aqui
https://github.com/floooh/chips/blob/bd1ecff58337574bb46eba5...
Nos dois casos, o barramento de endereços é configurado com o conteúdo do registrador DE e, ao mesmo tempo, os pinos MREQ|RD precisam ser acionados em algum lugar para sinalizar externamente uma leitura de memória. No meu emulador, isso acontece na macro _mread, e no ciclo de clock seguinte o barramento de dados é lido para o registrador A
O interessante é que a implementação em Verilog aparentemente não atualiza o registrador interno WZ para DE+1. Então fico curioso se o comportamento não documentado foi implementado com precisão, embora a atualização de WZ possa estar sendo tratada em outro lugar
No fim, se por fora ele parecer e se comportar como um Z80, ou seja, se os pinos corretos forem ativados no momento certo, a implementação interna não importa
Fico curioso sobre o nível de compatibilidade com o Z80 original. O original tinha várias instruções não documentadas e também aquele infame “trap gate”, que pode ter afetado certas sequências raras de instruções
Vendo o “Oral History Panel on the Founding of the Company and the Development of the Z80 Microprocessor” linkado na página, é possível que o projeto tenha sido pensado para distinguir o original dos clones
Parece muito legal. Eu estava na equipe inicial da efabless.com, no lado de EDA open source
Já ouvi falar da ALU de 4 bits do Z80. Pelo que entendo, ela era usada duas vezes para operações de 8 bits, e fico curioso se isso era visto como um grande gargalo
Também queria saber se depois houve extensões com operações inteiras de largura maior. E se a versão open source do chip pode possibilitar novos recursos e variantes
Vendo por outro ângulo, mesmo que existisse uma ALU de 8 bits, as instruções aritméticas não seriam mais rápidas; em compensação, gastaria o dobro de transistores
A ALU de 4 bits é apenas um detalhe de implementação interna, invisível externamente. Dá para argumentar que isso vale com a exceção da existência do sinalizador half-carry, que representa o carry ao passar do nibble baixo para o nibble alto
Se você quer um substituto de CPU para encaixar diretamente em computadores domésticos antigos, precisa manter o timing original das instruções. Caso contrário, software que depende de cycle counting não vai funcionar. O ZX Spectrum talvez sofra menos com isso do que máquinas como o Amstrad CPC, por não ter hardware de vídeo programável
O eZ80 é um projeto mais moderno e eficiente, incluindo uma ALU mais larga: https://en.wikipedia.org/wiki/Zilog_eZ80. Mas não serve como opção para reviver computadores domésticos antigos; para isso, é preciso um clone de Z80 realmente preciso, incluindo o timing original e até os comportamentos não documentados
Fico curioso para saber se alguém tem ideia de que velocidade de clock dá para esperar disso
https://github.com/rejunity/z80-open-silicon/blob/main/docs/...
O cache precisa conhecer toda a comutação de bancos feita pelo sistema e também entender como os bancos de memória são mapeados no espaço de memória
ROM comum pode ser colocada em cache. RAM comum que não é compartilhada com outros dispositivos também pode ser colocada em cache. IO mapeado em memória não deve ser colocado em cache
RAM compartilhada com outros dispositivos, como memória de vídeo, mas na qual esse dispositivo não grava, permite cache write-through e cache completo de leitura. RAM compartilhada na qual outros dispositivos podem gravar não deve ser colocada em cache