SFD-700 mkII Guia del Desarrollador
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
Procesos
n en los nombres de senales (ej. FDC_SELni) es una convencion que significa "activo bajo".
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 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 busConstantes 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-80AROM_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) |