Skip to content

PAL_44310D

Source: Verilog/PAL/PAL_44310D.v

Where it sits (Simulation): ND120_TOP > ND120_CORE > ND3202D > MEM_43 > MEM_LBDIF_48 > PAL_44310D - instance path: CORE.CPU_BOARD.MEM.LBDIF.PAL_44310_ULBDIF

Used in: MEM_LBDIF_48 (all tops)

Contains: no other modules.

Module hierarchy - All modules

PAL_44310D symbol

Schematic

Drawn from the Verilog: the yosys netlist of the Simulation (Verilator) build, instance CORE.CPU_BOARD.MEM.LBDIF.PAL_44310_ULBDIF. 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).

PAL_44310D schematic

Description

ND120 PALASM CODE CONVERTED TO VERILOG Component PAL 44310D Last reviewed: 2-FEB-2025 Ronny Hansen

Ports

Direction Width Name Description
input 1 CK Clock input (added for FPGA synthesis)
input 1 sys_rst_n (active low) System reset (active low, for FPGA synthesis)
input 1 HIEN_n (active low) I0
input 1 BGNT_n (active low) I1
input 1 CGNT_n (active low) I2
input 1 LOEN_n (active low) I3
input 1 CGNT50_n (active low) I4
input 1 ECCR I5
input 1 BGNT50_n (active low) I6
input 1 BGNT75_n (active low) I7
input 1 BDAP50_n (active low) I8
input 1 MR_n (active low) I9
output 1 BDRY_n (active low) B0
output 1 BIOXL_n (active low) B1
input 1 RAS B2
input 1 REF100_n (active low) B3
input 1 BIOXE_n (active low) B4
input 1 MWRITE50_n (active low) B5
output 1 BCGNT50R_n (active low) Y0
output 1 RDATA Y1

Verilog source

Verilog/PAL/PAL_44310D.v on GitHub.

Show the Verilog of PAL_44310D (141 lines)
/**********************************************************************************************************
** ND120 PALASM CODE CONVERTED TO VERILOG                                                                **
**                                                                                                       **
** Component PAL 44310D                                                                                  **
**                                                                                                       **
** Last reviewed: 2-FEB-2025                                                                             **
** Ronny Hansen                                                                                          **
***********************************************************************************************************/



//PAL16L8
//ADGD 13/8/86
//44310D,3F,LBDIF

// NOTE: PAL16L8 is purely combinational in the original hardware.
// Clock input added for FPGA synthesis to eliminate latch inference.

module PAL_44310D (
    input  CK,        //! Clock input (added for FPGA synthesis)
    input  sys_rst_n, //! System reset (active low, for FPGA synthesis)

    input  HIEN_n,    //! I0
    input  BGNT_n,    //! I1
    input  CGNT_n,    //! I2
    input  LOEN_n,    //! I3
    input  CGNT50_n,  //! I4
    input  ECCR,      //! I5
    input  BGNT50_n,  //! I6
    input  BGNT75_n,  //! I7
    input  BDAP50_n,  //! I8
    input  MR_n,      //! I9

    output BDRY_n,     //! B0
    output BIOXL_n,    //! B1
    input  RAS,        //! B2
    input  REF100_n,   //! B3
    input  BIOXE_n,    //! B4
    input  MWRITE50_n, //! B5

    output BCGNT50R_n, //! Y0
    output RDATA       //! Y1
);


  // Creating non-negated wires for active-low inputs
  wire HIEN = ~HIEN_n;
  wire BGNT = ~BGNT_n;
  wire CGNT = ~CGNT_n;
  wire LOEN = ~LOEN_n;
  wire BGNT50 = ~BGNT50_n;
  wire BGNT75 = ~BGNT75_n;
  wire BDAP50 = ~BDAP50_n;
  wire MWRITE50 = ~MWRITE50_n;
  wire BIOXE = ~BIOXE_n;

  wire BIOXL = ~BIOXL_n;
  wire CGNT50 = ~CGNT50_n;
  wire REF100 = ~REF100_n;

  wire RAS_n = ~RAS;


  // Logic for BCGNT50R_n (active-low)
  assign BCGNT50R_n = ~((MWRITE50_n & BGNT & BGNT50) |  // FROM 50NS AFTER GNT ON READ C
      (MWRITE50_n & CGNT & CGNT50)  // LASTS FOR THE REST OF THE CYCLE
      );

  // Logic for BDRY_n (active-low)
  reg BDRY;

