aboutsummaryrefslogtreecommitdiffstats
path: root/techlibs/coolrunner2/cells_counter_map.v
blob: f9c44c80ff20bc7254b600b981c9b9349b1f26e0 (plain)
1
2
3
pre { line-height: 125%; margin: 0; }
td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #ffffff; }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { co
module \$__COUNT_ (CE, CLK, OUT, POUT, RST, UP);

    input wire CE;
    input wire CLK;
    output wire OUT;
    (* force_downto *)
    output wire[WIDTH-1:0] POUT;
    input wire RST;
    input wire UP;

    parameter COUNT_TO = 1;
    parameter RESET_MODE = "RISING";
    parameter RESET_TO_MAX = 0;
    parameter HAS_POUT = 0;
    parameter HAS_CE = 0;
    parameter WIDTH = 8;
    parameter DIRECTION = "DOWN";

    if (DIRECTION == "UP") begin
        if (WIDTH < 2) begin
            initial begin
                $display("ERROR: \$__COUNT_ must be at least 2 bits wide (bug in extract_counter pass?).");
                $finish;
            end
        end

        // FIXME: Max width?

        assign OUT = POUT == COUNT_TO;

        if (HAS_CE) begin
            genvar i;
            for (i = 0; i < WIDTH; i++) begin: countbits
                // each bit = (cur & !reset) ^ (all prev & !reset)
                wire xor_to_mc_bitn;
                FDCP #(
                    .INIT(0)
                ) bitn_ff (
                    .C(CLK),
                    .CLR(0),
                    .D(xor_to_mc_bitn),
                    .PRE(0),
                    .Q(POUT[i])
                );
                wire orterm_to_xor_bitn;
                wire pterm0_to_or_bitn;
                wire pterm1_to_or_bitn;
                MACROCELL_XOR #(
                    .INVERT_OUT(0)
                ) bitn_xor (
                    .IN_ORTERM(orterm_to_xor_bitn),
                    .IN_PTC(pterm1_to_or_bitn),
                    .OUT(xor_to_mc_bitn)
                );
                ORTERM #(
                    .WIDTH(1)
                ) bitn_or (
                    .IN(pterm0_to_or_bitn),
                    .OUT(orterm_to_xor_bitn)
                );
                ANDTERM #(
                    .COMP_INP(1),
                    .TRUE_INP(1)
                ) bitn_pterm0 (
                    .IN(POUT[i]),
                    .IN_B(OUT),
                    .OUT(pterm0_to_or_bitn)
                );
                ANDTERM #(
                    .COMP_INP(1),
                    .TRUE_INP(i + 1)
                ) bitn_pterm1 (
                    .IN({POUT[i-1:0], CE}),
                    .IN_B(OUT),
                    .OUT(pterm1_to_or_bitn)
                );
            end
        end else begin
            // Bit0 is special; toggle unless reset
            // cur  reset           out
            // 0    0               1
            // 0    1               0
            // 1    0               0
            // 1    1               0
            wire xor_to_mc_bit0;
            FDCP #(
                .INIT(0)
            ) bit0_ff (
                .C(CLK),
                .CLR(0),
                .D(xor_to_mc_bit0),
                .PRE(0),
                .Q(POUT[0])
            );
            wire pterm_to_xor_bit0;
            MACROCELL_XOR #(
                .INVERT_OUT(0)
            ) bit0_xor (
                .IN_PTC(pterm_to_xor_bit0),
                .OUT(xor_to_mc_bit0)
            );
            ANDTERM #(
                .COMP_INP(2),
                .TRUE_INP(0)
            ) bit0_pterm (
                .IN(),
                .IN_B({POUT[0], OUT}),
                .OUT(pterm_to_xor_bit0)
            );

            genvar i;
            for (i = 1; i < WIDTH; i++) begin: countbits
                // each bit = (cur & !reset) ^ (all prev & !reset)
                wire xor_to_mc_bitn;
                FDCP #(
                    .INIT(0)
                ) bitn_ff (
                    .C(CLK),
                    .CLR(0),
                    .D(xor_to_mc_bitn),
                    .PRE(0),
                    .Q(POUT[i])
                );
                wire orterm_to_xor_bitn;
                wire pterm0_to_or_bitn;
                wire pterm1_to_or_bitn;
                MACROCELL_XOR #(
                    .INVERT_OUT(0)
                ) bitn_xor (
                    .IN_ORTERM(orterm_to_xor_bitn),
                    .IN_PTC(pterm1_to_or_bitn),
                    .OUT(xor_to_mc_bitn)
                );
                ORTERM #(
                    .WIDTH(1)
                ) bitn_or (
                    .IN(pterm0_to_or_bitn),
                    .OUT(orterm_to_xor_bitn)
                );
                ANDTERM #(
                    .COMP_INP(1),
                    .TRUE_INP(1)
                ) bitn_pterm0 (
                    .IN(POUT[i]),
                    .IN_B(OUT),
                    .OUT(pterm0_to_or_bitn)
                );
                ANDTERM #(
                    .COMP_INP(1),
                    .TRUE_INP(i)
                ) bitn_pterm1 (
                    .IN(POUT[i-1:0]),
                    .IN_B(OUT),
                    .OUT(pterm1_to_or_bitn)
                );
            end
        end
    end

    // FIXME: down counters

endmodule