Skip to content

IO_DCD_38

Source: Verilog/CPU-BOARD-3202/circuit/IO_DCD_38.v

Where it sits (Simulation): ND120_TOP > ND120_CORE > ND3202D > IO_37 > IO_DCD_38 - instance path: CORE.CPU_BOARD.IO.DCD

Used in: IO_37 (all tops)

Contains: DECODE_DGA

Module hierarchy - All modules

IO_DCD_38 symbol

Schematic

Drawn from the Verilog: the yosys netlist of the Simulation (Verilator) build, instance CORE.CPU_BOARD.IO.DCD. Sub-modules are boxes (click the picture to open it full size; there every sub-module box links to its page, and every wire shows its Verilog name).

IO_DCD_38 schematic

Description

ND120 CPU, MM&M IO/DCD IO DECODING SHEET 38 of 50 Last reviewed: 14-DEC-2024 Ronny Hansen

Ports

Direction Width Name Description
input 1 sysclk System clock in FPGA
input 1 sys_rst_n (active low) System reset in FPGA
input 1 CLK_EN CLK rise clock-enable pulse (FPGA_FF_MODE, else 0)
input 1 CLK_FALL_EN CLK fall clock-enable pulse (FPGA_FF_MODE, else 0)
input 1 BDRY50_n (active low) Bus Data Ready (Delayed 50ns) (from BIF_5.BDRY50_n)
input 1 BRK_n (active low) CPU Break Signal (from CPU_15.BRK_n)
input 1 CLK Main system clock (same net as CPU_15.CLK)
input [4:0] CSCOMM_4_0 Control Store Command (5 bits) (from IO_37.CSCOMM_4_0)
input [4:0] CSIDBS_4_0 Control Store IDB Source (5 bits) (from IO_37.CSIDBS_4_0)
input [1:0] CSMIS_1_0 Control Store MIS signal (2 bits) (from IO_37.CSMIS_1_0)
input 1 DAP_n (active low) Data Present (from BIF_5.DAP_n)
input 1 EORF_n (active low) Enable output register file (same net as CPU_15.EORF_n)
input 1 HIT Cache hit (from CPU_15.HIT)
input 1 ICONTIN_n (active low) Input signal from "C PLUG", signal B15 - CONTINUE_n (from ND3202D.CONTINUE_n)
input 1 ILOAD_n (active low) Input signal from "C PLUG", signal B12 - LOAD_n (from ND3202D.LOAD_n)
input 1 ISTOP_n (active low) Input signal from "C PLUG", signal B16 - STOP_n (from ND3202D.STOP_n)
input 1 LCS_n (active low) Load control store (same net as CPU_15.LCS_n)
input 1 LSHADOW Latch Shadow signal (from CPU_15.LSHADOW)
input [1:0] OC_1_0 Input signal from "A PLUG", signal C6 (OC0) and A6 (OC1) => (TO IO OC_1_0) (from ND3202D.OC_1_0)
input 1 OPCLCS COMMAND 36.2 LCS - Load control store from PROM and perform a Master Clear (from CPU_15.OPCLCS)
input 1 OSCCL_n (active low) Input signal from "A PLUG", signal B3 - OSCCL_n => (TO IO OSCCL_n) (from ND3202D.OSCCL_n)
input 1 PONI Memory Protection ON, PONI=1
input 1 POWSENSE_n (active low) Power Sense (from ND120_CORE.POWSENSE_n)
input 1 REF_n (active low)
input 1 RMM_n (active low)
input 1 SEL5MS_n (active low) SEL5MS if active will trigger RTC after 5 ms, not 20ms) (from ND3202D.SEL5MS_n)
input [1:0] STAT_4_3 Status bits 4 and 3 from PANEL/CALENDAR CPU 68705
input 1 SWMCL_n (active low) tied to 1 (in IO_37)
input 1 UCLK Microcode clock (same net as CPU_15.UCLK)
input 1 XTAL1 XTAL1 = 39.3216MHZ (from ND3202D.CLOCK_1)
input 1 XTAL2 CPU + bus + device domain (ND3202D sysclk/CLOCK_1/CLOCK_2) (from ND120_CORE.clk_cpu)
input [7:0] IDB_7_0_IN Internal Data Bus 7:0 IN (same net as IO_UART_42.IDB_7_0_IN)
output [7:0] IDB_7_0_OUT
output 1 CA10 Cache address bit 10 (to CPU_15.CA10)
output 1 CCLR_n (active low) Cache clear (to CPU_15.CCLR_n)
output 1 CEUART_n (active low) Chip Enable UART (to IO_UART_42.CEUART_n)
output 1 CLEAR_n (active low)
output 1 DT_n (active low) Data transfer (to CPU_15.DT_n)
output 1 DVACC_n (active low) DGA access qualifier (DECODE_DGA_COMM A227, arrives as XDVN) - not the CGA's VACC
output 1 ECREQ
output 1 ECSR_n (active low) Enable control store read (to CPU_15.ECSR_n)
output 1 EDO_n (active low) Enable data out (to CPU_15.EDO_n)
output 1 EIOR_n (active low) Enable I/O Read (to IO_UART_42.EIOR_n)
output 1 EMPID_n (active low) Enable memory parity interrupt disable (to CPU_15.EMPID_n)
output 1 EMP_n (active low)
output 1 EPANS_n (active low)
output 1 ESTOF_n (active low) Enable store overflow (to CPU_15.ESTOF_n)
output 1 FETCH
output 1 FMISS Cache fetch miss (to CPU_15.FMISS)
output 1 FORM_n (active low) Format instruction (to CPU_15.FORM_n)
output 1 FUL_n (active low)
output 1 IORQ_n (active low)
output 1 LHIT
output 1 MCL
output 1 MREQ_n (active low) Memory request (to CPU_15.MREQ_n)
output 1 OSC
output 1 PANOSC
output 1 PAN_n (active low) Panel interrupt request, active low (from the DGA, DECODE_DGA_POW.PANN)
output [7:0] PA_7_0 Data from FIFO in DGA (to IO_PANCAL_40.PA_7_0)
output 1 PA_n (active low)
output 1 POWFAIL_n (active low) Power failure detected (to CPU_15.POWFAIL_n)
output 1 PPOSC Panel Oscillator (to IO_UART_42.PPOSC)
output 1 PS_n (active low)
output 1 REFRQ_n (active low)
output 1 RINR_n (active low)
output 1 RT_n (active low) Reset trap (to CPU_15.RT_n)
output 1 RUART_n (active low) Read UART (HIGH=Write UART) (to IO_UART_42.RUART_n)
output 1 RWCS_n (active low) (NOT CONNECTED IN SHEET 39) - find signal from one of the PAL's ??
output 1 SHORT_n (active low)
output 1 SIOC_n (active low)
output 1 SLOW_n (active low)
output 1 SSEMA_n (active low)
output 1 STOC_n (active low) Store overflow check (to CPU_15.STOC_n)
output 1 STP Output-signal to "C PLUG", signal B14 RUN~ (driven by Stop flip-flop: low while CPU is running) (to ND3202D.RUN_n)
output 1 TOUT
output 1 TRAALD_n (active low)
output 1 VAL
output 1 WCHIM_n (active low) Write cache hit memory (to CPU_15.WCHIM_n)
output 1 WRITE Write cycle active (to CPU_15.WRITE)
output 1 EPAN_n (active low) Signal on the DGA chip (not connected in sheet 39). Maybe replaced by a PAL?

