SFD-700 mkII Guia del Desarrollador

English

SFD-700 mkII Guia del Desarrollador

Esta guia proporciona una revision exhaustiva del codigo fuente de la logica programable del SFD-700 mkII, con atencion particular a la explicacion de conceptos e idiomas VHDL para lectores no familiarizados con los lenguajes de descripcion de hardware. Cada proceso y asignacion de senal concurrente en el diseno CPLD se explica en espanol, junto con el VHDL que lo implementa.
Para la arquitectura de hardware y mapas de registros, consulte la Guia Tecnica. Para instalacion y uso, consulte el Manual de Usuario. Para compilar la logica del CPLD (y la logica heredada CUPL/GAL) sin configurar una cadena de herramientas a mano, utilice el script de configuracion automatizada (setup_SFD700.sh / setup_SFD700_windows_native.ps1) descrito en Configuracion y compilacion automatizada en la Guia Tecnica.

Introduccion a VHDL para No-Programadores VHDL

VHDL (VHSIC Hardware Description Language) no es un lenguaje de programacion en el sentido tradicional -- describe circuitos de hardware: puertas logicas, flip-flops, multiplexores y sus conexiones. Cuando un diseno VHDL se compila (sintetiza) para un CPLD o FPGA, las herramientas traducen su descripcion en una netlist de puertas y registros reales que se cablean permanentemente en el dispositivo.

Todo se ejecuta simultaneamente
Lo mas importante de entender sobre VHDL es que todos los procesos y asignaciones de senales en una arquitectura se ejecutan de manera concurrente. A diferencia de un programa donde la linea 10 se ejecuta despues de la linea 9, en VHDL cada bloque logico esta activo y respondiendo a sus entradas en todo momento -- igual que el hardware real que describe.

Entidades, Arquitecturas y Puertos
Un diseno VHDL tiene dos partes: la entidad (interfaz externa -- lista los pines de entrada y salida) y la arquitectura (implementacion interna -- describe la logica que conecta los pines).

Senales
Las senales son los cables internos del diseno. El sufijo n en los nombres de senales (ej. FDC_SELni) es una convencion que significa "activo bajo".

Procesos
Un proceso con reloj describe registros flip-flop. Un proceso combinatorio describe puertas logicas puras -- la salida es una funcion inmediata de las entradas.

Tipos de Datos Utilizados
  • std_logic -- una senal binaria unica ('0', '1', 'Z' para alta impedancia).
  • std_logic_vector(N downto 0) -- un bus de N+1 bits.
  • integer range 0 to 7 -- un entero limitado usado para IFMODE.

Arbol de Fuentes

Archivo Rol
sfd700_pkg.vhd Package – constantes, valores de modo de maquina, funciones de utilidad
sfd700_Toplevel.vhd Entidad de nivel superior – mapea pines fisicos CPLD a la implementacion
sfd700.vhd Implementacion – todos los procesos logicos y asignaciones de senales
build/sfd700.qpf Archivo de proyecto Quartus II
build/sfd700.qsf Archivo de configuracion Quartus II
build/output_files/sfd700.pof Archivo de programacion CPLD compilado
CUPL/ Fuentes GAL CUPL para placas v1.0/v1.1

Archivo Package: sfd700_pkg.vhd

Constantes de Estado 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

Constantes de Modo de Maquina
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

Proceso: FDCCLK -- Divisor de Reloj

FDCCLK: process( CLK_16M )
begin
    if(rising_edge(CLK_16M)) then
        CLK_8Mi <= not CLK_8Mi;
    end if;
end process;
Que hace: Este proceso contiene un unico flip-flop de alternancia que divide el reloj primario de 16 MHz por dos, produciendo el reloj de 8 MHz requerido por el WD1773.

Proceso: SETDRIVE -- Control de Unidad y Motor

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;
Que hace: Maneja las escrituras al puerto I/O 0xDC para seleccionar una de cuatro unidades de disquete y controlar el motor del husillo.

Asignaciones de Senales Concurrentes

ROM_A10 -- Bit de Direccion de Pagina / Truco DRQ MZ-80A
ROM_A10 <= '1' when (IFMODE = MODE_MZ1200 or IFMODE = MODE_MZ80A) and DRQ = '1'
           else Z80_ADDR(10);
Esta unica linea implementa el truco de compensacion de velocidad del MZ-80A. Para todas las maquinas excepto MZ-80A/MZ-1200, ROM_A10 simplemente sigue Z80_ADDR(10). En MODE 0, DRQ se sustituye por ADDR(10) cuando DRQ esta activo ('1').

Modificacion de la Logica CPLD

El fuente VHDL esta estructurado para hacer simples las modificaciones comunes: agregar un nuevo puerto I/O, agregar un nuevo modo de maquina, cambiar la relacion del divisor de reloj.

Pipeline CI/CD

El SFD-700 mkII utiliza un pipeline Jenkins CI/CD para la compilacion CPLD automatizada, el ensamblaje de ROM RFS y la gestion de versiones. El pipeline es activado por webhooks de Gitea y produce bitstreams CPLD versionados e imagenes ROM para distribucion.

Sitios de Referencia

Recurso Enlace
Pagina del proyecto SFD-700 mkII /es/sfd700/
Manual de Usuario SFD-700 mkII /es/sfd700-usermanual/
Guia Tecnica SFD-700 mkII /es/sfd700-technicalguide/
SFD-800 (tarjeta companera MZ-800) /sfd800/
Manual de Referencia VHDL Estandar IEEE 1076-2008
Hoja de datos Altera MAX7000S Paginas de producto Intel FPGA – Familia MAX 7000S
Quartus II 13.0.1 SP1 Web Edition Intel FPGA Software Archive
Hoja de datos WD1773 Western Digital / Archivo historico
Manual de Referencia CUPL Logical Devices Inc. (archivado)