Skip to content

CGA_MIC_WCAREG

Source: Verilog/DELILAH-CPU/CGA_MIC/circuit/CGA_MIC_WCAREG.v

Where it sits (Simulation): ND120_TOP > ND120_CORE > ND3202D > CPU_15 > CPU_PROC_32 > CPU_PROC_CGA_33 > CGA > CGA_MIC > CGA_MIC_WCAREG - instance path: CORE.CPU_BOARD.CPU.PROC.CGA.DELILAH.MIC.MIC_WCAREG

Used in: CGA_MIC (all tops)

Contains: NOR_GATE, SCAN_FF_EN x14

Module hierarchy - All modules

CGA_MIC_WCAREG symbol

Schematic

Drawn from the Verilog: the yosys netlist of the Simulation (Verilator) build, instance CORE.CPU_BOARD.CPU.PROC.CGA.DELILAH.MIC.MIC_WCAREG. 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).

CGA_MIC_WCAREG schematic

Description

ND120 CGA (CPU Gate Array / DELILAH) /CGA/MIC/WCAREG WCAREG Page 21 SHEET 1 of 1 Last reviewed: 02-FEB-2025 Ronny Hansen

Ports

Direction Width Name Description
input 1 sysclk FPGA system clock (P2: MCLK_EN capture)
input 1 MCLK_EN MCLK clock-enable pulse (FPGA_FF_MODE, else 0)
input [15:0] CD_15_0 Data bus for communication (from CGA_MIC.CD_15_0)
input 1 LCSN Internal Load Control Store (negated) (from CGA_MIC.ILCSN)
input 1 LWCAN Latch WCA (from CGA_MIC.LWCAN)
input 1 MCLK Main clock signal (from CGA_MIC.MCLK)
output [12:0] WCA_12_0 Write Control Store Address - 13-bit address for writing to control store (to CGA_MIC_IPOS.WCA_12_0)
output 1 WCSN Write control signal not (to CGA_MIC.WCSN)

Verilog source

Verilog/DELILAH-CPU/CGA_MIC/circuit/CGA_MIC_WCAREG.v on GitHub.

Show the Verilog of CGA_MIC_WCAREG (259 lines)
/**************************************************************************
** ND120 CGA (CPU Gate Array / DELILAH)                                  **
** /CGA/MIC/WCAREG                                                       **
** WCAREG                                                                **
**                                                                       **
** Page 21                                                               **
** SHEET 1 of 1                                                          **
**                                                                       **
** Last reviewed: 02-FEB-2025                                            **
** Ronny Hansen                                                          **
***************************************************************************/

module CGA_MIC_WCAREG (
    input        sysclk,   //! FPGA system clock (P2: MCLK_EN capture)
    input        MCLK_EN,  //! MCLK clock-enable pulse (FPGA_FF_MODE, else 0)

    input [15:0] CD_15_0,  //! Data bus for communication (from CGA_MIC.CD_15_0)
    input        LCSN,     //! Internal Load Control Store (negated) (from CGA_MIC.ILCSN)
    input        LWCAN,    //! Latch WCA (from CGA_MIC.LWCAN)
    input        MCLK,     //! Main clock signal (from CGA_MIC.MCLK)

    output [12:0] WCA_12_0,  //! Write Control Store Address - 13-bit address for writing to control store (to CGA_MIC_IPOS.WCA_12_0)
    output        WCSN     //! Write control signal not (to CGA_MIC.WCSN)
);

  /*******************************************************************************
   ** The wires are defined here                                                 **
   *******************************************************************************/
  wire [15:0] s_cd_15_0;
  wire [12:0] s_wca_12_0_out;
  wire        s_lcs_n;
  wire        s_lwca_n;
  wire        s_lwca;
  wire        s_mclk;
  wire        s_wca13_n;
  wire        s_wcs_n_out;
  wire        s_wcsnff_out_q;

  /*******************************************************************************
   ** Here all input connections are defined                                     **
   *******************************************************************************/
  assign s_cd_15_0[15:0] = CD_15_0;
  assign s_mclk          = MCLK;
  assign s_lcs_n         = LCSN;
  assign s_lwca_n        = LWCAN;

  // P2 (docs/plan-fix-unconstrained-clocks.md): in FF mode the MCLK-
  // clocked registers capture on posedge sysclk gated by MCLK_EN
  // (aligned to the MCLK rise) instead of clocking on the routed net.
