// Copyright (C) 1991-2006 Altera Corporation
 
// Your use of Altera Corporation's design tools, logic functions 
 
// and other software and tools, and its AMPP partner logic 
 
// functions, and any output files from any of the foregoing 
 
// (including device programming or simulation files), and any 
 
// associated documentation or information are expressly subject 
 
// to the terms and conditions of the Altera Program License 
 
// Subscription Agreement, Altera MegaCore Function License 
 
// Agreement, or other applicable license agreement, including, 
 
// without limitation, that your use is for the sole purpose of 
 
// programming logic devices manufactured by Altera and sold by 
 
// Altera or its authorized distributors.  Please refer to the 
 
// applicable agreement for further details.
 
 
 
 
 
// Quartus II 6.1 Build 201 11/27/2006
 
 
 
 
 
///////////////////////////////////////////////////////////////////////////////
 
//
 
//                      FLEX10KE LCELL ATOM 
 
//  
 
//  Supports lut_mask, does not support equations. 
 
//  Support normal, arithmetic, updown counter and iclrable counter mode. 
 
//  parameter output_mode is informational only and has no simulation function. 
 
//  No checking is done for validation of parameters passed from top level. 
 
//  Input default values are implemented using tri1 and tri0 net. 
 
//
 
///////////////////////////////////////////////////////////////////////////////
 
 
 
`timescale 1 ps/1 ps
 
module  flex10ke_asynch_lcell (dataa, datab, datac, datad,
 
                      cin, cascin, qfbkin,
 
                      combout, regin, cout, cascout) ;
 
 
 
    parameter operation_mode     = "normal" ;
 
    parameter output_mode        = "reg_and_comb";
 
    parameter lut_mask           = "ffff" ;
 
    parameter cin_used           = "false";
 
 
 
    input  dataa, datab, datac, datad ;
 
    input  cin, qfbkin;
 
    input  cascin;
 
    output cout, cascout, regin, combout ;
 
 
 
    reg icout, data, tmp_cascin;
 
    reg [15:0] bin_mask;
 
    reg [2:0] iop_mode;
 
 
 
        wire idataa;
 
        wire idatab;
 
        wire idatac;
 
        wire idatad;
 
        wire icascin;
 
        wire icin;    
 
 
 
        buf (idataa, dataa);
 
        buf (idatab, datab);
 
        buf (idatac, datac);
 
        buf (idatad, datad);
 
        buf (icascin, cascin);
 
        buf (icin, cin);    
 
 
 
    specify
 
 
 
 
 
    (dataa => combout) = (0, 0) ;
 
    (datab => combout) = (0, 0) ;
 
    (datac => combout) = (0, 0) ;
 
    (datad => combout) = (0, 0) ;
 
    (cascin => combout) = (0, 0) ;
 
    (cin => combout) = (0, 0) ;
 
    (qfbkin => combout) = (0, 0) ;
 
 
 
    (dataa => cout) = (0, 0);
 
    (datab => cout) = (0, 0);
 
    (datac => cout) = (0, 0);
 
    (datad => cout) = (0, 0);
 
    (cin => cout) = (0, 0) ;
 
    (qfbkin => cout) = (0, 0) ;
 
 
 
    (cascin => cascout) = (0, 0) ;
 
    (cin => cascout) = (0, 0) ;
 
    (dataa => cascout) = (0, 0) ;
 
    (datab => cascout) = (0, 0) ;
 
    (datac => cascout) = (0, 0) ;
 
    (datad => cascout) = (0, 0) ;
 
    (qfbkin => cascout) = (0, 0) ;
 
 
 
    (dataa => regin) = (0, 0) ;
 
    (datab => regin) = (0, 0) ;
 
    (datac => regin) = (0, 0) ;
 
    (datad => regin) = (0, 0) ;
 
    (cascin => regin) = (0, 0) ;
 
    (cin => regin) = (0, 0) ;
 
    (qfbkin => regin) = (0, 0) ;
 
 
 
    endspecify
 
 
 
    function [16:1] str_to_bin ;
 
      input  [8*4:1] s;
 
      reg [8*4:1] reg_s;
 
      reg [4:1]   digit [8:1];
 
      reg [8:1] tmp;
 
      integer   m , ivalue ;
 
      begin
 
 
 
         ivalue = 0;
 
         reg_s = s;
 
         for (m=1; m<=4; m= m+1 )
 
         begin
 
                tmp = reg_s[32:25];
 
                digit[m] = tmp & 8'b00001111;
 
                reg_s = reg_s << 8;
 
                if (tmp[7] == 'b1)
 
                   digit[m] = digit[m] + 9;
 
         end
 
         str_to_bin = {digit[1], digit[2], digit[3], digit[4]};
 
    end   
 
    endfunction
 
  
 
    function lut4 ;
 
        input [15:0] mask ;
 
        input dataa, datab, datac, datad ;
 
        reg prev_lut4;
 
        reg dataa_new, datab_new, datac_new, datad_new;
 
        integer h, i, j, k;
 
        integer hn, in, jn, kn;
 
        integer exitloop;
 
        integer check_prev;
 
 
 
        begin
 
            lut4 = mask[{datad, datac, datab, dataa}];  // Try direct index first
 
            if (lut4 === 1'bx)
 
            begin
 
                if ((datad === 1'bx) || (datad === 1'bz))
 
                begin
 
                    datad_new = 1'b0;
 
                    hn = 2;
 
                end
 
                else
 
                begin
 
                    datad_new = datad;
 
                    hn = 1;
 
                end
 
                check_prev = 0;
 
                exitloop = 0;
 
                h = 1;
 
                while ((h <= hn) && (exitloop == 0))
 
                begin
 
                    if ((datac === 1'bx) || (datac === 1'bz))
 
                    begin
 
                        datac_new = 1'b0;
 
                        in = 2;
 
                    end
 
                    else
 
                    begin
 
                        datac_new = datac;
 
                        in = 1;
 
                    end
 
                    i = 1;
 
                    while ((i <= in) && (exitloop ==0))
 
                    begin
 
                        if ((datab === 1'bx) || (datab === 1'bz))
 
                        begin
 
                            datab_new = 1'b0;
 
                            jn = 2;
 
                        end
 
                        else
 
                        begin
 
                            datab_new = datab;
 
                            jn = 1;
 
                        end
 
                        j = 1;
 
                        while ((j <= jn) && (exitloop ==0))
 
                        begin
 
                            if ((dataa === 1'bx) || (dataa === 1'bz))
 
                            begin
 
                                dataa_new = 1'b0;
 
                                kn = 2;
 
                            end
 
                            else
 
                            begin
 
                                dataa_new = dataa;
 
                                kn = 1;
 
                            end
 
                            k = 1;
 
                            while ((k <= kn) && (exitloop ==0))
 
                            begin
 
                                lut4 = mask[{datad_new, datac_new, datab_new, dataa_new}];
 
 
 
                                if ((check_prev == 1) && (prev_lut4 !==lut4))
 
                                begin
 
                                    lut4 = 1'bx;
 
                                    exitloop = 1;
 
                                end
 
                                else
 
                                begin
 
                                    check_prev = 1;
 
                                    prev_lut4 = lut4;
 
                                end
 
                                k = k + 1;
 
                                dataa_new = 1'b1;
 
                            end // loop a
 
                            j = j + 1;
 
                            datab_new = 1'b1;
 
                        end // loop b
 
                        i = i + 1;
 
                        datac_new = 1'b1;
 
                    end // loop c
 
                    h = h + 1;
 
                    datad_new = 1'b1;
 
                end // loop d
 
            end
 
                
 
        end
 
     endfunction
 
 
 
     initial
 
     begin
 
        tmp_cascin = 1;
 
        bin_mask = str_to_bin (lut_mask) ;
 
 
 
        if (operation_mode == "normal" && cin_used == "true") iop_mode = 4;     // normal+cin is chain end only
 
        else if (operation_mode == "normal") iop_mode = 0;      // most common
 
        else if (operation_mode == "arithmetic") iop_mode = 1;  // second most common
 
        else if (operation_mode == "up_dn_cntr") iop_mode = 2;
 
        else if (operation_mode == "clrb_cntr") iop_mode = 3;
 
        else
 
        begin
 
            $display ("Error: Invalid operation_mode specified\n");
 
            iop_mode = 5;
 
        end
 
     end        
 
 
 
     always @(idatad or idatac or idatab or idataa or icin or 
 
             icascin or qfbkin)
 
     begin
 
        if (iop_mode == 0)      // operation_mode == "normal" without cin
 
        begin
 
        if ((icascin == 1'b1) || (icascin == 1'b0))
 
           tmp_cascin = icascin;
 
 
 
           data = lut4(bin_mask, idataa, idatab, idatac, idatad) && tmp_cascin;
 
        end
 
 
 
        else if (iop_mode == 1) // operation_mode == "arithmetic"
 
        begin
 
        if ((icascin == 1'b1) || (icascin == 1'b0))
 
                tmp_cascin = icascin;
 
                
 
                data = lut4 (bin_mask, idataa, idatab, icin, 'b1) && tmp_cascin ;
 
                icout = lut4 ( bin_mask, idataa, idatab, icin, 'b0) ;
 
        end
 
 
 
        else if (iop_mode == 2) // operation_mode == "up_dn_cntr"
 
        begin
 
        if ((icascin == 1'b1) || (icascin == 1'b0))
 
                tmp_cascin = icascin;
 
                icout = lut4(bin_mask, qfbkin, idatab, icin, 'b0);
 
                if (idatad == 'b0)
 
                        data = idatac && tmp_cascin;
 
                else
 
                        data = (lut4(bin_mask, idataa, qfbkin, icin, 'b1)) && tmp_cascin;
 
        end
 
 
 
        else if (iop_mode == 3) // operation_mode == "clrb_cntr"
 
        begin
 
                icout = lut4(bin_mask, qfbkin, idatab, icin, 'b0);
 
                if (idatad == 'b0)
 
                        data = idatac && idatab;
 
                else
 
                        data = (lut4(bin_mask, idataa, qfbkin, icin, 'b1)) && idatab;
 
        end
 
        else if (iop_mode == 4) // operation_mode == "normal" with cin
 
        begin
 
        if ((icascin == 1'b1) || (icascin == 1'b0))
 
            tmp_cascin = icascin;
 
 
 
            data = lut4 (bin_mask, idataa, idatab, icin, idatad) && tmp_cascin;
 
        end
 
     end
 
 
 
     and (cascout, data, 'b1) ;
 
     and (combout, data, 'b1) ;
 
     and (cout, icout, 'b1) ;
 
     and (regin, data, 'b1) ;
 
 
 
endmodule
 
 
 
`timescale 1 ps/1 ps
 
 
 
