Skip to content

M169C_EN

Source: Verilog/Shared/ndlib/M169C_EN.v

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

Used in: CGA_MIC (all tops)

Contains: AND_GATE x17, AND_GATE_3_INPUTS x2, AND_GATE_4_INPUTS, AND_GATE_6_INPUTS x2, D_FLIPFLOP_EN x4, NOR_GATE x9, XOR_GATE_ONEHOT x4

Module hierarchy - All modules

M169C_EN symbol

Schematic

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

M169C_EN schematic

Description

ND120 Shared M169C_EN - M169C (74LS169 synchronous 4-bit up/down binary counter) with an optional clock-enable mode. USE_ENABLE=0 (default): wraps the original M169C - posedge CP, original behaviour. USE_ENABLE=1: posedge sysclk, counts when EN is high (P2 clock- domain conversion mode - see SCAN_FF_EN.v / the plan doc). This branch is a STRUCTURAL COPY of the original M169C body - every gate and wire identical - with only the four internal flops swapped from D_FLIPFLOP #(.InvertClockEnable(0)) to D_FLIPFLOP_EN #(.USE_ENABLE(1)) (default ASYNC_RESET=0; the originals tie preset/reset to 0 and tick to 1, preserved here). The CON output logic stays gate-identical. The CP pin is routed to the flops' (unused-in-mode-1) clock pins. https://www.ti.com/lit/ds/symlink/sn74als169b.pdf Last reviewed: 10-JUL-2026 Ronny Hansen

Parameters

Parameter Default
USE_ENABLE 0

Ports

Direction Width Name Description
input 1 sysclk FPGA system clock (used only when USE_ENABLE=1)
input 1 EN Clock enable (used only when USE_ENABLE=1)
input 1 A Input A
input 1 B Input B
input 1 C Input C
input 1 D Input D
input 1 CP Clock Pulse (used only when USE_ENABLE=0)
input 1 NL Load Next
input 1 PN Enable P
input 1 TN Enable T
input 1 UP Up/Down (1=Up, 0=Down)
output 1 CON Count is Zero
output 1 QA Output A
output 1 QB Output B
output 1 QC Output C
output 1 QD Output D

Verilog source

Verilog/Shared/ndlib/M169C_EN.v on GitHub.

Show the Verilog of M169C_EN (532 lines)
/**************************************************************************
** ND120 Shared                                                          **
**                                                                       **
** M169C_EN - M169C (74LS169 synchronous 4-bit up/down binary counter)   **
** with an optional clock-enable mode.                                   **
**                                                                       **
** USE_ENABLE=0 (default): wraps the original M169C - posedge CP,        **
**   original behaviour.                                                 **
** USE_ENABLE=1: posedge sysclk, counts when EN is high (P2 clock-       **
**   domain conversion mode - see SCAN_FF_EN.v / the plan doc). This     **
**   branch is a STRUCTURAL COPY of the original M169C body - every      **
**   gate and wire identical - with only the four internal flops         **
**   swapped from D_FLIPFLOP #(.InvertClockEnable(0)) to                 **
**   D_FLIPFLOP_EN #(.USE_ENABLE(1)) (default ASYNC_RESET=0; the         **
**   originals tie preset/reset to 0 and tick to 1, preserved here).     **
**   The CON output logic stays gate-identical. The CP pin is routed     **
**   to the flops' (unused-in-mode-1) clock pins.                        **
**                                                                       **
** https://www.ti.com/lit/ds/symlink/sn74als169b.pdf                     **
**                                                                       **
** Last reviewed: 10-JUL-2026                                            **
** Ronny Hansen                                                          **
***************************************************************************/