Verilog source

Verilog/CPU-BOARD-3202/circuit/IO_DCD_38.v on GitHub.

Show the Verilog of IO_DCD_38 (533 lines)
/**************************************************************************
** ND120 CPU, MM&M                                                       **
** IO/DCD                                                                **
** IO DECODING                                                           **
** SHEET 38 of 50                                                        **
**                                                                       **
** Last reviewed: 14-DEC-2024                                            **
** Ronny Hansen                                                          **
***************************************************************************/

module IO_DCD_38 (
    input sysclk,    // System clock in FPGA
    input sys_rst_n, // System reset in FPGA
    input CLK_EN,      // CLK rise clock-enable pulse (FPGA_FF_MODE, else 0)
    input CLK_FALL_EN, // CLK fall clock-enable pulse (FPGA_FF_MODE, else 0)

    input       BDRY50_n,  //! Bus Data Ready (Delayed 50ns) (from BIF_5.BDRY50_n)
    input       BRK_n,  //! CPU Break Signal (from CPU_15.BRK_n)
    input       CLK,  //! Main system clock (same net as CPU_15.CLK)
    input [4:0] CSCOMM_4_0,  //! Control Store Command (5 bits) (from IO_37.CSCOMM_4_0)
    input [4:0] CSIDBS_4_0,  //! Control Store IDB Source (5 bits) (from IO_37.CSIDBS_4_0)
    input [1:0] CSMIS_1_0,  //! Control Store MIS signal (2 bits) (from IO_37.CSMIS_1_0)
    input       DAP_n,  //! Data Present (from BIF_5.DAP_n)
    input       EORF_n,  //! Enable output register file (same net as CPU_15.EORF_n)
    input       HIT,  //! Cache hit (from CPU_15.HIT)
    input       ICONTIN_n,  //! Input signal from "C PLUG", signal B15 - CONTINUE_n (from ND3202D.CONTINUE_n)

    input       ILOAD_n,  //! Input signal from "C PLUG", signal B12 - LOAD_n (from ND3202D.LOAD_n)
    input       ISTOP_n,  //! Input signal from "C PLUG", signal B16 - STOP_n (from ND3202D.STOP_n)
    input       LCS_n,  //! Load control store (same net as CPU_15.LCS_n)
    input       LSHADOW,  //! Latch Shadow signal (from CPU_15.LSHADOW)
    input [1:0] OC_1_0,  //! Input signal from "A PLUG", signal C6 (OC0) and A6 (OC1)       => (TO IO OC_1_0) (from ND3202D.OC_1_0)
    input       OPCLCS,  //! COMMAND 36.2 LCS - Load control store from PROM and perform a Master Clear (from CPU_15.OPCLCS)
    input       OSCCL_n,  //! Input signal from "A PLUG", signal B3 - OSCCL_n                => (TO IO OSCCL_n) (from ND3202D.OSCCL_n)
    input       PONI,   //! Memory Protection ON, PONI=1
    input       POWSENSE_n,  //! Power Sense (from ND120_CORE.POWSENSE_n)
    input       REF_n,
    input       RMM_n,
    input       SEL5MS_n,  //! SEL5MS if active will trigger RTC after 5 ms, not 20ms) (from ND3202D.SEL5MS_n)
    input [1:0] STAT_4_3,  //! Status bits 4 and 3 from PANEL/CALENDAR CPU 68705
    input       SWMCL_n,  //! tied to 1 (in IO_37)
    input       UCLK,  //! Microcode clock (same net as CPU_15.UCLK)
    input       XTAL1,  //! XTAL1 = 39.3216MHZ (from ND3202D.CLOCK_1)
    input       XTAL2,  //! CPU + bus + device domain (ND3202D sysclk/CLOCK_1/CLOCK_2) (from ND120_CORE.clk_cpu)

    input  [7:0] IDB_7_0_IN,  //! Internal Data Bus 7:0 IN (same net as IO_UART_42.IDB_7_0_IN)
    output [7:0] IDB_7_0_OUT,


    output CA10,     //! Cache address bit 10 (to CPU_15.CA10)
    output CCLR_n,   //! Cache clear (to CPU_15.CCLR_n)
    output CEUART_n,  //! Chip Enable UART (to IO_UART_42.CEUART_n)
    output CLEAR_n,
    output DT_n,     //! Data transfer (to CPU_15.DT_n)
    output DVACC_n,   //! DGA access qualifier (DECODE_DGA_COMM A227, arrives as XDVN) - not the CGA's VACC
    output ECREQ,
    output ECSR_n,   //! Enable control store read (to CPU_15.ECSR_n)
    output EDO_n,    //! Enable data out (to CPU_15.EDO_n)
    output EIOR_n,   //! Enable I/O Read (to IO_UART_42.EIOR_n)
    output EMPID_n,  //! Enable memory parity interrupt disable (to CPU_15.EMPID_n)
    output EMP_n,
    output EPANS_n,
    output ESTOF_n,  //! Enable store overflow (to CPU_15.ESTOF_n)
    output FETCH,
    output FMISS,    //! Cache fetch miss (to CPU_15.FMISS)
    output FORM_n,   //! Format instruction (to CPU_15.FORM_n)
    output FUL_n,
    output IORQ_n,
    output LHIT,
    output MCL,
    output MREQ_n,   //! Memory request (to CPU_15.MREQ_n)
    output OSC,
    output PANOSC,
    output PAN_n,    //! Panel interrupt request, active low (from the DGA, DECODE_DGA_POW.PANN)
    output [7:0] PA_7_0,  //! Data from FIFO in DGA (to IO_PANCAL_40.PA_7_0)
    output PA_n,
    output POWFAIL_n,  //! Power failure detected (to CPU_15.POWFAIL_n)
    output PPOSC,    //! Panel Oscillator (to IO_UART_42.PPOSC)
    output PS_n,
    output REFRQ_n,
    output RINR_n,
    output RT_n,     //! Reset trap (to CPU_15.RT_n)
    output RUART_n,  //! Read UART (HIGH=Write UART) (to IO_UART_42.RUART_n)
    output RWCS_n,  // (NOT CONNECTED IN SHEET 39) - find signal from one of the PAL's ??
    output SHORT_n,
    output SIOC_n,
    output SLOW_n,
    output SSEMA_n,
    output STOC_n,   //! Store overflow check (to CPU_15.STOC_n)
    output STP,      //! Output-signal to "C PLUG", signal B14 RUN~ (driven by Stop flip-flop: low while CPU is running) (to ND3202D.RUN_n)
    output TOUT,
    output TRAALD_n,
    output VAL,
    output WCHIM_n,  //! Write cache hit memory (to CPU_15.WCHIM_n)
    output WRITE,    //! Write cycle active (to CPU_15.WRITE)
    output EPAN_n  // Signal on the DGA chip (not connected in sheet 39). Maybe replaced by a PAL?
);


  // DCD  BUS signal group documented in ND doc

  // DCDPANCALI (input) = RMM_n, STAT_4_3
  // DCDPANCALO (output) = EMP_n, EPANS_n, FUL_n, LHIT, PANOSC, PA[7:0], VAL

  // DCDCNTLI (input) = BDRY50_n, BRK_n, DAP_n, HIT, LCS_n, LSHADOW, OPCLCS, PONI, REF_n
  // DCDCNTLO (output) = CA10, CCLR_n, CLEAR_n, DT_n, DCACC_n, ECREQ, ECSR_n, EDO_n,  EMPID_n, ESTOF_n, FETCH, FMISS, FORM_n, IORQ_n, MCL, MREQ_n, PA_n, PS_n, REFRQ_n
  //                     RT_n, RWCS_n, SHORT_n, SLOW_n, SSEMA_n, STOC_n, STP, TOUT, WCHIM_n, WRITE

  /*******************************************************************************
   ** The wires are defined here                                                 **
   *******************************************************************************/
  wire [1:0] s_csmis_1_0;
  wire [1:0] s_oc_1_0;
  wire [1:0] s_stat_4_3;
  wire [3:0] s_dga_idb_3_0_out;
  wire [4:0] s_cscomm_4_0;
  wire [4:0] s_csidbs_4_0;
  wire [7:0] s_IDB_7_0_in;
  wire [7:0] s_IDB_7_0_out;
  wire [7:0] s_pa_7_0;

  wire       s_bdry50_n;
  wire       s_brk_n;
  wire       s_ca10;
  wire       s_cclr_n;
  wire       s_ceuart_n;
  wire       s_clear_n;
  wire       s_clk;  // bus IOTIM B
  wire       s_closc;
  wire       s_dap_n;
  wire       s_div_16;
  wire       s_dt_n;
  wire       s_dvacc_n;
  wire       s_ecreq;
  wire       s_ecsr_n;
  wire       s_edo_n;
  wire       s_eior_n;
  wire       s_emp_n;
  wire       s_empid_n;
  wire       s_eorf_n;
  wire       s_epan_n;
  wire       s_epans_n;
  wire       s_estof_n;
  wire       s_fetch;
  wire       s_fmiss;
  wire       s_form_n;
  wire       s_ful_n;
  wire       s_gated_swmcl_n;
  wire       s_hit;
  wire       s_icontin_n;
  wire       s_iload_n;
  wire       s_ioreq_n;
  wire       s_istop_n;
  wire       s_lcs_n;
  wire       s_lhit;
  wire       s_lshadow;
  wire       s_mcl;
  wire       s_mreq_n;
  wire       s_oc0_n;
  wire       s_oc0;
  wire       s_oc1_and_xtal2_n;
  wire       s_oc1;
  wire       s_opclcs;
  wire       s_osc_inp1;
  wire       s_osc_inp2;
  wire       s_osc;
  wire       s_oscccl_n;
  wire       s_pa_n;
  wire       s_pan_n;
  wire       s_panosc;
  wire       s_poni;
  wire       s_power_on_zener;
  wire       s_powfail_n;
  wire       s_powsense_n;
  wire       s_powsense;
  wire       s_pposc;
  wire       s_ps_n;
  wire       s_pwcl;
  wire       s_ref_n;
  wire       s_refrq_n;
  wire       s_rinr_n;
  wire       s_rmm_n;
  wire       s_rt_n;
  wire       s_ruart_n;
  wire       s_rwcs_n;
  wire       s_sel5ms_n;
  wire       s_short_n;
  wire       s_sioc_n;
  wire       s_slow_n;
  wire       s_ssema_n;
  wire       s_stoc_n;
  wire       s_stp;
  wire       s_swmcl_n;
  wire       s_tout;
  wire       s_traald_n;
  wire       s_uclk;
  wire       s_val;
  wire       s_wchim_n;
  wire       s_write;
  wire       s_XRTOSC;
  wire       s_XTAL1;
  wire       s_XTAL2;



  /*******************************************************************************
   ** Here all input connections are defined                                     **
   *******************************************************************************/

  // BUS signals
  assign s_csmis_1_0[1:0]   = CSMIS_1_0;
  assign s_stat_4_3[1:0]    = STAT_4_3;
  assign s_csidbs_4_0[4:0]  = CSIDBS_4_0;
  assign s_cscomm_4_0[4:0]  = CSCOMM_4_0;
  assign s_oc_1_0[1:0]      = OC_1_0;
  assign s_IDB_7_0_in[7:0]  = IDB_7_0_IN[7:0];

  // Signals
  assign s_bdry50_n         = BDRY50_n;
  assign s_brk_n            = BRK_n;
  assign s_clk              = CLK;
  assign s_dap_n            = DAP_n;
  assign s_eorf_n           = EORF_n;
  assign s_hit              = HIT;
  assign s_icontin_n        = ICONTIN_n;
  assign s_iload_n          = ILOAD_n;
  assign s_istop_n          = ISTOP_n;
  assign s_lcs_n            = LCS_n;
  assign s_lshadow          = LSHADOW;
  assign s_opclcs           = OPCLCS;
  assign s_oscccl_n         = OSCCL_n;
  assign s_poni             = PONI;
  assign s_powsense_n       = POWSENSE_n;
  assign s_ref_n            = REF_n;
  assign s_rmm_n            = RMM_n;
  assign s_sel5ms_n         = SEL5MS_n;
  assign s_swmcl_n          = SWMCL_n;  // Software Master Clear (MCL) negated
  assign s_uclk             = UCLK;
  assign s_XTAL1            = XTAL1;
  assign s_XTAL2            = XTAL2;

  /*******************************************************************************
   ** Here all output connections are defined                                    **
   *******************************************************************************/
  assign CA10               = s_ca10;
  assign CCLR_n             = s_cclr_n;
  assign CEUART_n           = s_ceuart_n;
  assign CLEAR_n            = s_clear_n;
  assign DT_n               = s_dt_n;
  assign DVACC_n            = s_dvacc_n;
  assign ECREQ              = s_ecreq;
  assign ECSR_n             = s_ecsr_n;
  assign EDO_n              = s_edo_n;
  assign EIOR_n             = s_eior_n;
  assign EMP_n              = s_emp_n;
  assign EMPID_n            = s_empid_n;
  assign EPAN_n             = s_epan_n;
  assign EPANS_n            = s_epans_n;
  assign ESTOF_n            = s_estof_n;
  assign FETCH              = s_fetch;
  assign FMISS              = s_fmiss;
  assign FORM_n             = s_form_n;
  assign FUL_n              = s_ful_n;
  assign IORQ_n             = s_ioreq_n;
  assign LHIT               = s_lhit;
  assign MCL                = s_mcl;
  assign MREQ_n             = s_mreq_n;
  assign OSC                = s_osc;
  assign PA_7_0             = s_pa_7_0[7:0];
  assign PA_n               = s_pa_n;
  assign PAN_n              = s_pan_n;
  assign PANOSC             = s_panosc;
  assign POWFAIL_n          = s_powfail_n;
  assign PPOSC              = s_pposc;
  assign PS_n               = s_ps_n;
  assign REFRQ_n            = s_refrq_n;
  assign RINR_n             = s_rinr_n;
  assign RT_n               = s_rt_n;
  assign RUART_n            = s_ruart_n;
  assign RWCS_n             = s_rwcs_n;
  assign SHORT_n            = s_short_n;
  assign SIOC_n             = s_sioc_n;
  assign SLOW_n             = s_slow_n;
  assign SSEMA_n            = s_ssema_n;
  assign STOC_n             = s_stoc_n;
  assign STP                = s_stp;
  assign TOUT               = s_tout;
  assign TRAALD_n           = s_traald_n;
  assign VAL                = s_val;
  assign WCHIM_n            = s_wchim_n;
  assign WRITE              = s_write;


  // IDB[7:0] out = IDB[7:0] in (Except if EPAN_n is low, then IDB out is the IDB 3-0 from the DGA chip)

  // Assign the upper 4 bits directly from the input to the output
  // WRONG! assign s_IDB_7_0_out[7:4] = s_IDB_7_0_in[7:4];

  // Assign to 0 as its not output
  assign s_IDB_7_0_out[7:4] = 4'b0; 

  // Conditionally assign the lower 4 bits based on the state of EPAN_n
  assign s_IDB_7_0_out[3:0] = s_epan_n ? 4'b0 : s_dga_idb_3_0_out[3:0];

  // Connect the intermediate signal to the final output
  assign IDB_7_0_OUT        = s_IDB_7_0_out;


  /*******************************************************************************
   ** Here all in-lined components are defined                                   **
   *******************************************************************************/

  // Power-on-zener  (schematic shows a zener diode circuit, that after anlysis needs 14 uSec to go from logic high to low - based on the 10nF capacitor and 1k resistor)
  // At 40Mhz that is 567 clock cycles

   // Power On Clear - 10ms delay
   reg regPowerOnClear;
   reg [10:0] regPowerOnDelay;

   assign s_power_on_zener   = regPowerOnClear;


  // NOT Gate
  assign s_powsense         = ~s_powsense_n;

  // OC 0 and 1
  assign s_oc0              = s_oc_1_0[0];
  assign s_oc0_n            = ~s_oc0;
  assign s_oc1              = s_oc_1_0[1];



  always @(posedge sysclk) begin
    if (sys_rst_n == 1'b0) begin
      regPowerOnClear <= 0;  // Start with 1, and then set to 0 after 14us delay
      regPowerOnDelay <= 0;
    end else begin
      if (regPowerOnClear == 0) begin
        if (regPowerOnDelay > 10) begin  //its 1418 clock cycles if we have 100MHZ- 575?. Make it easy for debugging cnt = 10
          regPowerOnClear <= 1;
        end else begin
          regPowerOnDelay <= regPowerOnDelay + 1;
        end
      end
    end
  end


  // Test signals
  wire TESTE;
  assign TESTE = 1'b0;  // Tied to GND on production PCB (TESTE=1 = factory test mode, runs timers 64x faster)

  //wire XTESTO;



  /***************
   ** Components **
  ****************/

  // Calculate OSC signal
  assign s_osc_inp1 = ~(s_XTAL1 & s_oc1 & s_oc0);  // Chip 10F
  assign s_osc_inp2 = ~(s_oc0_n & s_oc1_and_xtal2_n);
// ND120_FORCE_FPGA_OSC (01-SEP-2026): take the FPGA branch even in a Verilator
// build. The two branches are NOT equivalent - one is a combinational decode of
// XTAL/oc0/oc1, the other a clean clock net - and OSC clocks the AM29C821 delay
// chain and PAL_44403C (DLY0/DLY1). So a simulator run is NOT a like-for-like
// reference for anything that depends on OSC phase, which includes cycle
// timing. Needed to tell a genuine MiSTer fault from a sim-vs-FPGA difference
// that every board shares (Nexys and Tang boot on the FPGA branch).
`ifdef ND120_FORCE_FPGA_OSC
  assign s_osc = s_XTAL1;
`elsif VERILATOR_SIM
  assign s_osc = ~(s_osc_inp1 & s_osc_inp2);
`else
  // FPGA: OSC must be a CLEAN clock net, not a combinational LUT decode. The
  // memory controller (PAL_44902A) clocks the whole DRAM state machine on OSC,
  // while the BRAM + address latches clock on the BUFG sysclk. A LUT-generated
  // OSC is phase-shifted from sysclk and can glitch on the oc0/oc1/XTAL edges ->
  // the state machine mis-clocks and every memory read returns a fixed value.
  // On the FPGA XTAL1 = XTAL2 = clk1 = clk_cpu (BUFG), so the clock select is
  // moot; drive OSC straight from that clean net so OSC == sysclk == clk_cpu.
  assign s_osc = s_XTAL1;
`endif

  // The AND is done in a 74321 chip (Positive NAND Schmitt Trigger)
  assign s_oc1_and_xtal2_n = ~(s_oc1 & s_XTAL2);

  // Calculate CLOSC signal (Clear Oscillator)
  assign s_closc = ~(s_oscccl_n & s_power_on_zener);

  // Calculate PWCL signal
  assign s_gated_swmcl_n = ~(s_power_on_zener & s_swmcl_n);
  assign s_pwcl = s_gated_swmcl_n | s_opclcs;



  /*******************************************************************************
   ** Here all sub-circuits are defined                                          **
   *******************************************************************************/

  // PPOSC baud-rate reference always derived from sysclk (100MHz/8 = 12.5MHz),
  // NOT from XTAL1/clk1, so the UART speed is unaffected by SW2 clock divider.
`ifdef FPGA_FF_MODE
  // P3 (docs/plan-fix-unconstrained-clocks.md): the two ripple 74393s made
  // s_div_16 / s_XRTOSC register-driven clock roots. One synchronous 8-bit
  // counter is bit-exact to the cascade (the second counter incremented on
  // the s_div_16 fall = bits[3:0] wrap = bit 4 of a plain binary counter),
  // only shifted from negedge to posedge sysclk.
  reg [7:0] r_rt_cnt;
  always @(posedge sysclk) begin
    if (s_closc) r_rt_cnt <= 8'd0;
    else r_rt_cnt <= r_rt_cnt + 8'd1;
  end
  assign s_pposc  = r_rt_cnt[2];  // period 8 sysclk (12.5MHz at 100MHz, for UART)
  assign s_div_16 = r_rt_cnt[3];
  assign s_XRTOSC = r_rt_cnt[7];  // period 256 sysclk -> RTOSC to DGA
`else
  TTL_74393 CHIP_13C_1 (
      .CLK_n(sysclk),
      .RESET(s_closc),
      .QA(),
      .QB(),
      .QC(s_pposc),  // Signal PPOSC leaving DCD (100MHz/8 = 12.5MHz for UART)
      .QD(s_div_16)
  );

  TTL_74393 CHIP_13C_2 (
      .CLK_n(s_div_16),
      .RESET(s_closc),
      .QA(),
      .QB(),
      .QC(),
      .QD(s_XRTOSC)  // Signal RTOSC going to DGA (153.6Khz)
  );
`endif





  DECODE_DGA DGA (
      .sysclk(sysclk),
      .sys_rst_n(sys_rst_n),
      .XCLK_EN(CLK_EN),           // P2 clock-enable (CLK rise, FPGA_FF_MODE)
      .XCLK_FALL_EN(CLK_FALL_EN), // P2 clock-enable (CLK fall, FPGA_FF_MODE)
      /** INPUT **/

      .XBDN(s_bdry50_n),
      .XBRN(s_brk_n),
      .XCLK(s_clk),
      .XCLO(s_closc),
      .XCON(s_icontin_n),
      .XCO_4_0(s_cscomm_4_0),
      .XDAN(s_dap_n),
      .XEFN(s_ref_n),
      .XEON(s_eorf_n),
      .XHIN(~s_hit),  // XHIT_n (negated)
      .XID_4_0(s_csidbs_4_0),

      .XLCN(s_lcs_n),
      .XLON(s_iload_n),
      .XLSH(s_lshadow),
      .XMI_1_0(s_csmis_1_0),
      .XPOI(s_poni),
      .XPOW(s_powsense),
      .XPWC(s_pwcl),
      .XRMN(s_rmm_n),
      .XRTO(s_XRTOSC),  // XRTOSC
      .XS5N(s_sel5ms_n),
      .XST_4_3(s_stat_4_3),
      .XTES(TESTE),
      .XTON(s_istop_n),
      .XUCK(s_uclk),

      // IDB IN and OUT
      .XIDB_7_0_IN (s_IDB_7_0_in),
      .XIDB_3_0_OUT(s_dga_idb_3_0_out),

      /** OUTPUT **/
      .XA_7_0(s_pa_7_0),
      .XC10(s_ca10),
      .XCLN(s_clear_n),
      .XCRN(s_cclr_n),
      .XCSN(s_ecsr_n),
      .XDON(s_edo_n),
      .XDTN(s_dt_n), // Output from DGA_COMM when EXAMINE, DEPOSIT, AREAD, READ or WRITE
      .XDVN(s_dvacc_n),
      .XECR(s_ecreq),
      .XEMN(s_emp_n),
      .XEPN(s_epan_n),
      .XESN(s_estof_n),
      .XEUN(s_ceuart_n),
      .XFEC(s_fetch),
      .XFMI(s_fmiss),
      .XFON(s_form_n),
      .XFUN(s_ful_n),
      .XION(s_eior_n),
      //            .XI_3_0_C(),
      //            .XI_3_0_O(),
      .XLHN(s_lhit),
      .XMCL(s_mcl),
      .XMRN(s_mreq_n),
      .XOCN(s_sioc_n),
      .XPAN(s_pa_n),
      .XPEN(s_ps_n),
      .XPFN(s_powfail_n),
      .XPIN(s_empid_n),
      .XPNN(s_pan_n),
      .XPSC(s_panosc),
      .XPSN(s_epans_n),
      .XRFN(s_refrq_n),
      .XRIN(s_rinr_n),
      .XRQN(s_ioreq_n),
      .XRTN(s_rt_n),
      .XRUN(s_ruart_n),
      .XRWN(s_rwcs_n),  // (NOT CONNECTED IN SHEET 39)
      .XSCN(s_stoc_n),
      .XSHN(s_short_n),
      .XSSN(s_ssema_n),
      .XSTP(s_stp), // output (STP indicates the Stop flip-flop is set) (from DGA_POW)
      .XSWN(s_slow_n),
      //.XTEO(XTESTO),
      .XTEO(),  // TEST OUTPUT (NOT CONNECTED IN SHEET 39)
      .XTOT(s_tout),
      .XTRN(s_traald_n),
      .XVAL(s_val),
      .XWHN(s_wchim_n),
      .XWRI(s_write)

  );

endmodule