SFD-700 mkII Guida dello Sviluppatore

English

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 n nei nomi dei segnali (es. FDC_SELni) e una convenzione che significa "attivo basso".

Processi
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 Logico
constant 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 bus

Costanti 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-80A
ROM_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)