`ifdef USE_TRANSPARENT_LATCHES
  // Transparent latch (original behavior for simulation)
  /* verilator lint_off LATCH */
  always @(*) begin
    if ((MWRITE50_n & BDAP50 & BGNT & LOEN_n & HIEN_n & RAS_n) |  // BUS READ FROM LOCAL MEM
        (MWRITE50 & BDAP50 & BGNT50 & BGNT) |  // BUS WRITE TO LOCAL MEM
        (BIOXL & ECCR) |  // IOX=ECCR
        (REF100) | (MWRITE50_n & BDAP50 & BGNT50_n & BGNT75)  // LATE BDRY FOR 10MHZ DISK
        )
      BDRY = 1'b1;
    // PALASM 44310D: hold = /MR*BDRY*BDAP50 + /MR*BDRY*BIOXE - BDRY holds
    // while MR_n & (BDAP50 | BIOXE); clear only when BOTH hold terms fail
    // (30-JUL audit: was OR of the negated terms, so the memory hold never
    // held in DMA cycles where BIOXE is off - lost/shortened BDRY, the exact
    // failure this PAL's own 1986 errata describes).
    else if (~MR_n | (~BDAP50 & ~BIOXE))
      BDRY = 1'b0;
  end
  /* verilator lint_on LATCH */
`else
  // Edge-triggered flip-flop (FPGA synthesis)
  always @(posedge CK or negedge sys_rst_n) begin
    if (!sys_rst_n) begin
      BDRY <= 1'b0;
    end else begin
      if ((MWRITE50_n & BDAP50 & BGNT & LOEN_n & HIEN_n & RAS_n) |
          (MWRITE50 & BDAP50 & BGNT50 & BGNT) |
          (BIOXL & ECCR) |
          (REF100) | (MWRITE50_n & BDAP50 & BGNT50_n & BGNT75))
        BDRY <= 1'b1;
      // Clear rule per PALASM (see latch branch comment, 30-JUL audit fix)
      else if (~MR_n | (~BDAP50 & ~BIOXE))
        BDRY <= 1'b0;
    end
  end
`endif

  assign BDRY_n = ~BDRY;

  // Logic for BIOXL_n (active-low)
  assign BIOXL_n = ~(BIOXE & BGNT_n & CGNT_n);

  // Logic for RDATA
  assign RDATA = ~((MWRITE50) |  // INDICATES DATA READY ON
      (LOEN) | (HIEN) | (BGNT_n & CGNT_n) | (RAS));

endmodule

/*

DESCRIPTION

:280287 JLB: ECCR WRONG POLARITY, RESPONDS WITH BDRY TO
;EXISTING IOX-ES.
;280287 JLB: NEW INPUT REF~ , TO GENERATE A REF PULSE OF 175-200NS
;DURATION BY GENERATING BDRY.
;
;180587 M3202B
;090787 B JLB: RAS USED IN RDATA TO AVOID SPIKE ON TRANSITION FROM
;              LOEN TO HIEN.
;290787 C JLB: BD HAD A TYPICAL SETUP TIME OF 140NS BEFORE BDRY ON DMA READ
;              CHANGED TO 65NS (25NS REQUIRED). DMA BUFFERED WRITE: BDRY START
;              50NS AFTER BGNT GOES ACTIVE ON DMA WRITE, AND LASTS UNTIL BGNT
;              OR BDAP50 GOES OFF (105NS MIN.}. THIS IS TO GIVE TIME FROM
;              GRANT OFF TO BMEM ON IN THE FOLLOWING CYCLE.
;110887 D JLB: BDRY GAN BE LOST IF BDRY50 IS NOT PRESENT AT THE TIME STATE
;              7 IN THE RAM CONTROL IS REACHED. HAPPENS WITH 1OMHZ DISK CONTR.
;              SINTRAN STOPS ON LEVEL 14 DURING STARTUP.

*/