SFD-700 mkII Guide du Developpeur
SFD-700 mkII Guide du Developpeur
Ce guide fournit une revue approfondie du code source de la logique programmable du SFD-700 mkII, avec une attention particuliere a l'explication des concepts et idiomes VHDL pour les lecteurs non familiers avec les langages de description materielle. Chaque processus et affectation de signal concurrente dans la conception CPLD est explique en francais, accompagne du VHDL qui l'implemente.
Pour l'architecture materielle et les cartes de registres, consultez le Guide Technique. Pour l'installation et l'utilisation, consultez le Manuel Utilisateur. Pour compiler la logique CPLD (et l'ancienne logique CUPL/GAL) sans configurer une chaine d'outils a la main, utilisez le script d'installation automatise (
setup_SFD700.sh / setup_SFD700_windows_native.ps1) decrit sous Installation et compilation automatisees dans le Guide Technique.
Introduction au VHDL pour les Non-Programmeurs VHDL
Le VHDL (VHSIC Hardware Description Language) n'est pas un langage de programmation au sens traditionnel -- il decrit des circuits materiels : portes logiques, bascules, multiplexeurs et leurs connexions. Lorsqu'une conception VHDL est compilee (synthetisee) pour un CPLD ou un FPGA, les outils traduisent votre description en une netlist de portes et registres reels qui sont cablees en permanence dans le dispositif.
Tout s'execute simultanement
Le point le plus important a comprendre a propos du VHDL est que tous les processus et affectations de signaux dans une architecture s'executent de maniere concurrente. Contrairement a un programme ou la ligne 10 s'execute apres la ligne 9, en VHDL chaque bloc logique est actif et repond a ses entrees en permanence -- tout comme le materiel reel qu'il decrit.
Entites, Architectures et Ports
Une conception VHDL a deux parties :
Signaux
- L'entite est l'interface externe -- elle liste les broches d'entree et de sortie.
- L'architecture est l'implementation interne -- elle decrit la logique qui connecte les broches.
Les signaux sont les fils internes de la conception. Le suffixe
Processus
n dans les noms de signaux (par ex. FDC_SELni) est une convention signifiant "actif bas" -- le signal est actif lorsqu'il est a zero logique ('0').
Un processus cadence decrit des registres a bascule -- la logique qui capture une valeur a un instant specifique (le front d'horloge). Un processus combinatoire decrit des portes logiques pures -- la sortie est une fonction immediate des entrees.
Types de Donnees Utilises
std_logic-- un signal binaire unique ('0', '1', 'Z' pour haute impedance).std_logic_vector(N downto 0)-- un bus de N+1 bits.integer range 0 to 7-- un entier borne utilise pour IFMODE.
Arborescence des Sources
| Fichier | Role |
|---|---|
sfd700_pkg.vhd |
Package – constantes, valeurs de mode machine, fonctions utilitaires |
sfd700_Toplevel.vhd |
Entite de niveau superieur – mappe les broches physiques CPLD a l’implementation |
sfd700.vhd |
Implementation – tous les processus logiques et affectations de signaux |
build/sfd700.qpf |
Fichier projet Quartus II |
build/sfd700.qsf |
Fichier parametres Quartus II |
build/output_files/sfd700.pof |
Fichier de programmation CPLD compile |
CUPL/ |
Sources GAL CUPL pour les cartes v1.0/v1.1 |
Fichier Package : sfd700_pkg.vhd
Constantes d'Etat Logiqueconstant 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 busConstantes de Mode Machine
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-2200Fonctions Utilitaires
IntMax(a, b) -- retourne le plus grand de deux entiers.
log2ceil(arg) -- retourne le nombre de bits necessaires pour representer un entier positif.
clockTicks(period, clock) -- retourne le nombre de cycles d'horloge qui tiennent dans une periode donnee.
reverse_vector(slv) -- inverse l'ordre des bits d'un vecteur logique standard.
to_std_logic(i) -- convertit l'entier 0 en '0', tout autre entier en '1'.
bit_to_integer(s) -- convertit un bit std_logic en entier naturel (0 ou 1).
Fichier de Niveau Superieur : sfd700_Toplevel.vhd
Le fichier de niveau superieur definit l'entite
sfd700 -- l'interface que Quartus mappe sur les broches physiques du CPLD. Son role est purement structurel : il declare la meme liste de ports que l'entite d'implementation (cpld128 dans sfd700.vhd) et instancie cette implementation avec un mappage direct 1:1.
Fichier Logique Principal : sfd700.vhd
Declarations d'Entite et de Portsentity cpld128 is
port (
Z80_ADDR : in std_logic_vector(15 downto 0);
Z80_DATA : inout std_logic_vector(7 downto 0);
Z80_M1n : in std_logic;
Z80_RDn : in std_logic;
Z80_WRn : in std_logic;
Z80_IORQn : in std_logic;
Z80_MREQn : in std_logic;
Z80_INT : out std_logic;
Z80_EXWAITn : out std_logic;
Z80_RESETn : in std_logic;
ID : inout std_logic_vector(7 downto 0);
ROM_A10 : out std_logic;
RAM_A10 : out std_logic;
ROM_CSn : out std_logic;
RAM_CSn : out std_logic;
RSV : out std_logic;
MODE : in std_logic_vector(2 downto 0);
FDCn : out std_logic;
INTRQ : in std_logic;
DRQ : in std_logic;
DDENn : out std_logic;
SIDE1 : out std_logic;
MOTOR : out std_logic;
DRVSAn : out std_logic;
DRVSBn : out std_logic;
DRVSCn : out std_logic;
DRVSDn : out std_logic;
CLK_16M : in std_logic;
CLK_FDC : out std_logic;
CLK_BUS0 : in std_logic
);
end entity;
Processus : FDCCLK -- Diviseur d'Horloge
FDCCLK: process( CLK_16M )
begin
if(rising_edge(CLK_16M)) then
CLK_8Mi <= not CLK_8Mi;
end if;
end process;
Ce qu'il fait : Ce processus contient une seule bascule a basculement qui divise l'horloge primaire 16 MHz par deux, produisant l'horloge 8 MHz requise par le WD1773.
Processus : SETMODE -- Verrou du Registre de Mode
SETMODE: process( Z80_RESETn, MODE )
begin
if(Z80_RESETn = '0') then
IFMODE <= to_integer(unsigned(MODE));
end if;
end process;
Ce qu'il fait : Echantillonne les trois broches d'entree du cavalier MODE et stocke leur valeur comme entier dans IFMODE lorsque le systeme est maintenu en reinitialisation.
Processus : SETDRIVE -- Controle Lecteur et Moteur
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;
Ce qu'il fait : Gere les ecritures sur le port I/O 0xDC pour selectionner l'un des quatre lecteurs de disquettes et controler le moteur de broche.
Processus : SETHIMEM -- Gestion Memoire MZ-700 / MZ-1500
Ce qu'il fait : Suit l'etat de gestion memoire du MZ-700 et du MZ-1500 et maintient deux registres de drapeaux (REG_ROMINH et REG_ROMDIS) qui indiquent a la logique de chip-select si les fenetres ROM et RAM du SFD-700 doivent etre visibles pour l'hote.
Affectations de Signaux Concurrentes
Les affectations de signaux concurrentes en dehors de tout processus forment la logique combinatoire du CPLD. Elles sont evaluees en continu -- chaque fois qu'un signal d'entree change, la sortie est mise a jour dans un delai de propagation CPLD.
ROM_A10 -- Bit d'Adresse de Page / Astuce DRQ MZ-80A
ROM_A10 <= '1' when (IFMODE = MODE_MZ1200 or IFMODE = MODE_MZ80A) and DRQ = '1'
else Z80_ADDR(10);
Modification de la Logique CPLD
La source VHDL est structuree pour rendre les modifications courantes simples :
Ajout d'un nouveau port I/O : Ajoutez un signal de selection, une affectation concurrente de decodage et un processus pour capturer les donnees.
Ajout d'un nouveau mode machine : Ajoutez une constante dans
sfd700_pkg.vhd, mettez a jour le bloc de reinitialisation SETFXXXPAGE et les affectations de chip-select.
Pipeline CI/CD
Le SFD-700 mkII utilise un pipeline Jenkins CI/CD pour la compilation CPLD automatisee, l'assemblage ROM RFS et la gestion des versions. Le pipeline est declenche par des webhooks Gitea et produit des bitstreams CPLD versiones et des images ROM pour la distribution.
Sites de Reference
| Ressource | Lien |
|---|---|
| Page projet SFD-700 mkII | /fr/sfd700/ |
| Manuel Utilisateur SFD-700 mkII | /fr/sfd700-usermanual/ |
| Guide Technique SFD-700 mkII | /fr/sfd700-technicalguide/ |
| SFD-800 (carte compagnon MZ-800) | /sfd800/ |
| Manuel de Reference du Langage VHDL | Standard IEEE 1076-2008 |
| Fiche technique Altera MAX7000S | Pages produit Intel FPGA – Famille MAX 7000S |
| Quartus II 13.0.1 SP1 Web Edition | Intel FPGA Software Archive |
| Fiche technique WD1773 | Western Digital / Archives historiques |
| Manuel de Reference CUPL | Logical Devices Inc. (archive) |