Skip to content

PAL_44803A

Source: Verilog/PAL/PAL_44803A.v

Where it sits (Simulation): ND120_TOP > ND120_CORE > ND3202D > MEM_43 > MEM_RAMC_50 > PAL_44803A - instance path: CORE.CPU_BOARD.MEM.RAMC.PAL_44803_URAMA

Used in: MEM_RAMC_50 (all tops)

Contains: no other modules.

Module hierarchy - All modules

PAL_44803A symbol

Schematic

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

Description

ND120 PALASM CODE CONVERTED TO VERILOG Component PAL 44803A Last reviewed: 14-DEC-2024 Ronny Hansen

Ports

Direction Width Name Description
input 1 CK Clock signal
input 1 OE_n (active low) OUTPUT ENABLE (active-low) for Q0-Q5
input 1 HOLD Freeze the register state (added 25-AUG-2026 for the
input 1 LOEN_n (active low) I0 - LOEN_n
input 1 RLRQ_n (active low) I1 - RLRQ_n
input 1 MR_n (active low) I2 - MR_n
input 1 CLRQ_n (active low) I3 - CLRQ_n
input 1 BLRQ50_n (active low) I4 - BLRQ50_n
input 1 SSEMA_n (active low) I5 - SSEMA_n
input 1 SEMRQ50_n (active low) I6 - SEMRQ50_n
output 1 RGNT_n (active low) Q0_n - RGNT_n
output 1 CGNT_n (active low) Q1_n - CGNT_n (CPU Grant)
output 1 BGNT_n (active low) Q2_n - BGNT_n (BUS Grant)
output 1 LOEN25_n (active low) Q3_n - LOEN25_n (n.c.)
output 1 LDR_n (active low) Q4_n - LDR_n (n.c.)
output 1 CSEM_n (active low) Q5_n - CSEM_n (n.c.)
output 1 BSEM_n (active low) Q6_n - BSEM_n (n.c.)
output 1 BCGNT25 Q7_n - BCGNT25

Verilog source

Verilog/PAL/PAL_44803A.v on GitHub.

Show the Verilog of PAL_44803A (164 lines)
/**********************************************************************************************************
** ND120 PALASM CODE CONVERTED TO VERILOG                                                                **
**                                                                                                       **
** Component PAL 44803A                                                                                  **
**                                                                                                       **
** Last reviewed: 14-DEC-2024                                                                            **
** Ronny Hansen                                                                                          **
***********************************************************************************************************/


// PAL16R8
// ADGD/13/8/86
// 44803A,5F,RAMA

//  RAM ARBITER

// PAL16R8 FAMILY
// PAL16R8 has 8 flip-flips, 8 inputs and 8 outputs (negated from flip-flops with 3-state support)

// https://rocelec.widen.net/view/pdf/c6dwcslffz/VANTS00080-1.pdf



// PCB 3202D sheet 50:
//
// PAL input signal PD1 is connected to PAL OE_n pin
//     input signal OSC is connectec to PAL CK pin

module PAL_44803A (
    input CK,   //! Clock signal
    input OE_n, //! OUTPUT ENABLE (active-low) for Q0-Q5
    input HOLD, //! Freeze the register state (added 25-AUG-2026 for the
                //! MAIN_RAM_DDR2 backend: MEM_RAM_49_DDR2 stretches a memory
                //! cycle on a cache miss by holding this PAL and PAL_44902A;
                //! the CPU waits via CGNTCACT_n, DMA via BDRY_n). Tie 0 for
                //! the original fixed-length behaviour.

    input LOEN_n,    //! I0 - LOEN_n
    input RLRQ_n,    //! I1 - RLRQ_n
    input MR_n,      //! I2 - MR_n
    input CLRQ_n,    //! I3 - CLRQ_n
    input BLRQ50_n,  //! I4 - BLRQ50_n
    input SSEMA_n,   //! I5 - SSEMA_n
    input SEMRQ50_n, //! I6 - SEMRQ50_n
    //  input n.c ,         //! I7 - n.c.

    output RGNT_n,    //! Q0_n - RGNT_n
    output CGNT_n,    //! Q1_n - CGNT_n (CPU Grant)
    output BGNT_n,    //! Q2_n - BGNT_n (BUS Grant)
    output LOEN25_n,  //! Q3_n - LOEN25_n (n.c.)
    output LDR_n,     //! Q4_n - LDR_n (n.c.)
    output CSEM_n,    //! Q5_n - CSEM_n (n.c.)
    output BSEM_n,    //! Q6_n - BSEM_n (n.c.)
    output BCGNT25    //! Q7_n - BCGNT25
);


  // Internal registers
  reg  RGNT_reg;
  reg  CGNT_reg;
  reg  BGNT_reg;
  reg  LDR_reg;
  reg  CSEM_reg;
  reg  BSEM_reg;
  reg  LOEN25_reg;
  reg  BCGNT25_n_reg;


  // negated input signals
  wire LOEN = ~LOEN_n;
  wire RLRQ = ~RLRQ_n;
  wire CLRQ = ~CLRQ_n;
  wire BLRQ50 = ~BLRQ50_n;
  wire SSEMA = ~SSEMA_n;
  wire SEMRQ50 = ~SEMRQ50_n;


  // Register signals as wires (to help with the equations)
  wire RGNT = RGNT_reg;
  wire CGNT = CGNT_reg;
  wire BGNT = BGNT_reg;
  wire LDR = LDR_reg;
  wire CSEM = CSEM_reg;
  wire BSEM = BSEM_reg;
  wire LOEN25 = LOEN25_reg;




  //**** Sequential logic triggered on the rising edge of CLK ****
  always @(posedge CK) if (!HOLD) begin

    RGNT_reg <=   (RLRQ & CSEM_n & BSEM_n & RGNT_n & CGNT_n & BGNT_n)  // RLRQ HIGEST PRIORITY
                | (RGNT & LOEN_n & LOEN25_n)                           // HOLD TO END OF DRAM CYCLE
                | (RGNT & LOEN & LOEN25)
                | (RGNT & LOEN & LOEN25_n);

    CGNT_reg <=   (MR_n & CSEM_n & BSEM_n & CLRQ & BLRQ50_n & RLRQ_n & RGNT_n & CGNT_n & BGNT_n) // CLRQ ALONE
                | (MR_n & CSEM_n & BSEM_n & LDR & RLRQ_n & CLRQ & RGNT_n & CGNT_n & BGNT_n)      // CLRQ * LAST DONE REFRESH
                | (MR_n & CSEM & BSEM_n & CLRQ & RGNT_n & CGNT_n & BGNT_n)                       // CLRQ WITH SEMAPHORE
                | (CGNT & LOEN_n & LOEN25_n & MR_n)
                | (CGNT & LOEN & LOEN25 & MR_n)
                | (CGNT & LOEN & LOEN25_n & MR_n);

    BGNT_reg <=   (MR_n & CSEM_n & BSEM_n & RLRQ_n & CLRQ_n & BLRQ50 & RGNT_n & CGNT_n & BGNT_n)  // BLRQ ALONE
                | (MR_n & CSEM_n & BSEM_n & LDR_n & RLRQ_n & BLRQ50 & RGNT_n & CGNT_n & BGNT_n)   // BLRQ * N..?
                | (MR_n & CSEM_n & BSEM & BLRQ50 & RGNT_n & CGNT_n & BGNT_n)                      // BLRQ WITH ..?
                | (BGNT & LOEN_n & LOEN25_n & MR_n)
                | (BGNT & LOEN & LOEN25 & MR_n)
                | (BGNT & LOEN & LOEN25_n & MR_n);

    LDR_reg <=     RGNT                     // SET ON REFRESH
                | (LDR & CGNT_n & BGNT_n);  // HOLD UNTIL NEXT B OR C-GNT

    CSEM_reg <=   (MR_n & SSEMA & CGNT)                 // SET ON SSEMA
                | (MR_n & CSEM & LOEN25 & LOEN)         // HOLD UNTIL END OF 2ND. CGNT
                | (MR_n & CSEM & LOEN25 & LOEN_n)
                | (MR_n & CSEM & LOEN25_n & LOEN_n);

    BSEM_reg <=   (MR_n & SEMRQ50 & BGNT)              // SET ON SEMRQ50*BGNT
                | (MR_n & BSEM & LOEN25 & LOEN)        // HOLD UNTIL END OF 2ND. BGNT
                | (MR_n & BSEM & LOEN25 & LOEN_n)
                | (MR_n & BSEM & LOEN25_n & LOEN_n);

    LOEN25_reg <= LOEN;

    BCGNT25_n_reg <= BGNT_n & CGNT_n;

  end

  // Tri-state control for Q outputs
  // Assigning outputs with three-state logic controlled by OE_n

  assign RGNT_n   = OE_n ? 1'b0 : ~RGNT_reg;
  assign CGNT_n   = OE_n ? 1'b0 : ~CGNT_reg;
  assign BGNT_n   = OE_n ? 1'b0 : ~BGNT_reg;
  assign LDR_n    = OE_n ? 1'b0 : ~LDR_reg;
  assign CSEM_n   = OE_n ? 1'b0 : ~CSEM_reg;
  assign BSEM_n   = OE_n ? 1'b0 : ~BSEM_reg;
  assign LOEN25_n = OE_n ? 1'b0 : ~LOEN25_reg;
  assign BCGNT25  = OE_n ? 1'b0 : ~BCGNT25_n_reg;



endmodule

/*

DESCRIPTION

PRIORITY:   1.REFRESH
            2.CPU * LAST DONE REFRESH
            3.BUS
            4.CPU

; 270387 CJUTC: INCREASE PERIOD BETWEEN SUCCESSIVE GRANTS BY 25NS BY
; INTRODUCING NEW SIGNAL MFREE25~ AND NOT GRANTING ANYTHING UNTIL
; THIS IS TRUE
; 020487 JLB: MFREE NOT NEEDED, BUT TO AVIOD POWER UP PROBLEMS MCL ADDED.
;
; 180587 M3202B

*/