`ifdef FPGA_FF_MODE
  localparam MCLK_CE = 1;
`else
  localparam MCLK_CE = 0;
`endif

  // Code to make LINTER _not_ complain about bits not read in CD bits 1:0
  (* keep = "true", DONT_TOUCH = "true" *) wire [1:0] unused_CD_bits;
  assign unused_CD_bits[1:0] = s_cd_15_0[1:0];


  /*******************************************************************************
   ** Here all output connections are defined                                    **
   *******************************************************************************/
  assign WCA_12_0        = s_wca_12_0_out[12:0];
  assign WCSN            = s_wcs_n_out;

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

  // NOT Gate
  assign s_lwca          = ~s_lwca_n;

  /*******************************************************************************
   ** Here all normal components are defined                                     **
   *******************************************************************************/
  NOR_GATE #(
      .BubblesMask(2'b11)
  ) GATES_1 (
      .input1(s_wca13_n),
      .input2(s_lcs_n),
      .result(s_wcs_n_out)
  );


  /*******************************************************************************
   ** Here all sub-circuits are defined                                          **
   *******************************************************************************/
  // MCLK domain: clocked on posedge s_mclk
  SCAN_FF_EN #(.USE_ENABLE(MCLK_CE)) WCAFF12 (
      .sysclk(sysclk),
      .EN(MCLK_EN),
      .CLK(s_mclk),
      .D  (s_wca_12_0_out[12]),
      .Q  (s_wca_12_0_out[12]),
      .QN (),
      .TE (s_lwca),
      .TI (s_cd_15_0[14])
  );

  // MCLK domain: clocked on posedge s_mclk
  SCAN_FF_EN #(.USE_ENABLE(MCLK_CE)) WCAFF11 (
      .sysclk(sysclk),
      .EN(MCLK_EN),
      .CLK(s_mclk),
      .D  (s_wca_12_0_out[11]),
      .Q  (s_wca_12_0_out[11]),
      .QN (),
      .TE (s_lwca),
      .TI (s_cd_15_0[13])
  );

  // MCLK domain: clocked on posedge s_mclk
  SCAN_FF_EN #(.USE_ENABLE(MCLK_CE)) WCAFF10 (
      .sysclk(sysclk),
      .EN(MCLK_EN),
      .CLK(s_mclk),
      .D  (s_wca_12_0_out[10]),
      .Q  (s_wca_12_0_out[10]),
      .QN (),
      .TE (s_lwca),
      .TI (s_cd_15_0[12])
  );

  // MCLK domain: clocked on posedge s_mclk
  SCAN_FF_EN #(.USE_ENABLE(MCLK_CE)) WCAFF9 (
      .sysclk(sysclk),
      .EN(MCLK_EN),
      .CLK(s_mclk),
      .D  (s_wca_12_0_out[9]),
      .Q  (s_wca_12_0_out[9]),
      .QN (),
      .TE (s_lwca),
      .TI (s_cd_15_0[11])
  );

  // MCLK domain: clocked on posedge s_mclk
  SCAN_FF_EN #(.USE_ENABLE(MCLK_CE)) WCAFF8 (
      .sysclk(sysclk),
      .EN(MCLK_EN),
      .CLK(s_mclk),
      .D  (s_wca_12_0_out[8]),
      .Q  (s_wca_12_0_out[8]),
      .QN (),
      .TE (s_lwca),
      .TI (s_cd_15_0[10])
  );

  // MCLK domain: clocked on posedge s_mclk
  SCAN_FF_EN #(.USE_ENABLE(MCLK_CE)) WCAFF7 (
      .sysclk(sysclk),
      .EN(MCLK_EN),
      .CLK(s_mclk),
      .D  (s_wca_12_0_out[7]),
      .Q  (s_wca_12_0_out[7]),
      .QN (),
      .TE (s_lwca),
      .TI (s_cd_15_0[9])
  );

  // MCLK domain: clocked on posedge s_mclk
  SCAN_FF_EN #(.USE_ENABLE(MCLK_CE)) WCAFF6 (
      .sysclk(sysclk),
      .EN(MCLK_EN),
      .CLK(s_mclk),
      .D  (s_wca_12_0_out[6]),
      .Q  (s_wca_12_0_out[6]),
      .QN (),
      .TE (s_lwca),
      .TI (s_cd_15_0[8])
  );

  // MCLK domain: clocked on posedge s_mclk
  SCAN_FF_EN #(.USE_ENABLE(MCLK_CE)) WCAFF5 (
      .sysclk(sysclk),
      .EN(MCLK_EN),
      .CLK(s_mclk),
      .D  (s_wca_12_0_out[5]),
      .Q  (s_wca_12_0_out[5]),
      .QN (),
      .TE (s_lwca),
      .TI (s_cd_15_0[7])
  );

  // MCLK domain: clocked on posedge s_mclk
  SCAN_FF_EN #(.USE_ENABLE(MCLK_CE)) WCAFF4 (
      .sysclk(sysclk),
      .EN(MCLK_EN),
      .CLK(s_mclk),
      .D  (s_wca_12_0_out[4]),
      .Q  (s_wca_12_0_out[4]),
      .QN (),
      .TE (s_lwca),
      .TI (s_cd_15_0[6])
  );

  // MCLK domain: clocked on posedge s_mclk
  SCAN_FF_EN #(.USE_ENABLE(MCLK_CE)) WCAFF3 (
      .sysclk(sysclk),
      .EN(MCLK_EN),
      .CLK(s_mclk),
      .D  (s_wca_12_0_out[3]),
      .Q  (s_wca_12_0_out[3]),
      .QN (),
      .TE (s_lwca),
      .TI (s_cd_15_0[5])
  );

  // MCLK domain: clocked on posedge s_mclk
  SCAN_FF_EN #(.USE_ENABLE(MCLK_CE)) WCAFF2 (
      .sysclk(sysclk),
      .EN(MCLK_EN),
      .CLK(s_mclk),
      .D  (s_wca_12_0_out[2]),
      .Q  (s_wca_12_0_out[2]),
      .QN (),
      .TE (s_lwca),
      .TI (s_cd_15_0[4])
  );

  // MCLK domain: clocked on posedge s_mclk
  SCAN_FF_EN #(.USE_ENABLE(MCLK_CE)) WCAFF1 (
      .sysclk(sysclk),
      .EN(MCLK_EN),
      .CLK(s_mclk),
      .D  (s_wca_12_0_out[1]),
      .Q  (s_wca_12_0_out[1]),
      .QN (),
      .TE (s_lwca),
      .TI (s_cd_15_0[3])
  );

  // MCLK domain: clocked on posedge s_mclk
  SCAN_FF_EN #(.USE_ENABLE(MCLK_CE)) WCAFF0 (
      .sysclk(sysclk),
      .EN(MCLK_EN),
      .CLK(s_mclk),
      .D  (s_wca_12_0_out[0]),
      .Q  (s_wca_12_0_out[0]),
      .QN (),
      .TE (s_lwca),
      .TI (s_cd_15_0[2])
  );

  // MCLK domain: clocked on posedge s_mclk
  SCAN_FF_EN #(.USE_ENABLE(MCLK_CE)) WCSNFF (
      .sysclk(sysclk),
      .EN(MCLK_EN),
      .CLK(s_mclk),
      .D  (s_wcsnff_out_q),
      .Q  (s_wcsnff_out_q),
      .QN (s_wca13_n),
      .TE (s_lwca),
      .TI (s_cd_15_0[15])
  );



endmodule