SFD-700 mkII Guida dello Sviluppatore
SFD-700 mkII Guida dello Sviluppatore
Questa guida fornisce una revisione approfondita del codice sorgente della logica programmabile dell'SFD-700 mkII, con particolare attenzione alla spiegazione dei concetti e degli idiomi VHDL per i lettori non familiari con i linguaggi di descrizione hardware. Ogni processo e assegnazione di segnale concorrente nel design CPLD e spiegato in italiano, insieme al VHDL che lo implementa.
Per l'architettura hardware e le mappe dei registri, consultare la Guida Tecnica. Per l'installazione e l'utilizzo, consultare il Manuale Utente. Per compilare la logica CPLD (e la logica legacy CUPL/GAL) senza configurare manualmente una toolchain, usare lo script di configurazione automatizzata (
setup_SFD700.sh / setup_SFD700_windows_native.ps1) descritto in Configurazione e compilazione automatizzate nella Guida Tecnica.
Introduzione al VHDL per Non-Programmatori VHDL
Il VHDL (VHSIC Hardware Description Language) non e un linguaggio di programmazione nel senso tradizionale -- descrive circuiti hardware: porte logiche, flip-flop, multiplexer e le loro connessioni. Quando un design VHDL viene compilato (sintetizzato) per un CPLD o FPGA, gli strumenti traducono la descrizione in una netlist di porte e registri reali che vengono cablati permanentemente nel dispositivo.
Tutto funziona simultaneamente
La cosa piu importante da capire sul VHDL e che tutti i processi e le assegnazioni di segnale in un'architettura funzionano in modo concorrente. A differenza di un programma dove la riga 10 viene eseguita dopo la riga 9, in VHDL ogni blocco logico e attivo e risponde ai suoi ingressi in ogni momento -- proprio come l'hardware reale che descrive.
Entity, Architecture e Port
Un design VHDL ha due parti: l'entity (interfaccia esterna -- elenca i pin di ingresso e uscita) e l'architecture (implementazione interna -- descrive la logica che collega i pin).
Segnali
I segnali sono i fili interni del design. Il suffisso
Processi
n nei nomi dei segnali (es. FDC_SELni) e una convenzione che significa "attivo basso".
Un processo cadenzato descrive registri flip-flop. Un processo combinatorio descrive porte logiche pure -- l'uscita e una funzione immediata degli ingressi.
Tipi di Dati Utilizzati
std_logic-- un singolo segnale binario ('0', '1', 'Z' per alta impedenza).std_logic_vector(N downto 0)-- un bus di N+1 bit.integer range 0 to 7-- un intero limitato usato per IFMODE.
Albero dei Sorgenti
| File | Ruolo |
|---|---|
sfd700_pkg.vhd |
Package – costanti, valori modalita macchina, funzioni di utilita |
sfd700_Toplevel.vhd |
Entity di livello superiore – mappa i pin fisici CPLD all’implementazione |
sfd700.vhd |
Implementazione – tutti i processi logici e le assegnazioni di segnale |
build/sfd700.qpf |
File progetto Quartus II |
build/sfd700.qsf |
File impostazioni Quartus II |
build/output_files/sfd700.pof |
File di programmazione CPLD compilato |
CUPL/ |
Sorgenti GAL CUPL per schede v1.0/v1.1 |
File Package: sfd700_pkg.vhd
Costanti di Stato Logicoconstant YES : std_logic := '1'; -- Assertion: yes, true, active constant NO : std_logic := '0'; -- Negation: no, false, inactive constant HI : std_logic := '1'; -- Signal is at logic high (voltage) constant LO : std_logic := '0'; -- Signal is at logic low (ground) constant ONE : std_logic := '1'; -- Binary one constant ZERO : std_logic := '0'; -- Binary zero constant HIZ : std_logic := 'Z'; -- High impedance: not driving the busCostanti Modalita Macchina
constant MODE_MZ1200 : integer := 0; -- Sharp MZ-1200 (alias of MZ-80A) constant MODE_MZ80A : integer := 0; -- Sharp MZ-80A constant MODE_MZ700 : integer := 1; -- Sharp MZ-700 constant MODE_MZ80B : integer := 2; -- Sharp MZ-80B constant MODE_MZ800 : integer := 3; -- Sharp MZ-800 constant MODE_MZ1500 : integer := 4; -- Sharp MZ-1500 constant MODE_MZ2000 : integer := 5; -- Sharp MZ-2000 constant MODE_MZ2200 : integer := 6; -- Sharp MZ-2200
Processo: FDCCLK -- Divisore di Clock
FDCCLK: process( CLK_16M )
begin
if(rising_edge(CLK_16M)) then
CLK_8Mi <= not CLK_8Mi;
end if;
end process;
Cosa fa: Questo processo contiene un singolo flip-flop a toggle che divide il clock primario da 16 MHz per due, producendo il clock da 8 MHz richiesto dal WD1773.
Processo: SETDRIVE -- Controllo Unita e Motore
SETDRIVE: process( Z80_RESETn, CLK_16M, DRIVE_WR_SELni )
variable DRIVE_SEL_LASTni: std_logic;
begin
if(Z80_RESETn = '0') then
REG_DRIVEA <= '0'; REG_DRIVEB <= '0';
REG_DRIVEC <= '0'; REG_DRIVED <= '0';
REG_MOTOR <= '0';
DRIVE_SEL_LASTni := '0';
elsif(rising_edge(CLK_16M)) then
if(DRIVE_WR_SELni = '0' and DRIVE_SEL_LASTni = '1') then
REG_DRIVEA <= '0'; REG_DRIVEB <= '0';
REG_DRIVEC <= '0'; REG_DRIVED <= '0';
REG_MOTOR <= Z80_DATA(7);
case(to_integer(unsigned(Z80_DATA(2 downto 0)))) is
when 0 =>
when 4 => REG_DRIVEA <= '1';
when 5 => REG_DRIVEB <= '1';
when 6 => REG_DRIVEC <= '1';
when 7 => REG_DRIVED <= '1';
when others =>
end case;
end if;
DRIVE_SEL_LASTni := DRIVE_WR_SELni;
end if;
end process;
Cosa fa: Gestisce le scritture sulla porta I/O 0xDC per selezionare una delle quattro unita floppy e controllare il motore del mandrino.
Assegnazioni di Segnale Concorrenti
ROM_A10 -- Bit Indirizzo Pagina / Trucco DRQ MZ-80AROM_A10 <= '1' when (IFMODE = MODE_MZ1200 or IFMODE = MODE_MZ80A) and DRQ = '1'
else Z80_ADDR(10);
Questa singola riga implementa il trucco di compensazione della velocita dell'MZ-80A. Per tutte le macchine diverse da MZ-80A/MZ-1200, ROM_A10 segue semplicemente Z80_ADDR(10). In MODE 0, DRQ viene sostituito ad ADDR(10) quando DRQ e attivo ('1').
Modifica della Logica CPLD
Il sorgente VHDL e strutturato per rendere semplici le modifiche comuni: aggiunta di una nuova porta I/O, aggiunta di una nuova modalita macchina, modifica del rapporto di divisione del clock.
Pipeline CI/CD
L'SFD-700 mkII utilizza una pipeline Jenkins CI/CD per la compilazione CPLD automatizzata, l'assemblaggio ROM RFS e la gestione delle release. La pipeline e attivata da webhook Gitea e produce bitstream CPLD versionati e immagini ROM per la distribuzione.
Siti di Riferimento
| Risorsa | Link |
|---|---|
| Pagina progetto SFD-700 mkII | /it/sfd700/ |
| Manuale Utente SFD-700 mkII | /it/sfd700-usermanual/ |
| Guida Tecnica SFD-700 mkII | /it/sfd700-technicalguide/ |
| SFD-800 (scheda compagna MZ-800) | /sfd800/ |
| Manuale di Riferimento VHDL | Standard IEEE 1076-2008 |
| Scheda tecnica Altera MAX7000S | Pagine prodotto Intel FPGA |
| Quartus II 13.0.1 SP1 Web Edition | Intel FPGA Software Archive |
| Scheda tecnica WD1773 | Western Digital / Archivio storico |
| Manuale di Riferimento CUPL | Logical Devices Inc. (archiviato) |