module M169C_EN #(
    parameter integer USE_ENABLE = 0
) (
    input sysclk,  //! FPGA system clock (used only when USE_ENABLE=1)
    input EN,      //! Clock enable    (used only when USE_ENABLE=1)

    input A,   //! Input A
    input B,   //! Input B
    input C,   //! Input C
    input D,   //! Input D
    input CP,  //! Clock Pulse (used only when USE_ENABLE=0)
    input NL,  //! Load Next
    input PN,  //! Enable P
    input TN,  //! Enable T
    input UP,  //! Up/Down (1=Up, 0=Down)

    output CON,  //! Count is Zero
    output QA,   //! Output A
    output QB,   //! Output B
    output QC,   //! Output C
    output QD    //! Output D
);

  generate
    if (USE_ENABLE == 1) begin : gen_enable

      /*******************************************************************************
       ** The wires are defined here (structural copy of M169C)                     **
       *******************************************************************************/
      wire s_a;
      wire s_b;
      wire s_c;
      wire s_con_out;
      wire s_cp;
      wire s_d;
      wire s_gates27_out;
      wire s_ff_out_qc;
      wire s_gates24_out;
      wire s_qd_nl;
      wire s_ff_out_qb;
      wire s_gates18_out;
      wire s_qb_zero;
      wire s_gates15_out;
      wire s_gates22_out;
      wire s_gates33_out;
      wire s_gates12_out;
      wire s_ff_out_qd;
      wire s_gates7_out;
      wire s_gates19_out;
      wire s_qan_up;
      wire s_ff_qa_q;
      wire s_gates13_out;
      wire s_gates26_out;
      wire s_gates5_out;
      wire s_gates28_n_out;
      wire s_gates35_out;
      wire s_gates16_out;
      wire s_gates17_out;
      wire s_qa_zero;
      wire s_gates30_n_out;
      wire s_qc_zero;
      wire s_qa_down;
      wire s_qd_zero;
      wire s_gates3_out;
      wire s_gates28_out;
      wire s_qa_nl;
      wire s_gates14_out;
      wire s_gates25_out;
      wire s_qc_nl;
      wire s_gates32_out;
      wire s_gates30_out;
      wire s_gates29_n_out;
      wire s_gates23_out;
      wire s_gates31_n_out;
      wire s_gates29_out;
      wire s_qb_nl;
      wire s_gates31_out;
      wire s_nl_n;
      wire s_nl;
      wire s_p_n;
      wire s_ff_qa_qn;
      wire s_qa_out;
      wire s_qb_n_out;
      wire s_qb_out;
      wire s_qc_n_out;
      wire s_qc_out;
      wire s_qd_n_out;
      wire s_qd_out;
      wire s_t_n;
      wire s_t;
      wire s_up_n;
      wire s_up;

      /*******************************************************************************
       ** Here all input connections are defined                                     **
       *******************************************************************************/
      assign s_a             = A;
      assign s_b             = B;
      assign s_c             = C;
      assign s_d             = D;
      assign s_cp            = CP;
      assign s_nl            = NL;
      assign s_p_n           = PN;
      assign s_t_n           = TN;
      assign s_up            = UP;

      /*******************************************************************************
       ** Here all output connections are defined                                    **
       *******************************************************************************/
      assign CON             = s_con_out;
      assign QA              = s_qa_out;
      assign QB              = s_qb_out;
      assign QC              = s_qc_out;
      assign QD              = s_qd_out;

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

      // NOT Gate
      assign s_gates28_n_out = ~s_gates28_out;
      assign s_gates29_n_out = ~s_gates29_out;
      assign s_gates30_n_out = ~s_gates30_out;
      assign s_gates31_n_out = ~s_gates31_out;
      assign s_qa_out        = ~s_ff_qa_qn;
      assign s_qb_out        = ~s_qb_n_out;
      assign s_qc_out        = ~s_qc_n_out;
      assign s_qd_out        = ~s_qd_n_out;
      assign s_up_n          = ~s_up;
      assign s_t             = ~s_t_n;
      assign s_nl_n          = ~s_nl;

      /*******************************************************************************
       ** Here all normal components are defined                                     **
       *******************************************************************************/
      AND_GATE #(
          .BubblesMask(2'b00)
      ) AND_QA_NL (
          .input1(s_ff_qa_q),
          .input2(s_nl),
          .result(s_qa_nl)
      );

      AND_GATE #(
          .BubblesMask(2'b00)
      ) AND_QB_NL (
          .input1(s_ff_out_qb),
          .input2(s_nl),
          .result(s_qb_nl)
      );

      AND_GATE #(
          .BubblesMask(2'b00)
      ) AND_QC_NL (
          .input1(s_ff_out_qc),
          .input2(s_nl),
          .result(s_qc_nl)
      );

      AND_GATE #(
          .BubblesMask(2'b00)
      ) AND_QD_NL (
          .input1(s_ff_out_qd),
          .input2(s_nl),
          .result(s_qd_nl)
      );


      AND_GATE #(
          .BubblesMask(2'b00)
      ) GATES_3 (
          .input1(s_gates35_out),
          .input2(s_qa_zero),
          .result(s_gates3_out)
      );


      AND_GATE_3_INPUTS #(
          .BubblesMask(3'b000)
      ) GATES_5 (
          .input1(s_gates35_out),
          .input2(s_qa_zero),
          .input3(s_qb_zero),
          .result(s_gates5_out)
      );



      AND_GATE_4_INPUTS #(
          .BubblesMask(4'h0)
      ) GATES_7 (
          .input1(s_gates35_out),
          .input2(s_qa_zero),
          .input3(s_qb_zero),
          .input4(s_qc_zero),
          .result(s_gates7_out)
      );

      NOR_GATE #(
          .BubblesMask(2'b00)
      ) GATES_8 (
          .input1(s_qan_up),
          .input2(s_qa_down),
          .result(s_qa_zero)   // QA is zero
      );

      NOR_GATE #(
          .BubblesMask(2'b00)
      ) GATES_9 (
          .input1(s_gates22_out),
          .input2(s_gates23_out),
          .result(s_qb_zero)
      );

      NOR_GATE #(
          .BubblesMask(2'b00)
      ) GATES_10 (
          .input1(s_gates24_out),
          .input2(s_gates25_out),
          .result(s_qc_zero)
      );

      NOR_GATE #(
          .BubblesMask(2'b00)
      ) GATES_11 (
          .input1(s_gates26_out),
          .input2(s_gates27_out),
          .result(s_qd_zero)
      );

      XOR_GATE_ONEHOT #(
          .BubblesMask(2'b00)
      ) GATES_12 (
          .input1(s_qa_nl),
          .input2(s_gates35_out),
          .result(s_gates12_out)
      );

      AND_GATE #(
          .BubblesMask(2'b00)
      ) GATES_13 (
          .input1(s_nl_n),
          .input2(s_a),
          .result(s_gates13_out)
      );

      XOR_GATE_ONEHOT #(
          .BubblesMask(2'b00)
      ) GATES_14 (
          .input1(s_qb_nl),
          .input2(s_gates3_out),
          .result(s_gates14_out)
      );

      AND_GATE #(
          .BubblesMask(2'b00)
      ) GATES_15 (
          .input1(s_nl_n),
          .input2(s_b),
          .result(s_gates15_out)
      );

      XOR_GATE_ONEHOT #(
          .BubblesMask(2'b00)
      ) GATES_16 (
          .input1(s_qc_nl),
          .input2(s_gates5_out),
          .result(s_gates16_out)
      );

      AND_GATE #(
          .BubblesMask(2'b00)
      ) GATES_17 (
          .input1(s_nl_n),
          .input2(s_c),
          .result(s_gates17_out)
      );

      XOR_GATE_ONEHOT #(
          .BubblesMask(2'b00)
      ) GATES_18 (
          .input1(s_qd_nl),
          .input2(s_gates7_out),
          .result(s_gates18_out)
      );

      AND_GATE #(
          .BubblesMask(2'b00)
      ) GATES_19 (
          .input1(s_nl_n),
          .input2(s_d),
          .result(s_gates19_out)
      );

      AND_GATE #(
          .BubblesMask(2'b00)
      ) AND_QAN_UP (
          .input1(s_up),
          .input2(s_ff_qa_qn),
          .result(s_qan_up)
      );

      AND_GATE #(
          .BubblesMask(2'b00)
      ) AND_QA_UPN (  // AND_QA_UPN
          .input1(s_up_n),
          .input2(s_ff_qa_q),
          .result(s_qa_down)
      );

      AND_GATE #(
          .BubblesMask(2'b00)
      ) GATES_22 (
          .input1(s_up),
          .input2(s_qb_n_out),
          .result(s_gates22_out)
      );

      AND_GATE #(
          .BubblesMask(2'b00)
      ) GATES_23 (
          .input1(s_up_n),
          .input2(s_ff_out_qb),
          .result(s_gates23_out)
      );

      AND_GATE #(
          .BubblesMask(2'b00)
      ) GATES_24 (
          .input1(s_up),
          .input2(s_qc_n_out),
          .result(s_gates24_out)
      );

      AND_GATE #(
          .BubblesMask(2'b00)
      ) GATES_25 (
          .input1(s_up_n),
          .input2(s_ff_out_qc),
          .result(s_gates25_out)
      );

      AND_GATE #(
          .BubblesMask(2'b00)
      ) GATES_26 (
          .input1(s_up),
          .input2(s_qd_n_out),
          .result(s_gates26_out)
      );

      AND_GATE #(
          .BubblesMask(2'b00)
      ) GATES_27 (
          .input1(s_up_n),
          .input2(s_ff_out_qd),
          .result(s_gates27_out)
      );

      NOR_GATE #(
          .BubblesMask(2'b00)
      ) GATES_28 (
          .input1(s_gates12_out),
          .input2(s_gates13_out),
          .result(s_gates28_out)
      );

      NOR_GATE #(
          .BubblesMask(2'b00)
      ) GATES_29 (
          .input1(s_gates14_out),
          .input2(s_gates15_out),
          .result(s_gates29_out)
      );

      NOR_GATE #(
          .BubblesMask(2'b00)
      ) GATES_30 (
          .input1(s_gates16_out),
          .input2(s_gates17_out),
          .result(s_gates30_out)
      );

      NOR_GATE #(
          .BubblesMask(2'b00)
      ) GATES_31 (
          .input1(s_gates18_out),
          .input2(s_gates19_out),
          .result(s_gates31_out)
      );

      AND_GATE_6_INPUTS #(
          .BubblesMask({2'b00, 4'h0})
      ) GATES_32 (
          .input1(s_qd_zero),
          .input2(s_qc_zero),
          .input3(s_qb_zero),
          .input4(s_qa_zero),
          .input5(s_t),
          .input6(s_up),
          .result(s_gates32_out)
      );

      AND_GATE_6_INPUTS #(
          .BubblesMask({2'b00, 4'h0})
      ) GATES_33 (
          .input1(s_up_n),
          .input2(s_t),
          .input3(s_qa_zero),
          .input4(s_qb_zero),
          .input5(s_qc_zero),
          .input6(s_qd_zero),
          .result(s_gates33_out)
      );

      NOR_GATE #(
          .BubblesMask(2'b00)
      ) GATES_34 (
          .input1(s_gates32_out),
          .input2(s_gates33_out),
          .result(s_con_out)
      );

      AND_GATE_3_INPUTS #(
          .BubblesMask(3'b111)
      ) GATES_35 (
          .input1(s_p_n),
          .input2(s_t_n),
          .input3(s_nl_n),
          .result(s_gates35_out)
      );

      // The four internal flops, swapped to D_FLIPFLOP_EN in mode 1.
      // Originals were D_FLIPFLOP #(.InvertClockEnable(0)) with
      // preset/reset tied 0 and tick tied 1 (D_FLIPFLOP_EN defaults:
      // ASYNC_RESET=0; its mode-0 branch also uses InvertClockEnable(0)).
      // The clock pin (s_cp) is unused inside D_FLIPFLOP_EN when
      // USE_ENABLE=1 and is lint-waived there.
      D_FLIPFLOP_EN #(
          .USE_ENABLE(1)
      ) MEMORY_36 (
          .sysclk(sysclk),
          .EN(EN),
          .clock(s_cp),
          .d(s_gates28_n_out),
          .preset(1'b0),
          .q(s_ff_qa_q),
          .qBar(s_ff_qa_qn),
          .reset(1'b0),
          .tick(1'b1)
      );

      D_FLIPFLOP_EN #(
          .USE_ENABLE(1)
      ) MEMORY_37 (
          .sysclk(sysclk),
          .EN(EN),
          .clock(s_cp),
          .d(s_gates29_n_out),
          .preset(1'b0),
          .q(s_ff_out_qb),
          .qBar(s_qb_n_out),
          .reset(1'b0),
          .tick(1'b1)
      );

      D_FLIPFLOP_EN #(
          .USE_ENABLE(1)
      ) MEMORY_38 (
          .sysclk(sysclk),
          .EN(EN),
          .clock(s_cp),
          .d(s_gates30_n_out),
          .preset(1'b0),
          .q(s_ff_out_qc),
          .qBar(s_qc_n_out),
          .reset(1'b0),
          .tick(1'b1)
      );

      D_FLIPFLOP_EN #(
          .USE_ENABLE(1)
      ) MEMORY_39 (
          .sysclk(sysclk),
          .EN(EN),
          .clock(s_cp),
          .d(s_gates31_n_out),
          .preset(1'b0),
          .q(s_ff_out_qd),
          .qBar(s_qd_n_out),
          .reset(1'b0),
          .tick(1'b1)
      );

    end else begin : gen_orig
      /* verilator lint_off UNUSEDSIGNAL */
      wire unused_sys = sysclk & EN;
      /* verilator lint_on UNUSEDSIGNAL */
      M169C CNT (
          .A(A), .B(B), .C(C), .D(D),
          .CP(CP),
          .NL(NL), .PN(PN), .TN(TN), .UP(UP),
          .CON(CON),
          .QA(QA), .QB(QB), .QC(QC), .QD(QD)
      );
    end
  endgenerate

endmodule