module  flex10ke_lcell_register (clk, aclr, aload,
 
                      datain, dataa, datab, datac, datad, devclrn, devpor, regout, qfbko) ;
 
 
 
    parameter operation_mode = "normal";
 
    parameter packed_mode        = "false" ;
 
    parameter clock_enable_mode = "false";
 
    parameter x_on_violation = "on";
 
 
 
    input  clk, datain, dataa, datab, datac, datad;
 
    input  aclr, aload, devclrn, devpor ;
 
    output regout, qfbko ;
 
 
 
    reg iregout, init, oldclk;
 
    reg [1:0] isync_mode;
 
    reg iclock_enable_mode;
 
    wire clk_in, idataa, idatac, idatad;
 
    wire reset;
 
 
 
    reg datain_viol, dataa_viol, datab_viol, datac_viol, datad_viol;
 
    reg aload_viol;
 
    reg clk_per_viol;
 
    reg violation;
 
 
 
        wire iclr;
 
        wire iaload;
 
        wire idatab;
 
 
 
        buf (clk_in, clk);
 
        buf (iclr, aclr);
 
        buf (iaload, aload);
 
        buf (idataa, dataa);
 
        buf (idatab, datab);
 
        buf (idatac, datac);
 
        buf (idatad, datad);
 
 
 
        assign reset = devpor && devclrn && (!iclr) && idataa;
 
 
 
    specify
 
 
 
    $period (posedge clk &&& reset, 0, clk_per_viol);   
 
 
 
    $setuphold (posedge clk &&& reset, datain, 0, 0, datain_viol) ;
 
    $setuphold (posedge clk &&& reset, dataa, 0, 0, dataa_viol) ;
 
    $setuphold (posedge clk &&& reset, datab, 0, 0, datab_viol) ;
 
    $setuphold (posedge clk &&& reset, datac, 0, 0, datac_viol) ;
 
    $setuphold (posedge clk &&& reset, datad, 0, 0, datad_viol) ;
 
    $setuphold (posedge clk &&& reset, aload, 0, 0, aload_viol) ;
 
 
 
 
 
    (posedge clk => (regout +: iregout)) = 0 ;
 
    (posedge aclr => (regout +: 1'b0)) = (0, 0) ;
 
 
 
    (posedge clk => (qfbko +: iregout)) = 0 ;
 
    (posedge aclr => (qfbko +: 1'b0)) = (0, 0) ;
 
 
 
    endspecify
 
 
 
    initial
 
    begin
 
        violation = 1;  
 
        init = 0;
 
        oldclk = 'b0;
 
        
 
        if (operation_mode == "clrb_cntr")       isync_mode = 0;
 
        else if (operation_mode == "up_dn_cntr") isync_mode = 1;
 
        else if (packed_mode == "true")          isync_mode = 2;
 
        else if (packed_mode == "false")         isync_mode = 3;
 
        else
 
          $display("Error: Invalid combination of parameters used. Packed mode may be used only when operation_mode is 'normal'.\n");   
 
 
 
        iclock_enable_mode = (clock_enable_mode == "true");
 
    end
 
 
 
    always @ (datain_viol or dataa_viol or datab_viol or datac_viol or datad_viol or aload_viol or clk_per_viol)
 
    begin
 
        if (x_on_violation == "on")
 
            violation = 1;
 
    end
 
 
 
     always @ (clk_in or iclr or devclrn or devpor or posedge violation or idatac or iaload)
 
     begin
 
        if (violation == 1'b1)
 
        begin
 
           violation = 0;
 
           iregout = 'bx;
 
        end
 
        else
 
        begin
 
           if (devclrn == 'b0)
 
                 iregout = 'b0;
 
           else if (iclr == 'b1) 
 
                 iregout = 'b0 ;
 
           else if (iaload == 'b1)
 
                 iregout = idatac;
 
           else if ((clk_in == 'b1)&&(oldclk == 'b0)&&((iclock_enable_mode == 1'b0) || (idataa == 1'b1)))
 
           begin
 
                case (isync_mode)
 
                0:      // operation_mode == "clrb_cntr"
 
                begin
 
                        if (idatab == 'b0)
 
                        begin
 
                                iregout = 'b0;
 
                        end
 
                        else if (idatad == 'b0)
 
                        begin
 
                                iregout = idatac;
 
                        end
 
                        else
 
                        begin
 
                                iregout = datain;
 
                        end
 
                end
 
                1:      // operation_mode == "up_dn_cntr"
 
                begin
 
                        if (idatad == 'b0)
 
                        begin
 
                                iregout = idatac;
 
                        end
 
                        else
 
                        begin
 
                                iregout = datain;
 
                        end
 
                end
 
                2:      iregout = idatad;       // packed_mode == "true"
 
                3:      iregout = datain;       // packed_mode == "false"
 
                endcase
 
           end
 
        end
 
        if (init==0)
 
        begin
 
                iregout = 'b0;
 
                init = 1;
 
        end
 
        oldclk = clk_in;
 
     end
 
 
 
     and (regout, iregout, 'b1) ;
 
     and (qfbko, iregout, 'b1) ;
 
 
 
endmodule
 
 
 
`timescale 1 ps/1 ps
 
 
 
module  flex10ke_lcell (clk, dataa, datab, datac, datad, aclr,
 
                      aload, cin, cascin, devclrn, devpor,
 
                      combout, regout, cout, cascout) ;
 
 
 
parameter operation_mode     = "normal" ;
 
parameter output_mode        = "reg_and_comb";
 
parameter packed_mode        = "false" ;
 
parameter clock_enable_mode  = "false";
 
parameter lut_mask           = "ffff" ;
 
parameter cin_used           = "false";
 
parameter x_on_violation     = "on";
 
 
 
input  clk, dataa, datab, datac, datad ;
 
input  aclr, aload, cin, cascin, devclrn, devpor ;
 
output cout, cascout, regout, combout ;
 
wire dffin, qfbk;
 
 
 
flex10ke_asynch_lcell lecomb (dataa, datab, datac, datad, cin, cascin,
 
                              qfbk, combout, dffin, cout, cascout);
 
 
 
defparam lecomb.operation_mode = operation_mode,
 
         lecomb.output_mode = output_mode,
 
         lecomb.cin_used = cin_used,
 
         lecomb.lut_mask = lut_mask;
 
 
 
flex10ke_lcell_register lereg (clk, aclr, aload, dffin, dataa, datab, datac, datad,
 
                               devclrn, devpor, regout, qfbk);
 
 
 
defparam lereg.operation_mode = operation_mode,
 
         lereg.packed_mode = packed_mode,
 
         lereg.clock_enable_mode = clock_enable_mode,
 
         lereg.x_on_violation = x_on_violation;
 
 
 
endmodule
 
 
 
///////////////////////////////////////////////////////////////////////////////
 
//
 
// FLEX10KE IO Atom
 
//
 
`timescale 1 ps/1 ps
 
module  flex10ke_io (clk, datain, aclr, ena, oe, devclrn, devoe, devpor,
 
                   padio, dataout) ;
 
 
 
  parameter operation_mode              = "input" ;
 
  parameter reg_source_mode             = "none" ;
 
  parameter feedback_mode               = "from_pin" ;
 
  parameter power_up                    = "low";
 
  parameter open_drain_output           = "false";
 
 
 
  inout     padio ;
 
  input     datain, clk, aclr, ena, oe, devpor, devoe, devclrn ;
 
  output    dataout;
 
  wire reg_pre, reg_clr;
 
  tri1 ena;
 
  tri0 aclr;
 
 
 
  wire dffeD, dffeQ;
 
 
 
specify
 
 
 
endspecify
 
 
 
assign reg_clr = (power_up == "low") ? devpor : 1'b1;
 
assign reg_pre = (power_up == "high") ? devpor : 1'b1;
 
 
 
flex10ke_asynch_io inst1 (datain, oe, padio, dffeD, dffeQ, dataout);
 
   defparam
 
            inst1.operation_mode = operation_mode,
 
            inst1.reg_source_mode = reg_source_mode,
 
            inst1.feedback_mode = feedback_mode,
 
            inst1.open_drain_output = open_drain_output;
 
 
 
dffe_io io_reg (dffeQ, clk, ena, dffeD, devclrn && !aclr && reg_clr, reg_pre);
 
 
 
endmodule
 
 
 
//
 
// ASYNCH_IO
 
//
 
module flex10ke_asynch_io(datain, oe, padio, dffeD, dffeQ, dataout);
 
 
 
  parameter operation_mode              = "input" ;
 
  parameter reg_source_mode             = "none" ;
 
  parameter feedback_mode               = "from_pin" ;
 
  parameter open_drain_output           = "false";
 
 
 
input datain, oe;
 
input dffeQ;
 
output dffeD;
 
output dataout;
 
inout padio;
 
 
 
  reg tmp_comb, tri_in, tri_in_new, temp;
 
  reg reg_indata, tmp_dataout, switch;
 
  reg [3:0] isource_mode;
 
  reg op_mode_output;
 
  reg op_mode_bidir;
 
  reg ifeedback_from_pin;
 
  reg ifeedback_from_reg;
 
  wire regout;
 
 
 
   specify
 
 
 
     (padio => dataout) = (0, 0);
 
     (posedge oe => (padio +: tri_in_new)) = 0;
 
     (negedge oe => (padio +: 1'bz)) = 0;
 
     (datain => padio) = (0, 0);
 
     (dffeQ => padio) = (0, 0);
 
     (dffeQ => dataout) = (0, 0);
 
 
 
   endspecify
 
 
 
  wire ipadio;
 
  wire idatain;
 
  wire ioe;
 
 
 
  buf (ipadio, padio);
 
  buf (idatain, datain);
 
  buf (ioe, oe);
 
 
 
initial
 
begin
 
  tri_in = 1'b0;
 
  tmp_comb = 'b0;
 
  reg_indata = 'b0;
 
 
 
        if ((reg_source_mode == "none") && (feedback_mode == "none"))
 
        begin
 
                if ((operation_mode == "output") ||
 
                        (operation_mode == "bidir"))
 
                    isource_mode = 0;   // tri_in = idatain;
 
        end
 
        else if ((reg_source_mode == "none") && (feedback_mode == "from_pin"))
 
        begin
 
                if (operation_mode == "input")
 
                        isource_mode = 1;       // tmp_comb = ipadio;
 
                else if (operation_mode == "bidir")
 
                begin
 
                        isource_mode = 2;       // tmp_comb = ipadio;   tri_in = idatain;
 
                end
 
                else $display ("Error: Invalid operation_mode specified\n");
 
        end
 
        else if ((reg_source_mode == "data_in") && (feedback_mode == "from_reg"))
 
        begin
 
                if ((operation_mode == "output") || (operation_mode == "bidir"))
 
                begin
 
                     isource_mode = 3;  // tri_in = idatain;     reg_indata = idatain;
 
                end
 
                else $display ("Error: Invalid operation_mode specified\n");
 
        end
 
        else if ((reg_source_mode == "pin_only") &&
 
                        (feedback_mode == "from_reg"))  
 
        begin
 
                if (operation_mode == "input")
 
                        isource_mode = 4;       // reg_indata = ipadio;
 
                else if (operation_mode == "bidir")  
 
                begin
 
                        isource_mode = 5;       // tri_in = idatain;    reg_indata = ipadio;
 
                end
 
                else $display ("Error: Invalid operation_mode specified\n"); 
 
        end
 
        else if ((reg_source_mode == "data_in_to_pin") && 
 
                        (feedback_mode == "from_pin")) 
 
        begin
 
                if (operation_mode == "bidir")
 
                begin
 
                        isource_mode = 6;       // tri_in = dffeQ; reg_indata = idatain; tmp_comb = ipadio;
 
                end
 
                else $display ("Error: Invalid operation_mode specified\n");
 
        end
 
        else if ((reg_source_mode == "data_in_to_pin") &&
 
                        (feedback_mode == "from_reg"))     
 
        begin 
 
                if ((operation_mode == "output") ||
 
                       (operation_mode == "bidir"))
 
                begin
 
                        isource_mode = 7;       // reg_indata = idatain; tri_in = dffeQ;
 
                end
 
                else $display ("Error: Invalid operation_mode specified\n");
 
        end 
 
        else if ((reg_source_mode == "data_in_to_pin") && 
 
                        (feedback_mode == "none"))      
 
        begin  
 
                if ((operation_mode == "output") ||
 
                       (operation_mode == "bidir"))
 
                begin 
 
                        isource_mode = 8;       // tri_in = dffeQ; reg_indata = idatain;
 
                end 
 
                else $display ("Error: Invalid operation_mode specified\n"); 
 
        end  
 
        else if ((reg_source_mode == "pin_loop") && 
 
                        (feedback_mode == "from_pin"))
 
        begin
 
                if (operation_mode == "bidir")
 
                begin
 
                        isource_mode = 9;       // tri_in = dffeQ; reg_indata = ipadio; tmp_comb = ipadio;
 
                end
 
                else $display ("Error: Invalid operation_mtmp_dataouttmp_dataoutode specified\n");
 
        end
 
        else if ((reg_source_mode == "pin_loop") &&  
 
                        (feedback_mode == "from_reg"))
 
        begin
 
                if (operation_mode == "bidir")
 
                begin
 
                        isource_mode = 10;      // reg_indata = ipadio; tri_in = dffeQ;
 
                end
 
                else $display ("Error: Invalid operation_mode specified\n");
 
        end
 
        else
 
        begin
 
                isource_mode = 11;
 
                $display ("Error: Invalid combination of paratmp_dataoutmeters used\n");
 
        end
 
 
 
        op_mode_output = (operation_mode == "output");
 
        op_mode_bidir = (operation_mode == "bidir");
 
        ifeedback_from_pin = (feedback_mode == "from_pin");
 
        ifeedback_from_reg = (feedback_mode == "from_reg");
 
end
 
 
 
always @(ipadio or idatain or ioe or dffeQ)
 
begin
 
        case (isource_mode)
 
        0:      tri_in = idatain;
 
        1:      tmp_comb = ipadio;
 
        2:      begin
 
                        tmp_comb = ipadio;
 
                        tri_in = idatain;
 
                end
 
        3:      begin
 
                        tri_in = idatain;
 
                        reg_indata = idatain;
 
                end
 
        4:      reg_indata = ipadio;
 
        5:      begin
 
                        tri_in = idatain;
 
                        reg_indata = ipadio;
 
                end
 
        6:      begin
 
                        tri_in = dffeQ;
 
                        reg_indata = idatain;
 
                        tmp_comb = ipadio;
 
                end
 
        7:      begin
 
                        reg_indata = idatain;
 
                        tri_in = dffeQ;
 
                end
 
        8:      begin 
 
                        tri_in = dffeQ;
 
                        reg_indata = idatain;
 
                end 
 
        9:      begin
 
                        tri_in = dffeQ;
 
                        reg_indata = ipadio;
 
                        tmp_comb = ipadio;
 
                end
 
        10:     begin
 
                        reg_indata = ipadio;
 
                        tri_in = dffeQ;
 
                end
 
        endcase
 
 
 
        if (op_mode_output)
 
        begin
 
                if (ioe == 'b0)
 
                        temp = 'bz;
 
                else
 
                        temp = tri_in;
 
                if (open_drain_output == "false")
 
                        tri_in_new = temp;
 
                else if (open_drain_output == "true")
 
                begin
 
                        if ((reg_source_mode == "data_in_to_pin") && (feedback_mode != "from_pin"))
 
                        begin
 
                                if (temp == 'b0)
 
                                        tri_in_new = 'b0;
 
                                else
 
                                        tri_in_new = 'bz;
 
                        end
 
                        else
 
                        begin
 
                                if (idatain == 'b1)
 
                                        tri_in_new = 'bz;
 
                                else
 
                                        tri_in_new = 'b0;
 
                        end
 
                end
 
        end
 
        else if (op_mode_bidir && (ioe == 'b1))
 
        begin
 
                if (open_drain_output == "false")
 
                        tri_in_new = tri_in;
 
                else if (open_drain_output == "true")
 
                begin
 
                        if (tri_in == 'b0)
 
                                tri_in_new = 'b0;
 
                        else
 
                                tri_in_new = 'bz;
 
                end
 
        end
 
        else
 
                tri_in_new = 'bz;
 
        
 
        if (ifeedback_from_pin)
 
        begin
 
                tmp_dataout = tmp_comb;
 
                switch = 'b0;
 
        end
 
        else if (ifeedback_from_reg)
 
        begin
 
                tmp_dataout = 'b0;
 
                if (reg_indata == 'bx)
 
                        switch = 'b0;
 
                else
 
                        switch = 'b1;
 
        end
 
end
 
 
 
and (dffeD, reg_indata, 1'b1);
 
and (regout, dffeQ, switch, 1'b1);
 
or  (dataout, regout, tmp_dataout, 1'b0);
 
pmos (padio, tri_in_new, 'b0);
 
 
 
endmodule
 
 
 
//////////////////////////////////////////////////////////////////////////////
 
//
 
// Module Name : FLEX10KE_ASYNCH_MEM
 
//
 
// Description : Timing simulation model for the asynchronous RAM array
 
//
 
//////////////////////////////////////////////////////////////////////////////
 
 
 
`timescale 1 ps/1 ps
 
module flex10ke_asynch_mem (datain,
 
                            we,
 
                            re,
 
                            raddr,
 
                            waddr,
 
                            modesel,
 
                            dataout);
 
 
 
    // INPUT PORTS
 
    input datain;
 
    input we;
 
    input re;
 
    input [10:0] raddr;
 
    input [10:0] waddr;
 
    input [15:0] modesel;
 
 
 
    // OUTPUT PORTS
 
    output dataout;
 
 
 
    // GLOBAL PARAMETERS
 
    parameter logical_ram_depth     = 2048;
 
    parameter infile                = "none";
 
    parameter address_width         = 11;
 
    parameter first_address         = 0;
 
    parameter last_address          = 2047;
 
    parameter mem1                  = 512'b0;
 
    parameter mem2                  = 512'b0;
 
    parameter mem3                  = 512'b0;
 
    parameter mem4                  = 512'b0;
 
    parameter bit_number            = 0;
 
    parameter write_logic_clock     = "none";
 
    parameter read_enable_clock     = "none";
 
    parameter data_out_clock        = "none";
 
    parameter operation_mode        = "single_port";
 
 
 
    // INTERNAL VARIABLES AND NETS
 
    reg tmp_dataout;
 
    reg [10:0] rword;
 
    reg [10:0] wword;
 
    reg [2047:0] mem;
 
    reg write_en;
 
    reg read_en;
 
    reg write_en_last_value;
 
    wire [10:0] waddr_in;
 
    wire [10:0] raddr_in;
 
    integer i;
 
 
 
    wire we_in;
 
    wire re_in;
 
    wire datain_in;
 
 
 
    // BUFFER INPUTS
 
    buf (we_in, we);
 
    buf (re_in, re);
 
    buf (datain_in, datain);
 
 
 
    buf (waddr_in[0], waddr[0]);
 
    buf (waddr_in[1], waddr[1]);
 
    buf (waddr_in[2], waddr[2]);
 
    buf (waddr_in[3], waddr[3]);
 
    buf (waddr_in[4], waddr[4]);
 
    buf (waddr_in[5], waddr[5]);
 
    buf (waddr_in[6], waddr[6]);
 
    buf (waddr_in[7], waddr[7]);
 
    buf (waddr_in[8], waddr[8]);
 
    buf (waddr_in[9], waddr[9]);
 
    buf (waddr_in[10], waddr[10]);
 
 
 
    buf (raddr_in[0], raddr[0]);
 
    buf (raddr_in[1], raddr[1]);
 
    buf (raddr_in[2], raddr[2]);
 
    buf (raddr_in[3], raddr[3]);
 
    buf (raddr_in[4], raddr[4]);
 
    buf (raddr_in[5], raddr[5]);
 
    buf (raddr_in[6], raddr[6]);
 
    buf (raddr_in[7], raddr[7]);
 
    buf (raddr_in[8], raddr[8]);
 
    buf (raddr_in[9], raddr[9]);
 
    buf (raddr_in[10], raddr[10]);
 
 
 
    // TIMING PATHS
 
    specify
 
     
 
        $setup (waddr[0], posedge we &&& (~modesel[2]), 0);
 
        $setup (waddr[1], posedge we &&& (~modesel[2]), 0);
 
        $setup (waddr[2], posedge we &&& (~modesel[2]), 0);
 
        $setup (waddr[3], posedge we &&& (~modesel[2]), 0);
 
        $setup (waddr[4], posedge we &&& (~modesel[2]), 0);
 
        $setup (waddr[5], posedge we &&& (~modesel[2]), 0);
 
        $setup (waddr[6], posedge we &&& (~modesel[2]), 0);
 
        $setup (waddr[7], posedge we &&& (~modesel[2]), 0);
 
        $setup (waddr[8], posedge we &&& (~modesel[2]), 0);
 
        $setup (waddr[9], posedge we &&& (~modesel[2]), 0);
 
        $setup (waddr[10], posedge we &&& (~modesel[2]), 0);
 
 
 
        $setuphold (negedge re &&& (~modesel[4]), raddr[0], 0, 0);
 
        $setuphold (negedge re &&& (~modesel[4]), raddr[1], 0, 0);
 
        $setuphold (negedge re &&& (~modesel[4]), raddr[2], 0, 0);
 
        $setuphold (negedge re &&& (~modesel[4]), raddr[3], 0, 0);
 
        $setuphold (negedge re &&& (~modesel[4]), raddr[4], 0, 0);
 
        $setuphold (negedge re &&& (~modesel[4]), raddr[5], 0, 0);
 
        $setuphold (negedge re &&& (~modesel[4]), raddr[6], 0, 0);
 
        $setuphold (negedge re &&& (~modesel[4]), raddr[7], 0, 0);
 
        $setuphold (negedge re &&& (~modesel[4]), raddr[8], 0, 0);
 
        $setuphold (negedge re &&& (~modesel[4]), raddr[9], 0, 0);
 
        $setuphold (negedge re &&& (~modesel[4]), raddr[10], 0, 0);
 
 
 
        $setuphold (negedge we &&& (~modesel[0]), datain, 0, 0);
 
 
 
        $hold (negedge we &&& (~modesel[2]), waddr[0], 0);
 
        $hold (negedge we &&& (~modesel[2]), waddr[1], 0);
 
        $hold (negedge we &&& (~modesel[2]), waddr[2], 0);
 
        $hold (negedge we &&& (~modesel[2]), waddr[3], 0);
 
        $hold (negedge we &&& (~modesel[2]), waddr[4], 0);
 
        $hold (negedge we &&& (~modesel[2]), waddr[5], 0);
 
        $hold (negedge we &&& (~modesel[2]), waddr[6], 0);
 
        $hold (negedge we &&& (~modesel[2]), waddr[7], 0);
 
        $hold (negedge we &&& (~modesel[2]), waddr[8], 0);
 
        $hold (negedge we &&& (~modesel[2]), waddr[9], 0);
 
        $hold (negedge we &&& (~modesel[2]), waddr[10], 0);
 
 
 
        $nochange (posedge we &&& (~modesel[2]), waddr, 0, 0);
 
 
 
        $width (posedge we, 0);
 
        $width (posedge re, 0);
 
 
 
        (raddr[0] => dataout) = (0, 0);
 
        (raddr[1] => dataout) = (0, 0);
 
        (raddr[2] => dataout) = (0, 0);
 
        (raddr[3] => dataout) = (0, 0);
 
        (raddr[4] => dataout) = (0, 0);
 
        (raddr[5] => dataout) = (0, 0);
 
        (raddr[6] => dataout) = (0, 0);
 
        (raddr[7] => dataout) = (0, 0);
 
        (raddr[8] => dataout) = (0, 0);
 
        (raddr[9] => dataout) = (0, 0);
 
        (raddr[10] => dataout) = (0, 0);
 
        (waddr[0] => dataout) = (0, 0);
 
        (waddr[1] => dataout) = (0, 0);
 
        (waddr[2] => dataout) = (0, 0);
 
        (waddr[3] => dataout) = (0, 0);
 
        (waddr[4] => dataout) = (0, 0);
 
        (waddr[5] => dataout) = (0, 0);
 
        (waddr[6] => dataout) = (0, 0);
 
        (waddr[7] => dataout) = (0, 0);
 
        (waddr[8] => dataout) = (0, 0);
 
        (waddr[9] => dataout) = (0, 0);
 
        (waddr[10] => dataout) = (0, 0);
 
        (re => dataout) = (0, 0);
 
        (we => dataout) = (0, 0);
 
        (datain => dataout) = (0, 0);
 
 
 
    endspecify
 
 
 
    initial
 
    begin
 
        mem = {mem4, mem3, mem2, mem1};
 
 
 
        // if WE is not registered, initial RAM content is X
 
        // note that if WE is not registered, the MIF file cannot be used
 
        if ((operation_mode != "rom") && (write_logic_clock == "none"))
 
        begin
 
            for (i = 0; i <= 2047; i=i+1)
 
               mem[i] = 'bx;
 
        end
 
 
 
        tmp_dataout = 'b0;
 
        if ((operation_mode == "rom") || (operation_mode == "single_port"))
 
        begin
 
           // re is always active
 
           tmp_dataout = mem[0];
 
        end
 
        else begin
 
           // re is inactive
 
           tmp_dataout = 'b0;
 
        end
 
        if (read_enable_clock != "none")
 
        begin
 
           if ((operation_mode == "rom") || (operation_mode == "single_port"))
 
           begin
 
              // re is always active
 
              tmp_dataout = mem[0];
 
           end
 
           else begin
 
              // eab cell output powers up to VCC
 
              tmp_dataout = 'b1;
 
           end
 
        end
 
    end
 
 
 
    always @(we_in or re_in or raddr_in or waddr_in or datain_in)
 
    begin
 
        rword = raddr_in[10:0];
 
        wword = waddr_in[10:0];
 
 
 
        read_en = re_in;
 
        write_en = we_in;
 
 
 
        if (modesel[14:13] == 2'b10)
 
        begin
 
            if (read_en == 1)
 
               tmp_dataout = mem[rword];
 
        end
 
        else if (modesel[14:13] == 2'b00)
 
        begin
 
            if ((write_en == 0) && (write_en_last_value == 1))
 
                mem[wword] = datain_in;
 
            if (write_en == 0)
 
                tmp_dataout = mem[wword];
 
            else if (write_en == 1)
 
                tmp_dataout = datain_in;
 
            else tmp_dataout = 'bx;
 
        end
 
        else if (modesel[14:13] == 2'b01)
 
        begin
 
            if ((write_en == 0) && (write_en_last_value == 1))
 
                mem[wword] = datain_in;
 
            if ((read_en == 1) && (rword == wword) && (write_en == 1))
 
                tmp_dataout = datain_in;
 
            else if (read_en == 1)
 
                tmp_dataout = mem[rword];
 
        end
 
        write_en_last_value = write_en;
 
    end
 
 
 
    and (dataout, tmp_dataout, 'b1);
 
 
 
endmodule // flex10ke_asynch_mem
 
 
 
//////////////////////////////////////////////////////////////////////////////
 
//
 
// Module Name : PRIM_DFFE
 
//
 
// Description : State table for UDP PRIM_DFFE
 
//
 
//////////////////////////////////////////////////////////////////////////////
 
 
 
primitive PRIM_DFFE (Q, ENA, D, CLK, CLRN, PRN, notifier);
 
    input D;   
 
    input CLRN;
 
    input PRN;
 
    input CLK;
 
    input ENA;
 
    input notifier;
 
    output Q; reg Q;
 
 
 
    initial Q = 1'b0;
 
 
 
    table
 
 
 
    //  ENA  D   CLK   CLRN  PRN  notifier  :   Qt  :   Qt+1
 
 
 
        (??) ?    ?      1    1      ?      :   ?   :   -;  // pessimism
 
         x   ?    ?      1    1      ?      :   ?   :   -;  // pessimism
 
         1   1   (01)    1    1      ?      :   ?   :   1;  // clocked data
 
         1   1   (01)    1    x      ?      :   ?   :   1;  // pessimism
 
 
 
         1   1    ?      1    x      ?      :   1   :   1;  // pessimism
 
 
 
         1   0    0      1    x      ?      :   1   :   1;  // pessimism
 
         1   0    x      1  (?x)     ?      :   1   :   1;  // pessimism
 
         1   0    1      1  (?x)     ?      :   1   :   1;  // pessimism
 
 
 
         1   x    0      1    x      ?      :   1   :   1;  // pessimism
 
         1   x    x      1  (?x)     ?      :   1   :   1;  // pessimism
 
         1   x    1      1  (?x)     ?      :   1   :   1;  // pessimism
 
 
 
         1   0   (01)    1    1      ?      :   ?   :   0;  // clocked data
 
 
 
         1   0   (01)    x    1      ?      :   ?   :   0;  // pessimism
 
 
 
         1   0    ?      x    1      ?      :   0   :   0;  // pessimism
 
         0   ?    ?      x    1      ?      :   ?   :   -;
 
 
 
         1   1    0      x    1      ?      :   0   :   0;  // pessimism
 
         1   1    x    (?x)   1      ?      :   0   :   0;  // pessimism
 
         1   1    1    (?x)   1      ?      :   0   :   0;  // pessimism
 
 
 
         1   x    0      x    1      ?      :   0   :   0;  // pessimism
 
         1   x    x    (?x)   1      ?      :   0   :   0;  // pessimism
 
         1   x    1    (?x)   1      ?      :   0   :   0;  // pessimism
 
 
 
         1   1   (x1)    1    1      ?      :   1   :   1;  // reducing pessimism
 
         1   0   (x1)    1    1      ?      :   0   :   0;
 
         1   1   (0x)    1    1      ?      :   1   :   1;
 
         1   0   (0x)    1    1      ?      :   0   :   0;
 
 
 
         ?   ?   ?       0    1      ?      :   ?   :   0;  // asynch clear
 
 
 
         ?   ?   ?       1    0      ?      :   ?   :   1;  // asynch set
 
 
 
         1   ?   (?0)    1    1      ?      :   ?   :   -;  // ignore falling clock
 
         1   ?   (1x)    1    1      ?      :   ?   :   -;  // ignore falling clock
 
         1   *    ?      ?    ?      ?      :   ?   :   -; // ignore data edges
 
 
 
         1   ?   ?     (?1)   ?      ?      :   ?   :   -;  // ignore edges on
 
         1   ?   ?       ?  (?1)     ?      :   ?   :   -;  //  set and clear
 
 
 
         0   ?   ?       1    1      ?      :   ?   :   -;  //  set and clear
 
 
 
        ?   ?   ?       1    1      *      :   ?   :   x; // spr 36954 - at any
 
                                                    // notifier event,
 
                                                    // output 'x'
 
    endtable
 
 
 
endprimitive // PRIM_DFFE
 
 
 
//////////////////////////////////////////////////////////////////////////////
 
//
 
// Module Name : FLEX10KE_DFFE
 
//
 
// Description : Timing simulation model for a DFFE register
 
//
 
//////////////////////////////////////////////////////////////////////////////
 
 
 
module flex10ke_dffe ( Q,
 
             CLK,
 
             ENA,
 
             D,
 
             CLRN,
 
             PRN );
 
 
 
    // INPUT PORTS
 
    input D;
 
    input CLK;
 
    input CLRN;
 
    input PRN;
 
    input ENA;
 
 
 
    // OUTPUT PORTS
 
    output Q;
 
 
 
    // INTERNAL VARIABLES AND NETS
 
    wire legal;
 
    reg viol_notifier;
 
 
 
    // INSTANTIATE THE UDP
 
    PRIM_DFFE ( Q, ENA, D, CLK, CLRN, PRN, viol_notifier );
 
 
 
    // filter out illegal values like 'X'
 
    and(legal, ENA, CLRN, PRN);
 
 
 
    specify
 
 
 
        specparam TREG = 0;
 
        specparam TREN = 0;
 
        specparam TRSU = 0;
 
        specparam TRH  = 0;
 
        specparam TRPR = 0;
 
        specparam TRCL = 0;
 
 
 
        $setup  (  D, posedge CLK &&& legal, TRSU, viol_notifier  ) ;
 
        $hold   (  posedge CLK &&& legal, D, TRH, viol_notifier   ) ;
 
        $setup  (  ENA, posedge CLK &&& legal, TREN, viol_notifier  ) ;
 
        $hold   (  posedge CLK &&& legal, ENA, 0, viol_notifier   ) ;
 
 
 
        ( negedge CLRN => (Q  +: 1'b0)) = ( TRCL, TRCL) ;
 
        ( negedge PRN  => (Q  +: 1'b1)) = ( TRPR, TRPR) ;
 
        ( posedge CLK  => (Q  +: D)) = ( TREG, TREG) ;
 
 
 
    endspecify
 
 
 
endmodule // flex10ke_dffe
 
 
 
//////////////////////////////////////////////////////////////////////////////
 
//
 
// Module Name : DFFE_IO
 
//
 
// Description : Timing simulation model for a DFFE register for IO atom
 
//
 
//////////////////////////////////////////////////////////////////////////////
 
 
 
module dffe_io ( Q, CLK, ENA, D, CLRN, PRN );
 
    input D;
 
    input CLK;
 
    input CLRN;
 
    input PRN;
 
    input ENA;
 
    output Q;
 
 
 
    wire D_ipd;
 
    wire ENA_ipd;
 
    wire CLK_ipd;
 
    wire PRN_ipd;
 
    wire CLRN_ipd;
 
 
 
    buf (D_ipd, D);
 
    buf (ENA_ipd, ENA);
 
    buf (CLK_ipd, CLK);
 
    buf (PRN_ipd, PRN);
 
    buf (CLRN_ipd, CLRN);
 
 
 
    wire legal;
 
    reg viol_notifier;
 
 
 
    PRIM_DFFE ( Q, ENA_ipd, D_ipd, CLK_ipd, CLRN_ipd, PRN_ipd, viol_notifier);
 
 
 
    and(legal, ENA_ipd, CLRN_ipd, PRN_ipd);
 
 
 
    specify
 
 
 
      specparam TREG = 0;
 
      specparam TREN = 0;
 
      specparam TRSU = 0;
 
      specparam TRH  = 0;
 
      specparam TRPR = 0;
 
      specparam TRCL = 0;
 
 
 
        $setup  (  D, posedge CLK &&& legal, TRSU, viol_notifier  ) ;
 
        $hold   (  posedge CLK &&& legal, D, TRH, viol_notifier   ) ;
 
        $setup  (  ENA, posedge CLK &&& legal, TREN, viol_notifier  ) ;
 
        $hold   (  posedge CLK &&& legal, ENA, 0, viol_notifier   ) ;
 
 
 
        ( negedge CLRN => (Q  +: 1'b0)) = ( TRCL, TRCL) ;
 
        ( negedge PRN  => (Q  +: 1'b1)) = ( TRPR, TRPR) ;
 
        ( posedge CLK  => (Q  +: D)) = ( TREG, TREG) ;
 
 
 
    endspecify
 
endmodule // dffe_io
 
 
 
//////////////////////////////////////////////////////////////////////////////
 
//
 
// Module Name : mux21
 
//
 
// Description : Simulation model for a 2 to 1 mux used in the RAM_SLICE
 
//               This is a purely functional module, without any timing.
 
//
 
//////////////////////////////////////////////////////////////////////////////
 
 
 
module mux21 (MO,
 
              A,
 
              B,
 
              S);
 
    input A, B, S;
 
    output MO;
 
 
 
    assign MO = (S == 1) ? B : A;
 
 
 
endmodule // mux21
 
 
 
//////////////////////////////////////////////////////////////////////////////
 
//
 
// Module Name : and1
 
//
 
// Description : Simulation model for a 1-input AND gate
 
//
 
//////////////////////////////////////////////////////////////////////////////
 
 
 
module and1 (Y,
 
             IN1);
 
    input IN1;
 
    output Y;
 
 
 
    specify
 
        (IN1 => Y) = (0, 0);
 
    endspecify
 
 
 
    buf (Y, IN1);
 
endmodule // and1
 
 
 
//////////////////////////////////////////////////////////////////////////////
 
//
 
// Module Name : and11
 
//
 
// Description : Simulation model for a 11-input AND gate
 
//
 
//////////////////////////////////////////////////////////////////////////////
 
 
 
module and11 (Y, IN1);
 
input [10:0] IN1;
 
output [10:0] Y;
 
 
 
    specify
 
    (IN1 => Y) = (0, 0);
 
    endspecify
 
 
 
buf (Y[0], IN1[0]);
 
buf (Y[1], IN1[1]);
 
buf (Y[2], IN1[2]);
 
buf (Y[3], IN1[3]);
 
buf (Y[4], IN1[4]);
 
buf (Y[5], IN1[5]);
 
buf (Y[6], IN1[6]);
 
buf (Y[7], IN1[7]);
 
buf (Y[8], IN1[8]);
 
buf (Y[9], IN1[9]);
 
buf (Y[10], IN1[10]);
 
 
 
endmodule // and11
 
 
 
//////////////////////////////////////////////////////////////////////////////
 
//
 
// Module Name : nmux21
 
//
 
// Description : Simulation model for a 2 to 1 mux used in the RAM_SLICE
 
//               The output is an inversion of the selected input.
 
//               This is a purely functional module, without any timing.
 
//
 
//////////////////////////////////////////////////////////////////////////////
 
 
 
module nmux21 (MO,
 
               A,
 
               B,
 
               S);
 
    input A, B, S; 
 
    output MO; 
 
 
 
    assign MO = (S == 1) ? ~B : ~A; 
 
 
 
endmodule // nmux21
 
 
 
//////////////////////////////////////////////////////////////////////////////
 
//
 
// Module Name : bmux21
 
//
 
// Description : Simulation model for a 2 to 1 mux used in the RAM_SLICE
 
//               Each input is a 16-bit bus.
 
//               This is a purely functional module, without any timing.
 
//
 
//////////////////////////////////////////////////////////////////////////////
 
 
 
module bmux21 (MO,
 
               A,
 
               B,
 
               S);
 
 
 
    input [10:0] A, B;
 
    input S;
 
    output [10:0] MO; 
 
 
 
    assign MO = (S == 1) ? B : A; 
 
 
 
endmodule // bmux21
 
 
 
//////////////////////////////////////////////////////////////////////////////
 
//
 
// Module Name : b5mux21
 
//
 
// Description : Simulation model for a 2 to 1 mux used in the CAM_SLICE.
 
//               Each input is a 5-bit bus.
 
//               This is a purely functional module, without any timing.
 
//
 
//////////////////////////////////////////////////////////////////////////////
 
 
 
module b5mux21 (MO,
 
                A,
 
                B,
 
                S);
 
    input [4:0] A, B;
 
    input S;
 
    output [4:0] MO; 
 
 
 
    assign MO = (S == 1) ? B : A; 
 
 
 
endmodule // b5mux21
 
 
 
//////////////////////////////////////////////////////////////////////////////
 
//
 
// Module Name : FLEX10KE_RAM_SLICE
 
//
 
// Description : Timing simulation model for a single RAM segment of the
 
//               FLEX10KE family.
 
//               This model is a top-level structural description of the
 
//               RAM segment. It instantiates the peripheral registers,
 
//               mode-control multiplexers and the asynchronous memory
 
//               array.
 
//
 
//////////////////////////////////////////////////////////////////////////////
 
 
 
module flex10ke_ram_slice (datain,
 
                           clr0, 
 
                           clk0, 
 
                           clk1, 
 
                           ena0, 
 
                           ena1, 
 
                           we,
 
                           re,
 
                           waddr,
 
                           raddr,
 
                           devclrn,
 
                           devpor,
 
                           modesel,
 
                           dataout
 
                          );
 
 
 
    // INPUT PORTS
 
    input  datain;
 
    input  clk0;
 
    input  clk1;
 
    input  clr0;
 
    input  ena0;
 
    input  ena1;
 
    input  we;
 
    input  re;
 
    input  devclrn;
 
    input  devpor;
 
    input  [10:0] raddr;
 
    input  [10:0] waddr;
 
    input  [15:0] modesel;
 
 
 
    // OUTPUT PORTS
 
    output dataout;
 
 
 
    // GLOBAL PARAMETERS
 
    parameter operation_mode           = "single_port";
 
    parameter logical_ram_name         = "ram_xxx";
 
    parameter logical_ram_depth        = "2k";
 
    parameter logical_ram_width        = "1";
 
    parameter address_width            = 11;
 
    parameter data_in_clock            = "none";
 
    parameter data_in_clear            = "none";
 
    parameter write_logic_clock        = "none";
 
    parameter write_address_clear      = "none";
 
    parameter write_enable_clear       = "none";
 
    parameter read_enable_clock        = "none";
 
    parameter read_enable_clear        = "none";
 
    parameter read_address_clock       = "none";
 
    parameter read_address_clear       = "none";
 
    parameter data_out_clock           = "none";
 
    parameter data_out_clear           = "none";
 
    parameter init_file                = "none";
 
    parameter first_address            = 0;
 
    parameter last_address             = 2047;
 
    parameter bit_number               = "1";
 
    parameter mem1                     = 512'b0;
 
    parameter mem2                     = 512'b0;
 
    parameter mem3                     = 512'b0;
 
    parameter mem4                     = 512'b0;
 
 
 
    // INTERNAL NETS AND VARIABLES
 
    wire  datain_reg, we_reg, re_reg, dataout_reg;
 
    wire  we_reg_mux, we_reg_mux_delayed;
 
    wire  [10:0] raddr_reg, waddr_reg;
 
    wire  datain_int, we_int, re_int, dataout_int, dataout_tmp;
 
    wire  [10:0] raddr_int, waddr_int;
 
    wire  reen, raddren, dataouten;
 
    wire  datain_clr;
 
    wire  re_clk, raddr_clk;
 
    wire  datain_reg_sel, write_reg_sel, raddr_reg_sel;
 
    wire  re_reg_sel, dataout_reg_sel, re_clk_sel, re_en_sel;
 
    wire  raddr_clk_sel, raddr_en_sel;
 
    wire  dataout_en_sel;
 
    wire  datain_reg_clr, waddr_reg_clr, raddr_reg_clr;
 
    wire  re_reg_clr, dataout_reg_clr, we_reg_clr;
 
    wire  datain_reg_clr_sel;
 
    wire  waddr_reg_clr_sel;
 
    wire  we_reg_clr_sel;
 
    wire  raddr_reg_clr_sel;
 
    wire  re_reg_clr_sel, dataout_reg_clr_sel, NC;
 
    wire  we_pulse;
 
 
 
    wire clk0_delayed;
 
 
 
    reg we_int_delayed, datain_int_delayed;
 
    reg [10:0] waddr_int_delayed;
 
 
 
    // PULL UPs
 
    tri1 iena0;
 
    tri1 iena1;
 
 
 
    // READ MODESEL PORT BITS
 
    assign datain_reg_sel          = modesel[0];
 
    assign datain_reg_clr_sel      = modesel[1];
 
    assign write_reg_sel           = modesel[2];
 
    assign waddr_reg_clr_sel       = modesel[15];
 
    assign we_reg_clr_sel          = modesel[3];
 
    assign raddr_reg_sel           = modesel[4];
 
    assign raddr_reg_clr_sel       = modesel[5];
 
    assign re_reg_sel              = modesel[6];
 
    assign re_reg_clr_sel          = modesel[7];
 
    assign dataout_reg_sel         = modesel[8];
 
    assign dataout_reg_clr_sel     = modesel[9];
 
    assign re_clk_sel              = modesel[10];
 
    assign re_en_sel               = modesel[10];
 
    assign raddr_clk_sel           = modesel[11];
 
    assign raddr_en_sel            = modesel[11];
 
    assign dataout_en_sel          = modesel[12];
 
 
 
    assign iena0 = ena0;
 
    assign iena1 = ena1;
 
    assign NC = 0;
 
 
 
 
 
    always @ (datain_int or waddr_int or we_int)
 
    begin
 
       we_int_delayed = we_int;
 
       waddr_int_delayed <= waddr_int;
 
       datain_int_delayed <= datain_int;
 
    end
 
 
 
    mux21     datainsel       (datain_int,
 
                               datain,
 
                               datain_reg,
 
                               datain_reg_sel
 
                              );
 
    nmux21    datainregclr    (datain_reg_clr,
 
                               NC,
 
                               clr0,
 
                               datain_reg_clr_sel
 
                              );
 
    bmux21    waddrsel        (waddr_int,
 
                               waddr,
 
                               waddr_reg,
 
                               write_reg_sel
 
                              );
 
    nmux21    waddrregclr     (waddr_reg_clr,
 
                               NC,
 
                               clr0,
 
                               waddr_reg_clr_sel
 
                              );
 
    nmux21    weregclr        (we_reg_clr,
 
                               NC,
 
                               clr0,
 
                               we_reg_clr_sel
 
                              );
 
    mux21     wesel2          (we_int,
 
                               we_reg_mux_delayed,
 
                               we_pulse,
 
                               write_reg_sel
 
                              );
 
    mux21     wesel1          (we_reg_mux,
 
                               we,
 
                               we_reg,
 
                               write_reg_sel
 
                              );
 
    bmux21    raddrsel        (raddr_int,
 
                               raddr,
 
                               raddr_reg,
 
                               raddr_reg_sel
 
                              );
 
    nmux21    raddrregclr     (raddr_reg_clr,
 
                               NC,
 
                               clr0,
 
                               raddr_reg_clr_sel
 
                              );
 
    mux21     resel           (re_int,
 
                               re,
 
                               re_reg,
 
                               re_reg_sel
 
                              );
 
    mux21     dataoutsel      (dataout_tmp,
 
                               dataout_int,
 
                               dataout_reg,
 
                               dataout_reg_sel
 
                              );
 
    nmux21    dataoutregclr   (dataout_reg_clr,
 
                               NC,
 
                               clr0,
 
                               dataout_reg_clr_sel
 
                              );
 
    mux21     raddrclksel     (raddr_clk,
 
                               clk0,
 
                               clk1,
 
                               raddr_clk_sel
 
                              );
 
    mux21     raddrensel      (raddren,
 
                               iena0,
 
                               iena1,
 
                               raddr_en_sel
 
                              );
 
    mux21     reclksel        (re_clk,
 
                               clk0,
 
                               clk1,
 
                               re_clk_sel
 
                              );
 
    mux21     reensel         (reen,
 
                               iena0,
 
                               iena1,
 
                               re_en_sel
 
                              );
 
    nmux21    reregclr        (re_reg_clr,
 
                               NC,
 
                               clr0,
 
                               re_reg_clr_sel
 
                              );
 
    mux21     dataoutensel    (dataouten,
 
                               NC,
 
                               iena1,
 
                               dataout_en_sel
 
                              );
 
    flex10ke_dffe      dinreg          (datain_reg,
 
                               clk0,
 
                               iena0,
 
                               datain,
 
                               datain_reg_clr && devclrn && devpor,
 
                               1'b1
 
                              );
 
    flex10ke_dffe      wereg           (we_reg,
 
                               clk0,
 
                               iena0,
 
                               we,
 
                               we_reg_clr && devclrn && devpor,
 
                               1'b1
 
                              );
 
    
 
    // clk0 for we_pulse should have same delay as clk of wereg
 
    and1      clk0weregdelaybuf (clk0_delayed,
 
                                 clk0
 
                                );
 
    assign    we_pulse = we_reg_mux_delayed && (~clk0_delayed);
 
    
 
    and1      wedelaybuf      (we_reg_mux_delayed,
 
                               we_reg_mux
 
                              );    
 
    flex10ke_dffe      rereg           (re_reg,
 
                               re_clk,
 
                               reen,
 
                               re,
 
                               re_reg_clr && devclrn && devpor,
 
                               1'b1
 
                              );    
 
    flex10ke_dffe      dataoutreg      (dataout_reg,
 
                               clk1,
 
                               dataouten,
 
                               dataout_int, 
 
                               dataout_reg_clr && devclrn && devpor,
 
                               1'b1
 
                              );
 
    
 
    flex10ke_dffe      waddrreg_0      (waddr_reg[0],
 
                               clk0,
 
                               iena0,
 
                               waddr[0],
 
                               waddr_reg_clr && devclrn && devpor,
 
                               1'b1
 
                              );
 
    flex10ke_dffe      waddrreg_1      (waddr_reg[1],
 
                               clk0,
 
                               iena0,
 
                               waddr[1],
 
                               waddr_reg_clr && devclrn && devpor,
 
                               1'b1
 
                              );
 
    flex10ke_dffe      waddrreg_2      (waddr_reg[2],
 
                               clk0,
 
                               iena0,
 
                               waddr[2],
 
                               waddr_reg_clr && devclrn && devpor,
 
                               1'b1
 
                              );
 
    flex10ke_dffe      waddrreg_3      (waddr_reg[3],
 
                               clk0,
 
                               iena0,
 
                               waddr[3],
 
                               waddr_reg_clr && devclrn && devpor,
 
                               1'b1
 
                              );
 
    flex10ke_dffe      waddrreg_4      (waddr_reg[4],
 
                               clk0,
 
                               iena0,
 
                               waddr[4],
 
                               waddr_reg_clr && devclrn && devpor,
 
                               1'b1
 
                              );
 
    flex10ke_dffe      waddrreg_5      (waddr_reg[5],
 
                               clk0,
 
                               iena0,
 
                               waddr[5],
 
                               waddr_reg_clr && devclrn && devpor,
 
                               1'b1
 
                              );
 
    flex10ke_dffe      waddrreg_6      (waddr_reg[6],
 
                               clk0,
 
                               iena0,
 
                               waddr[6],
 
                               waddr_reg_clr && devclrn && devpor,
 
                               1'b1
 
                              );
 
    flex10ke_dffe      waddrreg_7      (waddr_reg[7],
 
                               clk0,
 
                               iena0,
 
                               waddr[7],
 
                               waddr_reg_clr && devclrn && devpor,
 
                               1'b1
 
                              );
 
    flex10ke_dffe      waddrreg_8      (waddr_reg[8],
 
                               clk0,
 
                               iena0,
 
                               waddr[8],
 
                               waddr_reg_clr && devclrn && devpor,
 
                               1'b1
 
                              );
 
    flex10ke_dffe      waddrreg_9      (waddr_reg[9], 
 
                               clk0, 
 
                               iena0, 
 
                               waddr[9], 
 
                               waddr_reg_clr && devclrn && devpor, 
 
                               1'b1
 
                              );
 
    flex10ke_dffe      waddrreg_10     (waddr_reg[10],
 
                               clk0,
 
                               iena0,
 
                               waddr[10],
 
                               waddr_reg_clr && devclrn && devpor,
 
                               1'b1
 
                              );
 
    
 
    flex10ke_dffe     raddrreg_0      (raddr_reg[0],
 
                              raddr_clk,
 
                              raddren,
 
                              raddr[0],
 
                              raddr_reg_clr && devclrn && devpor,
 
                              1'b1
 
                             );
 
    flex10ke_dffe     raddrreg_1      (raddr_reg[1],
 
                              raddr_clk,
 
                              raddren,
 
                              raddr[1],
 
                              raddr_reg_clr && devclrn && devpor,
 
                              1'b1
 
                             );
 
    flex10ke_dffe     raddrreg_2      (raddr_reg[2],
 
                              raddr_clk,
 
                              raddren,
 
                              raddr[2],
 
                              raddr_reg_clr && devclrn && devpor,
 
                              1'b1
 
                             );
 
    flex10ke_dffe     raddrreg_3      (raddr_reg[3],
 
                              raddr_clk,
 
                              raddren,
 
                              raddr[3],
 
                              raddr_reg_clr && devclrn && devpor,
 
                              1'b1
 
                             );
 
    flex10ke_dffe     raddrreg_4      (raddr_reg[4],
 
                              raddr_clk,
 
                              raddren,
 
                              raddr[4],
 
                              raddr_reg_clr && devclrn && devpor,
 
                              1'b1
 
                             );
 
    flex10ke_dffe     raddrreg_5      (raddr_reg[5],
 
                              raddr_clk,
 
                              raddren,
 
                              raddr[5],
 
                              raddr_reg_clr && devclrn && devpor,
 
                              1'b1
 
                             );
 
    flex10ke_dffe     raddrreg_6      (raddr_reg[6],
 
                              raddr_clk,
 
                              raddren,
 
                              raddr[6],
 
                              raddr_reg_clr && devclrn && devpor,
 
                              1'b1
 
                             );
 
    flex10ke_dffe     raddrreg_7      (raddr_reg[7],
 
                              raddr_clk,
 
                              raddren,
 
                              raddr[7],
 
                              raddr_reg_clr && devclrn && devpor,
 
                              1'b1
 
                             );
 
    flex10ke_dffe     raddrreg_8      (raddr_reg[8],
 
                              raddr_clk,
 
                              raddren,
 
                              raddr[8],
 
                              raddr_reg_clr && devclrn && devpor,
 
                              1'b1
 
                             );
 
    flex10ke_dffe     raddrreg_9      (raddr_reg[9],
 
                              raddr_clk,
 
                              raddren,
 
                              raddr[9],
 
                              raddr_reg_clr && devclrn && devpor,
 
                              1'b1
 
                             );
 
    flex10ke_dffe     raddrreg_10     (raddr_reg[10],
 
                              raddr_clk,
 
                              raddren,
 
                              raddr[10],
 
                              raddr_reg_clr && devclrn && devpor,
 
                              1'b1
 
                             );
 
       
 
    flex10ke_asynch_mem flexmem (datain_int_delayed,
 
                                 we_int_delayed,
 
                                 re_int,
 
                                 raddr_int,
 
                                 waddr_int_delayed,
 
                                 modesel,
 
                                 dataout_int
 
                                );
 
    
 
    defparam
 
        flexmem.address_width       = address_width,
 
        flexmem.bit_number          = bit_number,
 
        flexmem.logical_ram_depth   = logical_ram_depth,
 
        flexmem.first_address       = first_address,
 
        flexmem.last_address        = last_address,
 
        flexmem.write_logic_clock   = write_logic_clock,
 
        flexmem.read_enable_clock   = read_enable_clock,
 
        flexmem.data_out_clock      = data_out_clock,
 
        flexmem.infile              = init_file,
 
        flexmem.operation_mode      = operation_mode,
 
        flexmem.mem1                = mem1,
 
        flexmem.mem2                = mem2,
 
        flexmem.mem3                = mem3,
 
        flexmem.mem4                = mem4;
 
     
 
    assign dataout = dataout_tmp;
 
 
 
endmodule // flex10ke_ram_slice
 
 
 
/////////////////////////////////////////////////////////////////////////////
 
//
 
// Module Name : FLEX10KE_PLL
 
//
 
// Description : Simulation model for the FLEX10KE device family PLL.
 
//
 
/////////////////////////////////////////////////////////////////////////////
 
 
 
`timescale 1 ns / 1 ps
 
module flex10ke_pll (clk,
 
                     clk0,
 
                     clk1,
 
                     locked
 
                    );
 
 
 
    // INPUT PORTS
 
    input clk;
 
 
 
    // OUTPUT PORTS
 
    output clk0;
 
    output clk1;
 
    output locked;
 
 
 
    // GLOBAL PARAMETERS
 
    parameter clk0_multiply_by = 1;
 
    parameter clk1_multiply_by = 1;
 
    parameter input_frequency = 1000;
 
 
 
    // INTERNAL VARIABLES AND NETS
 
    reg start_inclk;
 
    reg new_inclk0;
 
    reg new_inclk1;
 
    reg pll_lock;
 
    reg clkout0_tmp;
 
    reg clkout1_tmp;
 
    reg locked_tmp;
 
 
 
    real pll_last_rising_edge;
 
    real pll_last_falling_edge;
 
    real actual_clk_cycle;
 
    real expected_clk_cycle;
 
    real pll_duty_cycle;
 
    real pll1_half_period;
 
    real pll2_half_period;
 
 
 
    integer pll_rising_edge_count;
 
    integer clk0_count;
 
    integer clk1_count;
 
    integer i;
 
    integer j;
 
 
 
    specify
 
 
 
    endspecify
 
 
 
    initial
 
    begin
 
        clk0_count = -1;
 
        clk1_count = -1;
 
        pll_rising_edge_count = 0;
 
        pll_lock = 1;
 
        clkout0_tmp = 1'b0;
 
        clkout1_tmp = 1'b0;
 
        locked_tmp = 1'b0;
 
 
 
        // resolve the parameters
 
 
 
        if (clk0_multiply_by > clk1_multiply_by)
 
            $display("");
 
    end
 
 
 
    always @(posedge clk)
 
    begin
 
        if (pll_rising_edge_count == 0)   // this is first rising edge
 
            start_inclk = clk;
 
        else if (pll_rising_edge_count == 1) // this is second rising edge
 
        begin
 
            expected_clk_cycle = input_frequency / 1000.0; // convert to ns
 
            actual_clk_cycle = $realtime - pll_last_rising_edge;
 
            if (actual_clk_cycle < (expected_clk_cycle - 1.0) ||
 
                actual_clk_cycle > (expected_clk_cycle + 1.0))
 
            begin
 
                $display($realtime, "Warning: Input frequency Violation");
 
                pll_lock = 0;
 
                locked_tmp = 0;
 
            end
 
            if ( ($realtime - pll_last_falling_edge) < (pll_duty_cycle - 0.1) ||                 ($realtime - pll_last_falling_edge) > (pll_duty_cycle + 0.1) )
 
            begin
 
                $display($realtime, "Warning: Duty Cycle Violation");
 
                pll_lock = 0;
 
                locked_tmp = 0;
 
            end
 
        end
 
        else if ( ($realtime - pll_last_rising_edge) < (actual_clk_cycle - 0.1) ||
 
                ($realtime - pll_last_rising_edge) > (actual_clk_cycle + 0.1) )
 
        begin
 
            $display($realtime, "Warning : Cycle Violation");
 
            pll_lock = 0;
 
            locked_tmp = 0;
 
        end
 
        pll_rising_edge_count = pll_rising_edge_count + 1;
 
        pll_last_rising_edge = $realtime;
 
    end
 
 
 
    always @(negedge clk)
 
    begin
 
        if (pll_rising_edge_count == 1)
 
        begin
 
            pll1_half_period = ($realtime - pll_last_rising_edge)/clk0_multiply_by;
 
            pll2_half_period = ($realtime - pll_last_rising_edge)/clk1_multiply_by;
 
            pll_duty_cycle = $realtime - pll_last_rising_edge;
 
        end
 
        else if ( ($realtime - pll_last_rising_edge) < (pll_duty_cycle - 0.1) ||
 
                  ($realtime - pll_last_rising_edge) > (pll_duty_cycle + 0.1) )
 
        begin
 
            $display($realtime, "Warning: Duty Cycle Violation");
 
            pll_lock = 0;
 
            locked_tmp = 0;
 
        end
 
        pll_last_falling_edge = $realtime;
 
    end
 
 
 
    always @(pll_rising_edge_count)
 
    begin
 
        if (pll_rising_edge_count > 2)
 
        begin
 
            for (i=1; i<= 2*clk0_multiply_by - 1; i=i+1)
 
            begin
 
                clk0_count = clk0_count + 1;
 
                #pll1_half_period;
 
            end
 
            clk0_count = clk0_count + 1;
 
        end
 
        else
 
            clk0_count = 0;
 
    end
 
 
 
    always @(pll_rising_edge_count)
 
    begin
 
        if (pll_rising_edge_count > 2)  // pll locks after 2 cycles
 
        begin
 
            for (j=1; j<= 2*clk1_multiply_by - 1; j=j+1)
 
            begin
 
                clk1_count = clk1_count + 1;
 
                #pll2_half_period;
 
            end
 
            clk1_count = clk1_count + 1;
 
        end
 
        else
 
            clk1_count = 0;
 
    end
 
 
 
    always @(clk0_count)
 
    begin
 
        if (clk0_count <= 0)
 
            clkout0_tmp = 1'b0;
 
        else if (pll_lock == 0)
 
            clkout0_tmp = 1'b0;
 
        else if (clk0_count == 1)
 
        begin
 
            locked_tmp = 1'b1;
 
            clkout0_tmp = start_inclk;
 
            new_inclk0 = ~start_inclk;
 
        end
 
        else
 
        begin
 
            clkout0_tmp = new_inclk0;
 
            new_inclk0 = ~new_inclk0;
 
        end
 
    end
 
 
 
    always @(clk1_count)
 
    begin
 
        if (clk1_count <= 0)
 
            clkout1_tmp = 1'b0;
 
        else if (pll_lock == 0)
 
            clkout1_tmp = 1'b0;
 
        else if (clk1_count == 1)
 
        begin
 
            locked_tmp = 1'b1;
 
            clkout1_tmp = start_inclk;
 
            new_inclk1 = ~start_inclk;
 
        end
 
        else
 
        begin
 
            clkout1_tmp = new_inclk1;
 
            new_inclk1 = ~new_inclk1;
 
        end
 
    end
 
 
 
    // ACCELERATE OUTPUTS
 
    assign clk0 = clkout0_tmp;
 
    assign clk1 = clkout1_tmp;
 
    assign locked = locked_tmp;
 
 
 
endmodule