home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1996 September / pcwk_09_96.iso / demo / elmark / cupl / manual / ug5.txt < prev   
Text File  |  1992-01-17  |  102KB  |  2,278 lines

  1. .C1.DESIGN EXAMPLES              U5
  2.  
  3.     This chapter provides examples of using CUPL and CSIM. It is divided 
  4.     into two parts.
  5.  
  6.     Part A provides step-by-step instructions through a sample design 
  7.     session. Part B describes some of the designs that can be 
  8.     implemented with the logic description files provided with the CUPL 
  9.     package.
  10.  
  11.    .c2.PART A.  SAMPLE DESIGN SESSION
  12.  
  13.     This part provides step-by-step instructions through a sample design 
  14.     session using CUPL and CSIM. The steps in the process are:
  15.  
  16.         Step 1.        Examining the Design Task
  17.         Step 2.        Creating the CUPL Source File
  18.         Step 3.        Formulating the Equations
  19.         Step 4.        Choosing a Target Device
  20.         Step 5.        Making the Pin Assignments
  21.         Step 6.        Running CUPL
  22.         Step 7.        Creating the CSIM Source File
  23.         Step 8.        Running CSIM
  24.  
  25. o   .c3.STEP 1.   EXAMINING THE   DESIGN TASK
  26.     The system in this programmable logic device (PLD) design example is
  27.     microprocessor-based, with the CPU interfacing with ROM and RAM. 
  28.     Figure U5-1 shows a diagram of the system.
  29.  
  30.           [Picture]
  31.      Figure U5-1.  Microprocessor-Based System
  32.  
  33.     A PLD provides a flexible interface between the CPU and peripherals 
  34.     by performing address decoding and timing control functions. As the 
  35.     diagram shows, a ROM (or PROM) is used for system control and two 
  36.     static RAMs are used for scratch pad and auxiliary memory functions.
  37.  
  38.     In this sample session, a PLD will be designed that decodes the 
  39.     CPU's address using a memory map, and creates chip select signals 
  40.     for the ROM and RAM chips based upon CPU address and CPU data 
  41.     strobes.
  42.  
  43.     The memory map in Figure U5-2 shows where the ROM and two RAM chips 
  44.     reside in the CPU's addressing space.
  45.  
  46.  
  47.         [Picture]
  48.      Figure U5-2. Memory Map
  49.  
  50.     Addresses are marked and shown in hexadecimal in the memory map.  
  51.     Use this memory map when designing the logic for the PLD.
  52.  
  53.     Because the ROM chip is slow, the PLD must be designed to perform a 
  54.     wait state generation that adds at least one CPU clock period to the 
  55.     ROM access.
  56.  
  57.     The worm arrows on the timing diagram in Figure U5-3 show signals 
  58.     affected or created by other signals.
  59.  
  60.     [Picture]
  61.      Figure U5-3. Wait State Generator Timing Diagram
  62.  
  63.     A description of the operation of the timing diagram follows.  The 
  64.     numbers in parentheses indicate the rising edge of the CLOCK signal.
  65.  
  66.     A wait state sequence starts with the CPU address becoming valid 
  67.     prior to the memory read strobe. Only the !MEMR signal needs to be 
  68.     considered, because the wait state is generated only for the ROM.
  69.  
  70.     When the !MEMR strobe is active for an address corresponding to the 
  71.     ROM, the !ROM_CS signal is asserted and turns on the three-state 
  72.     buffer, driving the CPU READY signal LO, (indicating not ready, or 
  73.     wait). The next rising edge of the CPU clock (1) after !ROM_CS 
  74.     becomes active and sets the WAIT1 signal.  After one CPU clock 
  75.     period passes, the WAIT2 signal is asserted (2); the wait state 
  76.     period (one CPU clock) is completed, causing the CPU READY signal to 
  77.     be driven HI, which causes the CPU to continue its read cycle and 
  78.     remove the !MEMR strobe at the appropriate time.  The !ROM_CS signal 
  79.     is negated, disabling the three-state buffer driving the ready 
  80.     signal and, at the next rising edge of the CPU clock (3), causing 
  81.     WAIT1 and WAIT2 to be reset.  The wait state generator is now 
  82.     prepared for the next CPU access time.
  83.  
  84.  
  85. o   .c3.STEP 2.   CREATING A CUPL   SOURCE FILE
  86.  
  87.     In this step, a logic description file will be created to describe 
  88.     the design for the PLD.  The logic description file serves as input 
  89.     to CUPL, which compiles the design for downloading to a device 
  90.     programmer.
  91.  
  92.     To make it easy to set up the required format for the logic 
  93.     description file, CUPL provides a template file, TMPL.PLD, that can 
  94.     be copied into the file being used.  First, choose a name for the 
  95.     file that reflects the use being designed for the PLD.  Since this 
  96.     is a sample session, use the name SAMPLE.PLD. Copy TMPL.PLD to 
  97.     SAMPLE.PLD, by typing:
  98.  
  99.                    copy tmpl.pld sample.pld [Enter]
  100.    
  101.      ========================================================
  102.    Note
  103.      To move more quickly through this design example, it is not 
  104.      necessary to actually create and edit the SAMPLE.PLD file.  The 
  105.      CUPL package provides a sample file, WAITGEN.PLD, that can be used 
  106.      instead.
  107.      ========================================================
  108.  
  109.      A completed SAMPLE.PLD file is shown here to explain the different 
  110.      sections of the file. This is followed by step-by step instructions 
  111.      for creating SAMPLE.PLD.
  112.  
  113.                 [Picture]
  114.      Figure U5-4.  Source File Example
  115.  
  116.     Use a text editor in non-document mode to open SAMPLE.PLD.
  117.  
  118.     Figure U5-5 shows the template information that has been copied into 
  119.     the file.
  120.  
  121. -----------------------------------------------------------------------
  122.                                 TEMPLATE FILE
  123.        Name                  XXXXX;
  124.        Partno                XXXXX;
  125.        Date                  XX/XX/XX;
  126.        Revision              XX;
  127.        Designer              XXXXX;
  128.        Company               XXXXX;
  129.        Assembly              XXXXX;
  130.        Location              XXXXX;
  131.        /***********************************************************/
  132.        /*       */
  133.        /*       */
  134.        /*       */
  135.        /***********************************************************/
  136.        /* Allowable Target Device       */
  137.        /***********************************************************/
  138.        /**  Inputs **/
  139.        Pin       =       ;     /*                        */
  140.        Pin       =       ;     /*                        */
  141.        Pin       =       ;     /*                        */
  142.        Pin       =       ;     /*                        */
  143.        Pin       =       ;     /*                        */
  144.        Pin       =       ;     /*                        */
  145.        Pin       =       ;     /*                        */
  146.        Pin       =       ;     /*                        */
  147.        Pin       =       ;     /*                        */
  148.        Pin       =       ;     /*                        */
  149.        Pin       =       ;     /*                        */
  150.        Pin       =       ;     /*                        */
  151.        Pin       =       ;     /*                        */
  152.        Pin       =       ;     /*                        */
  153.        /** Outputs **/
  154.        Pin       =       ;     /*                        */
  155.        Pin       =       ;     /*                        */
  156.        Pin       =       ;     /*                        */
  157.        Pin       =       ;     /*                        */
  158.        Pin       =       ;     /*                        */
  159.        Pin       =       ;     /*                        */
  160.        Pin       =       ;     /*                        */
  161.        Pin       =       ;     /*                        */
  162.        /**  Declarations and Intermediate  Variable Definitions **/
  163. -----------------------------------------------------------------------
  164.      Figure U5-5. SAMPLE.PLD Template Information
  165.  
  166.     The file can be edited, in order to enter specific header and title 
  167.     information, specify the input and output pins, and write the 
  168.     intermediate and logic equations.
  169.  
  170.     In the header section, replace the XXXs with specific information 
  171.     referring to the company and the PLD being designed. Since this is a 
  172.     sample design, use the information provided (as shown in Figure 
  173.     U5-6) or any other desired information.
  174.  
  175.     Below the header section is a title block with comment symbols (/* 
  176.     and */). In the title block, type in information describing the 
  177.     design, as shown in Figure U5-6.
  178.  
  179.        -------------------------------------------------------------
  180.                                SAMPLE.PLD
  181.        Name                  Sample;
  182.        Partno                P9000183;
  183.        Date                  07/16/87;
  184.        Revision              02;
  185.        Designer              Osann;
  186.        Company               ATI;
  187.        Assembly              PC Memory;
  188.        Location              U106;
  189.  
  190.        /******************************************************/
  191.        /* This device generates chip select signals for one */
  192.        /* 8Kx8 ROM and two 2Kx8 static RAMs. It also drives */
  193.        /* the system READY line to insert a wait-state of at */
  194.        /* least one cpu clock for ROM accesses       */
  195.        /******************************************************/
  196.        -------------------------------------------------------------
  197.      Figure U5-6. SAMPLE.PLD  Header and Title Block
  198.  
  199.  
  200. o   .c3.STEP 3.   FORMULATING THE   EQUATIONS
  201.  
  202.     To make it easier to enter the specific equations for address 
  203.     decoding and wait state generation, first enter equations for 
  204.     intermediate variables.  Intermediate variables are arbitrary names; 
  205.     that is, they do not represent specific pins. Enter the intermediate 
  206.     equations in the space provided in the SAMPLE.PLD file for 
  207.     "Declarations and Intermediate Variable Definitions."
  208.  
  209.     The first intermediate equation to enter is a bit field declaration 
  210.     to define the address bus.  Use the name MEMADR (memory address) to 
  211.     represent the address, and type the equation as follows:
  212.  
  213.               FIELD MEMADR = [A15..11] ;
  214.  
  215.     In the system diagram in Figure U5-1, notice that the chip select 
  216.     signals for the static RAMs are not dependent solely upon address 
  217.     but must be asserted for either the MEMW or MEMR data strobes.
  218.  
  219.     To simplify the equations for the static RAM chip select signals, 
  220.     create a signal called MEMREQ (memory request).  Type the following:
  221.  
  222.               MEMREQ = MEMW # MEMR ;
  223.  
  224.     Whenever MEMREQ is used in other equations, CUPL substitutes MEMW # 
  225.     MEMR when it compiles.
  226.  
  227.     Notice in the timing diagram in Figure U5-3 that the decoding of the 
  228.     address corresponding to the ROM combines with the !MEMR strobe to 
  229.     produce the ROM chip select (ROM_CS), and to initiate the wait state 
  230.     sequence.  Create an intermediate variable, called SELECT_ROM, 
  231.     representing the combination of the !MEMR strobe and the specific 
  232.     address decoding for the ROM's address space, by typing the 
  233.     following:
  234.  
  235.      SELECT_ROM = MEMR & MEMADR :[0000..1FFF] ;
  236.  
  237.     After entering the above intermediate equations, the specific 
  238.     equations for address decoding and wait state generation may be 
  239.     entered.
  240.  
  241.     If the signal ROM_CS, which feeds back into the array, is being used 
  242.     to initiate the wait state timing, an additional pass delay is 
  243.     incurred through the PLD. Because the clock rate is relatively slow 
  244.     (4-8 MHz), in this example the additional delay is not a problem.  
  245.     However, at higher clock rates it is better to recreate the same 
  246.     logic (using the SELECT_ROM intermediate) in the registered logic 
  247.     equations.
  248.  
  249.     Create the ROM chip select (ROM_CS) using the intermediate variable 
  250.     SELECT_ROM, by typing:
  251.  
  252.               ROM_CS = SELECT_ROM ;
  253.  
  254.     The chip-selects for the two RAMs, RAM_CS0 and RAM_CS1, are 
  255.     dependent on MEMREQ and the address bus being within the hexadecimal 
  256.     boundaries taken from the memory map. Use the CUPL .i.range;range 
  257.     operation with the lower and upper boundaries of the desired address 
  258.     range to decode these signals. Type the following:
  259.  
  260.      RAM_CS0 = MEMREQ &   MEMADR   : [2000..27FF];
  261.      RAM_CS1 = MEMREQ &   MEMADR   : [2800..2FFF];
  262.  
  263.     Next, create the equations that relate to the wait state timing and 
  264.     generation.  First, as shown in the timing diagram (Figure U5-3), a 
  265.     signal called WAIT1 is required that responds to the selection of 
  266.     the ROM chip by being set at the next rising edge of the CPU clock. 
  267.     According to the rules for a D-type flip-flop, the logic level at 
  268.     the D input is transferred to the Q output after the clock.  Enter 
  269.     the equation for this signal, where WAIT.D represents the signal at 
  270.     the D input of the flip-flop within the PLD, by typing the 
  271.     following:
  272.  
  273.               WAIT.D = SELECT_ROM & !RESET ;
  274.  
  275.     Notice that in the equation for WAIT1.D, the !RESET signal has been 
  276.     ANDed with the rest of the equation to perform a synchronous reset 
  277.     when the RESET signal is asserted.
  278.  
  279.     Next, create the signal WAIT2 at the next clock edge following the 
  280.     one that causes WAIT1 to set, by making the equation for WAIT2.D 
  281.     dependent on the signal WAIT1.  Since WAIT2.D must reset at the next 
  282.     clock edge following the removal of the CPU's access of the ROM, and 
  283.     the variable, and then select_rom into this equation by typing the 
  284.     following:
  285.  
  286.               WAIT2.D = SELECT_ROM & WAIT1 ;
  287.  
  288.     This creates the signal SELECT_ROM in accordance with the timing 
  289.     diagram (Figure U5-3) to indicate that the three-state buffer should 
  290.     be turned on while the ROM is being decoded and the MEMR data strobe 
  291.     is active.  Therefore, enter the equation for the three-state output 
  292.     by typing the following:
  293.  
  294.               READY.OE = SELECT_ROM ;
  295.  
  296.     While this equation determines when the three-state buffer actually 
  297.     drives its output and leaves the high impedance state, it does not 
  298.     determine which logic level the signal is driven to. The equation 
  299.     for READY determines the logic level to which the signal is driven; 
  300.     the signal should remain inactive at READY until the completion of a 
  301.     wait state period equal to one full CPU clock cycle. As this 
  302.     condition does not occur until WAIT2 becomes set, type the equation 
  303.     for READY as follows:
  304.  
  305.               READY = WAIT2 ;
  306.  
  307. o .c3.STEP 4.  CHOOSING A TARGET DEVICE
  308.     After the equations are completed, the next step is to identify a 
  309.     compatible, commercially available PLD. Points to consider when 
  310.     choosing a target device are:
  311.  
  312.     _      The number of input pins required.
  313.  
  314.     _      The relative number of registered and non-registered output 
  315.            pins.
  316.  
  317.     _      Three-state output control (if required).
  318.  
  319.     _      The number of product terms required to implement the logic 
  320.            function for each equation.
  321.  
  322.     The PLD package  diagram in Figure U5-7 shows pin assignments 
  323.     configured to match up  with a  device similar to a  PAL16R4 or an 
  324.     82S155 IFL.
  325.  
  326.                     [Picture]
  327.      Figure U5-7. Sample Pin Configuration
  328.  
  329.     In the pin configuration in Figure U5-7, the three chip select 
  330.     signals are assigned to I/O type pins that should always be in the 
  331.     output drive mode.  The READY pin, attached to the READY signal on 
  332.     the CPU bus, is used in a controllable three-state mode. The two 
  333.     flip-flops that are needed to implement the wait state generator 
  334.     have been assigned to output pins that are internally connected to 
  335.     registers.
  336.  
  337.     One of the registered outputs could be used to drive the READY 
  338.     signal directly, since the logical function of READY is the same as 
  339.     that of the signal WAIT2.  However, use of the dedicated three-state 
  340.     output enable signal connected to pin 11 of the target device would 
  341.     be required. Since pin 11 controls the three state outputs of all 
  342.     four pins connected to internal registers, this defeats the ability 
  343.     to use the other two registered output pins for any purpose other 
  344.     than wait state generation.
  345.  
  346.     It is better to keep options open by not using the dedicated 
  347.     three-state control, since it is difficult to predict all the 
  348.     changes that might be made during the evolution of a design.  
  349.     Therefore, pin 11 is tied to ground, which always enables the
  350.     three-state outputs coming from the registers.
  351.  
  352.     The PAL16R4 has at least seven product terms available on all 
  353.     outputs, which is an adequate number for this application.  The IFL 
  354.     82S155, which is a second source for this socket position, has a 
  355.     total of thirty-two product terms available for all outputs 
  356.     combined, which is also an adequate number for this application.
  357.  
  358.     The PAL16R4 devices have only D-type flip-flops, whereas the 82S155 
  359.     devices may be configured for either D or JK types.  CUPL 
  360.     automatically chooses a D-type flip flop configuration because the 
  361.     equations entered for WAIT1 and WAIT2 in step 3 specified the .D 
  362.     extension.
  363.  
  364. o   .c3.STEP 5.   MAKING THE PIN   ASSIGNMENTS
  365.  
  366.     Match the pin assignments to the pins in Figure U5-7 for a PAL16R4 
  367.     or 82S155 device.  First, in SAMPLE.PLD in the comment space labeled 
  368.     "Allowable Target Device Types," type:
  369.  
  370.               pal16r4, 82s155 [Enter]
  371.  
  372.     To ensure consistent documentation when making the pin assignments, 
  373.     be certain that the signal polarities (signal levels) assigned are 
  374.     the same as those in the logic schematic.
  375.  
  376.     Make the pin assignments as shown in Figure U5-8.
  377.  
  378.     --------------------------------------------------------------
  379.                           SAMPLE PIN ASSIGNMENTS
  380.        /**  Inputs **/
  381.        Pin 1      = cpu_clk  ;        /* CPU clock             */
  382.        Pin [2..6] = [a15..11] ;       /* CPU Address Bus       */
  383.        Pin [7,8]  = ![memw,memr] ;    /* Memory Data Strobes   */
  384.        Pin 9      = reset    ;        /* System Reset          */
  385.        Pin 11     = !oe      ;        /* Output Enable         */
  386.  
  387.        /** Outputs **/
  388.        Pin 19     = !rom_cs   ;       /* ROM Chip select       */
  389.        Pin 18     = ready     ;       /* CPU Ready signal      */
  390.        Pin 15     = wait1     ;       /* Start wait state      */
  391.        Pin 14     = wait2     ;       /* End wait state        */
  392.        Pin [13,12] = ![ram_cs1..0] ;  /* RAM Chip selects      */
  393.     --------------------------------------------------------------
  394.     Figure U5-8.  SAMPLE.PLD Pin Assignments
  395.  
  396.     After making all the pin assignments, delete the extra "pin = ;" 
  397.     lines provided by the template file.
  398.  
  399.     Figure U5-9 shows the completed logic description file, SAMPLE.PLD.
  400.  
  401.     --------------------------------------------------------------
  402.                  SAMPLE.PLD
  403.        Name                  Sample;
  404.        Partno                P9000183;
  405.        Date                  07/16/87;
  406.        Revision              02;
  407.        Designer              Osann;
  408.        Company               ATI;
  409.        Assembly              PC Memory;
  410.        Location              U106;
  411.        /******************************************************/
  412.        /* This device generates chip select signals for one */
  413.        /* 8Kx8 ROM and two 2Kx8 static RAMs. It also drives */
  414.        /* the system READY line to insert a wait-state of at */
  415.        /* least one cpu clock for ROM accesses       */
  416.        /******************************************************/
  417.        /******************************************************/
  418.        /** Allowable Target Device Types :  PAL16R4, 82S155 **/
  419.        /******************************************************/
  420.        /**  Inputs **/
  421.        Pin 1      = cpu_clk  ;    /* CPU clock                      */
  422.        Pin [2..6] = [a15..11] ;   /* CPU Address Bus                */
  423.        Pin [7,8]  = ![memw,memr] ;/* Memory Data Strobes (low-true) */
  424.        Pin 9      = reset    ;    /* System Reset                   */
  425.        Pin 11     = !oe      ;    /* Output Enable (active low)     */
  426.  
  427.        /** Outputs **/
  428.        Pin 19     = !rom_cs   ;     /* ROM chip select (low-true)  */
  429.        Pin 18     = ready     ;     /* CPU ready                   */
  430.        Pin 15     = wait1     ;     /* Wait state 1                */
  431.        Pin 14     = wait2     ;     /* Wait state 2                */
  432.        Pin [13,12] = ![ram_cs1..0] ; /* RAM chip select (low-true) */
  433.  
  434.        /** Declarations and Intermediate Variable Definitions        */
  435.        Field memadr = [a15..11] ;    /* Give the address bus         */
  436.                                       /* the Name "memadr"           */
  437.        memreq = memw # memr ;         /* Create the intermediate     */
  438.                                       /* variable "memreq"           */
  439.        select_rom = memr & memadr:[0000..1FFF] ; /* = rom_cs         */
  440.  
  441.        /** Logic Equations **/
  442.        rom_cs = select_rom;
  443.        ram_cs0 = memreq & memadr:[2000..27FF] ;
  444.        ram_cs1 = memreq & memadr:[2800..2FFF] ;
  445.  
  446.        /* read as: when select_rom is true and  reset is false */
  447.        wait1.d = select_rom & !reset ;
  448.  
  449.        /* read as: when when select_rom is true and wait1 is true */
  450.                                        /* Synchronous Reset */
  451.        wait2.d = select_rom & wait1 ;  /* wait1 delayed */
  452.        ready.oe = select_rom ;  /* Turn Buffer off */
  453.        ready = wait2 ; /* end wait */
  454.     --------------------------------------------------------------
  455.     Figure U5-9.  SAMPLE.PLD File
  456.  
  457. o .c3.STEP 6.  RUNNING CUPL
  458.     When running CUPL, specify the target PLD, the source logic 
  459.     description file, and option flags to enable specific output files. 
  460.     In this step, compile the logic description file SAMPLE.PLD for the 
  461.     target device PAL16R4, and create the following output files:
  462.  
  463.     SAMPLE.ABS (-a flag) - This is the absolute file for later use by 
  464.     CSIM, the CUPL simulator (This file is needed for step 7).  It 
  465.     contains a condensed representation of the logical function to be 
  466.     programmed into a device.  CSIM compares this representation to test 
  467.     vectors in a user-created input file to determine whether the 
  468.     response vectors in the input file are a correct response to the 
  469.     stimulus vectors.
  470.  
  471.     SAMPLE.DOC (-x, and -f flags) - This is the documentation file.  It 
  472.     provides fully expanded product terms for both intermediate and 
  473.     output pin variables, and a fuse plot and chip diagram.
  474.  
  475.     SAMPLE.LST (-l flag) - This is the list file.  It is a recreation of 
  476.     the description file, except line numbers have been added and any 
  477.     error messages generated during compilation are appended at the end 
  478.     of the file.
  479.  
  480.     SAMPLE.JED (-j flag) - This is a JEDEC file for downloading to a 
  481.     device programmer. It contains a fuse pattern but no test vectors.
  482.  
  483.    ========================================================
  484.    Note
  485.      The SAMPLE.JED filename is determined by the NAME field in the 
  486.      header information section of the logic description file. When only 
  487.      one device is described in the file, be certain to use the same 
  488.      name (in this case, SAMPLE) as the filename.
  489.    ========================================================
  490.  
  491.     To begin to compile and create the files described above, type the 
  492.     following .i.command line;command line:
  493.  
  494.         cupl -jaxfl p16r4 sample [Enter]
  495.  
  496.  
  497.    ========================================================
  498.    Note
  499.      If SAMPLE.PLD has not been created, type WAITGEN instead of SAMPLE 
  500.      to specify the sample file, WAITGEN.PLD, provided by CUPL.  The 
  501.      filename for all output files created by CUPL is WAITGEN instead of 
  502.      SAMPLE.
  503.    ========================================================
  504.  
  505.  
  506.     The following messages appear on the screen, indicating how much 
  507.     time each CUPL module takes for completion.  The actual time will 
  508.     vary depending on the system being used.
  509.  
  510.         CUPL: Universal Compiler for Programmable Logic
  511.         Version 4.XX Serial # XX-XXX-XXXX
  512.         Copyright (C) 1983, 1990 Logical Devices, Inc.
  513.         cuplx
  514.         time: 2 secs
  515.         cupla 
  516.         time: 2 secs
  517.         cuplb 
  518.         time: 2 secs
  519.         cuplm 
  520.         time: 1 secs
  521.         cuplc
  522.         time: 5 secs
  523.         total time: 12 secs
  524.  
  525.     When the prompt appears, compilation is complete.  SAMPLE.LST and 
  526.     SAMPLE.DOC are ASCII files, so it is possible to display them on the 
  527.     screen, open them with a text editing program, or print a hard copy 
  528.     of their contents.
  529.  
  530.     The list file, SAMPLE.LST, is essentially a recreation of the source 
  531.     file with line numbers inserted and any error messages attached to 
  532.     the end. The line numbers facilitate the quick locating of error 
  533.     sources, if any are detected by CUPL.  Figure U5-10 shows the 
  534.     contents of SAMPLE.LST.
  535.  
  536.    ---------------------------------------------------------------------
  537.                                SAMPLE.LST
  538.        CUPL Version 4.XX Serial # XX-XXX-XXXX
  539.        Copyright (C) 1983,1990 Logical Devices,Inc.
  540.        CREATED Thur Jan 14 08:42:12 1990
  541.        LISTING FOR LOGIC DESCRIPTION FILE: sample.pld;
  542.        1:Name                  Sample;
  543.        2:Partno                P9000183;
  544.        3:Date                  07/16/87;
  545.        4:Revision              02;
  546.        5:Designer              Osann;
  547.        6:Company               ATI;
  548.        7:Assembly              PC Memory;
  549.        8:Location              U106;
  550.        9:
  551.        10:/******************************************************/
  552.        11:/* This device generates chip select  signals for one */
  553.        12:/* 8Kx8 ROM and two 2Kx8 static RAMs.  It also drives */
  554.        13:/* the system READY line to insert a wait-state of at */
  555.        14:/* least one cpu clock for ROM accesses               */
  556.        15:/******************************************************/
  557.        16:/******************************************************/
  558.        17:/** Allowable Target Device Types :  PAL16R4, 82S155 **/
  559.        18:/******************************************************/
  560.        19:/**  Inputs **/
  561.        20:
  562.        21:Pin 1      = cpu_clk  ;     /* CPU clock              */
  563.        22:Pin [2..6] = [a15..11] ;    /* CPU Address Bus        */
  564.        23:Pin [7,8]  = ![memw,memr] ; /* Memory Data Strobes    */
  565.        24:Pin 9      = reset    ;     /* System Reset           */
  566.        25:Pin 11     = !oe      ;     /* Output Enable          */
  567.        26:
  568.        27:/** Outputs **/
  569.        28:
  570.        29:Pin 19     = !rom_cs   ;     /*        */
  571.        30:Pin 18     = ready     ;     /*        */
  572.        31:Pin 15     = wait1     ;     /*        */
  573.        32:Pin 14     = wait2     ;     /*        */
  574.        33:Pin [13,12] = ![ram_cs1..0] ;  /*       */
  575.        34:
  576.        35:/** Declarations and Intermediate Variable Definitions */
  577.        36:
  578.        37:Field memadr = [a15..11] ;    /* Give the address bus    */
  579.        38:                               /* the Name "memadr"      */
  580.        39:
  581.        40:memreq = memw # memr ;         /*Create the intermediate    */
  582.        41:                               /*variable "memreq"          */
  583.        42:
  584.        43:select_rom = memr & memadr:[0000..1FFF];  /* = rom_cs   */
  585.        44:
  586.        45:/** Logic Equations **/
  587.        46:
  588.        47:rom_cs = select_rom;
  589.        48:ram_cs0 = memreq & memadr:[2000..27FF] ;
  590.        49:ram_cs1 = memreq & memadr:[2800..2FFF] ;
  591.        50:wait1.d = select_rom & !reset ;
  592.        51:                                /* Synchronous Reset */
  593.        52:wait2.d = select_rom & wait1 ;  /* wait1 delayed     */
  594.        53:ready.oe = select_rom ;  /* Turn Buffer off */
  595.        54:ready = wait2 ; /* end wait */
  596.        Jedec Fuse Checksum     (4D50)
  597.        Jedec Transmit Checksum (E88F)
  598.    ---------------------------------------------------------------------
  599.    Figure U5-10. SAMPLE.LST
  600.  
  601.     Figure U5-11 shows the documentation file, SAMPLE.DOC, created by 
  602.     CUPL.
  603.  
  604.  
  605.    ---------------------------------------------------------------------
  606.                                 SAMPLE.DOC
  607.  ************************************************************************
  608.                                  Sample
  609.  ************************************************************************
  610.        CUPL                  4.XX Serial# XX-XXX-XXXX
  611.        Device                p16r4 Library DLIB-d-26-11
  612.        Created               Mon Aug 20 10:48:32 1990
  613.        Name                  Sample;
  614.        Partno                P9000183;
  615.        Date                  04/1/90;
  616.        Revision              02;
  617.        Designer              Osann;
  618.        Company               ATI;
  619.        Assembly              PC Memory;
  620.        Location              U106;
  621.  ========================================================================
  622.                        Expanded Product Terms
  623.  ========================================================================
  624.        wait1.d =>
  625.            !memr
  626.            # a15
  627.            # a14
  628.            # a13
  629.            # reset
  630.  
  631.        select_rom =>
  632.              !a13 & !a14 & !a15 & memr
  633.  
  634.        wait2.d =>
  635.            !memr
  636.            # a15
  637.            # a14
  638.            # a13
  639.            !wait
  640.  
  641.        memadr =>
  642.              a15,a14,a13,a12,a11
  643.        ready =>
  644.              !wait2
  645.        ready.oe =>
  646.              !a13 & !a14 & !a15 & memr
  647.        rom_cs =>
  648.              !a13 & !a14 & !a15 & memr
  649.  
  650.      Figure U5-11.  SAMPLE.DOC Sheet 1 of 4
  651.  
  652.        memreq =>
  653.           memw  # memr
  654.  
  655.        ram_cs0 =>
  656.           !a11 & !a12 & !a13 & !a14 & !a15 & memw
  657.           # !a11 & !a12 & !a13 & !a14 & !a15 & memr
  658.  
  659.        ram_cs1 =>
  660.           a11 & !a12 & a13 & !a14 & !a15 & memw  
  661.         # a11 & !a12 & a13 & !a14 & !a15 & memr
  662.  
  663.         rom_cs.oe =>
  664.            1
  665.  
  666.         ram_cs0.oe =>
  667.           1
  668.  
  669.         ram_cs1.oe =>
  670.           1
  671.  
  672. ==============================================================================
  673.                                  Symbol Table
  674. ==============================================================================
  675. Pin Variable                          Pterms  Max     Min 
  676. Pol  Name       Ext     Pin     Type     Used    Pterms  Level
  677. --- --------    ---     ---     ----    ------   ------  ------   
  678.     wait1               15       V        -        -      -   
  679.     wait1       d       15       X        5        8      1
  680.     a11                 6        V        -        -   
  681.     select_rom                   I        1        -      -
  682.     wait2               14       V        -        -      -
  683.     wait2       d       14       X        5        8      1
  684.     a12                 5        V        -        -   
  685.     a13                 4        V        -        -      -   
  686.     a14                 3        V        -        -      -   
  687.     a15                 2        V        -        -      - 
  688.  !  oe                  11       V        -        -      - 
  689.  !  memr                8        V        -        -      -
  690.     memadr              0        F        -        -      -
  691.     ready               18       V        1        7      1
  692.     ready       oe      18       X        1        1      1
  693.  !  memw                7        V        -        -      -   
  694.     cpu_clk             1        V        -        -      - 
  695.  !  rom_cs              19       V        1        7      1
  696.     reset               9        V        -        -      - 
  697.     memreq              0        I        2        -      - 
  698.  !  ram_cs0             12       V        2        7       1 
  699.  !  ram_cs1             13       V        2        7       1   
  700.     rom_cs      oe      19       D        1        1       0 
  701.     ram_cs0     oe      12       D        1        1       0   
  702.     ram_cs1     oe      13       D        1        1       0 
  703.  
  704. LEGEND    F : field    D : default
  705. M : extended node N : node     I : Intermediate variable
  706. T : function V : variable X : extended variable
  707. U : undefined Figure U5-11. Sheet 2 of
  708.     4
  709.  
  710.   ================================================================                   `
  711.                            Fuse Plot
  712.   ================================================================
  713.   Pin #19 
  714. 0000  -------------------------------- 
  715. 0032  -x---x---x---------------x------ 
  716. 0064  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  717. 0096  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  718. 0128  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  719. 0160  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  720. 0192  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  721. 0224  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  722.   Pin #18 
  723. 0256  -x---x---x---------------x------ 
  724. 0288  -----------------------x-------- 
  725. 0320  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  726. 0352  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  727. 0384  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  728. 0416  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  729. 0448  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  730. 0480  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxPin #17 
  731. 0512  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  732. 0544  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  733. 0578  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  734. 0608  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  735. 0640  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  736. 0672  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  737. 0704  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  738. 0738  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  739.   Pin #16 
  740. 0768  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  741. 0800  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  742. 0832  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  743. 0864  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  744. 0896  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  745. 0928  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  746. 0960  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  747. 0992  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  748.   Pin #15 
  749. 1024  ------------------------x------- 
  750. 1056  x------------------------------- 
  751. 1088  ----x--------------------------- 
  752. 1120  --------x----------------------- 
  753. 1152  ----------------------------x--- 
  754. 1184  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  755. 1216  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  756. 1248  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  757.   Pin #14 
  758. 1280  ------------------------x------- 
  759. 1312  x------------------------------- 
  760. 1344  ----x--------------------------- 
  761. 1378  --------x----------------------- 
  762. 1408  -------------------x------------ 
  763. 1440  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  764. 1472  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  765. 1504  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  766.  
  767.      Figure U5-11. Sheet 3 of 4
  768.  
  769.   Pin #13
  770. 1536  --------------------------------
  771. 1568  -x---x--x----x--x----x----------
  772. 1600  -x---x--x----x--x--------x------ 
  773. 1632  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  774. 1664  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  775. 1696  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  776. 1728  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  777. 1760  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  778.   Pin #12 
  779. 1792  -------------------------------- 
  780. 1824  -x---x--x----x---x---x---------- 
  781. 1856  -x---x--x----x---x-------x------ 
  782. 1888  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  783. 1920  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  784. 1952  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  785. 1984  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  786. 2016  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  787. ========================================================================                            
  788.                                 Chip Diagram
  789. ========================================================================
  790.              --------------
  791.              |  WAITGEN   |                    
  792. cpu_clk  x---| 1       20 |---x VCC
  793.              |            |                        
  794. a15      x---| 2       19 |---x !rom_cs
  795.              |            |                        
  796. a14      x---| 3       18 |---x ready
  797.              |            |                        
  798. a13      x---| 4       17 |---x
  799.              |            |                        
  800. a12      x---| 5       16 |---x
  801.              |            |                        
  802. a11      x---| 6       15 |---x wait1
  803.              |            |                      
  804. !memw    x---| 7       14 |---x wait2
  805.              |            |                      
  806. !memr    x---| 8       13 |---x !ram_cs1
  807.              |            |                      
  808. reset    x---| 9       12 |---x !ram_cs0
  809.              |            |                        
  810. GND      x---|10       11 |---x !oe
  811.              |            |
  812.              --------------
  813.    ---------------------------------------------------------------------
  814.      Figure U5-11. Sheet  4 of 4
  815.  
  816.     The expanded product terms for WAIT1.D and WAIT2.D show five product 
  817.     terms, because the fixed inverting output buffer (active-LO 
  818.     architecture) in the PAL16R4 causes CUPL to perform DeMorgan's 
  819.     Theorem on equations when an output variable has been declared as 
  820.     active-HI in the pin list for this particular device.
  821.  
  822. o   .c3.STEP 7.   CREATING A CSIM   SOURCE FILE
  823.     In this step, a simulation will be performed to verify the compiled 
  824.     design for the PAL16R4 device.  Performing this step before 
  825.     downloading to a logic programmer decreases the probability of 
  826.     programming a device with incorrect logic.  Create a source 
  827.     specification file, SAMPLE.SI, containing test vectors for input to 
  828.     CSIM. CSIM compares the test vector inputs and expected outputs to 
  829.     the actual values contained in the SAMPLE.ABS file that was created 
  830.     during CUPL operation, and flags any discrepancies.
  831.  
  832.     Figure U5-12 shows the contents of a sample source specification 
  833.     file.
  834.  
  835.       ----------------------------------------------------------------
  836.        Name                  Sample;
  837.        Partno                P9000183;
  838.        Date                  07/16/87;
  839.        Revision              02;
  840.        Designer              Osann;
  841.        Company               ATI;
  842.        Assembly              PC Memory;
  843.        Location              U106;
  844.        /******************************************************/
  845.        /* This device generates chip select  signals for one */
  846.        /* 8Kx8 ROM and two 2Kx8 static RAMs. It  also drives */
  847.        /* the system READY line to insert a wait-state of at */
  848.        /* least one cpu clock for ROM accesses               */
  849.        /******************************************************/
  850.        ORDER: cpu_clk, %2, a15, %2, a14, %2, a13, %2, a12, %2, a11, %2,
  851.            !memw, %2, !memr, %2, reset, %2, !oe,
  852.            %4, !ram_cs1, %2, !ram_cs0, %2, !rom_cs, %2,
  853.            wait1, %2, wait2, %2, ready;
  854.        VECTORS:
  855.           /* 123456-leave six blanks to allow for numbers in .SO file */
  856.        $msg "                              ! !";
  857.        $msg "      c                       r r !";
  858.        $msg "      p                       a a r";
  859.        $msg "      u           ! ! r       m m o w w r";
  860.        $msg "      _           m m e       _ _ m a a e";
  861.        $msg "      c a a a a a e e s !     c c _ i i a";
  862.        $msg "      l 1 1 1 1 1 m m e o     s s c t t d";
  863.        $msg "      k 5 4 3 2 1 w r t e     1 0 s 1 2 y";
  864.        $msg "     ____________________________________________";
  865.        $msg "    Power On Reset       ";
  866.                   O X X X X X 1 1 1 0       H H H * * Z
  867.        $msg "    Reset Flip Flops       ";
  868.                   C X X X X X 1 1 0 0       H H H L L Z
  869.        $msg "    Write RAM0       ";
  870.                   0 0 0 1 0 0 0 1 0 0       H L H L L Z
  871.        $msg "    Read RAM0       ";
  872.                   0 0 0 1 0 0 1 0 0 0       H L H L L Z
  873.        $msg "    Write RAM1       ";
  874.                   0 0 0 1 0 1 0 1 0 0       L H H L L Z
  875.        $msg "    Read RAM1       ";
  876.                   0 0 0 1 0 1 1 0 0 0       L H H L L Z
  877.        $msg "    Begin ROM read       ";
  878.                   0 0 0 0 0 0 1 0 0 0       H H L L L L
  879.        $msg " Two clocks for wait state, Then drive READY High    ";
  880.        $repeat 2;
  881.                   C 0 0 0 0 0 1 0 0 0       H H L * * *
  882.        $msg "    End ROM Read       ";
  883.                   0 0 0 0 0 0 1 1 0 0       H H H H H Z
  884.        $msg "    End ROM Read       ";
  885.                   C 0 0 0 0 0 1 1 0 0       H H H L L Z
  886.       ----------------------------------------------------------------
  887.     Figure U5-12. SAMPLE.SI
  888.  
  889.     The source specification file contains three major parts: header 
  890.     information and title block, an ORDER statement, and a VECTORS 
  891.     statement.
  892.  
  893.     SAMPLE.SI must have the same header information as SAMPLE.PLD to 
  894.     ensure that the proper files, including current revision level, are 
  895.     being compared against each other. Therefore, first copy SAMPLE.PLD 
  896.     to SAMPLE.SI and then use a text editor to delete everything in 
  897.     SAMPLE.SI, except the header and title block. Figure U5-13 shows the 
  898.     result.
  899.  
  900.       ----------------------------------------------------------------
  901.        Name                  Sample;
  902.        Partno                P9000183;
  903.        Date                  07/16/87;
  904.        Revision              02;
  905.        Designer              Osann;
  906.        Company               ATI;
  907.        Assembly              PC Memory;
  908.        Location              U106;
  909.        /******************************************************/
  910.        /* This device generates chip select  signals for one */
  911.        /* 8Kx8 ROM and two 2Kx8 static RAMs. It also drives  */
  912.        /* the system READY line to insert a wait-state of at */
  913.        /* least one cpu clock for ROM accesses               */
  914.        /******************************************************/
  915.  
  916.       ----------------------------------------------------------------
  917.     Figure U5-13.  SAMPLE.SI Header Information
  918.  
  919.     In the ORDER statement, list the input and output variables from 
  920.     SAMPLE.PLD to be included in test vectors. List the variables in the 
  921.     order in which they will be used in test variables; that is, put the 
  922.     clock variable, CPU_CLK, first, followed by the other input 
  923.     variables. Put the output variables to the right. Separate variables 
  924.     with commas.  Use the % symbol to insert spaces between the 
  925.     variables; put two spaces between each variable, and four spaces 
  926.     between the last input variable in the list, !OE, and the first 
  927.     output variable, !RAM_CS1. Type the ORDER statement as follows:
  928.  
  929.     ORDER:  CPU_CLK, %2, A15, %2, A14, %2, A13, %2,A12, %2, ALL, %2, 
  930.          !MEMW, %2, !MEMR, %2, RESET, %2, !OE, %4, !RAM_CS1, %2, 
  931.          !RAM_CSO, %2, !ROM_CS, %2 WAIT1, %2, READY;
  932.  
  933.     Following the ORDER statement, enter a VECTORS statement that 
  934.     creates a function table containing eleven test vectors (see Figure 
  935.     U5-12). First, to make the vectors easier to enter and understand, 
  936.     use the $MSG command to create a heading for the function table. 
  937.     List the variable names in vertical columns in the same order and 
  938.     with the same spacing as specified in the ORDER statement, by typing 
  939.     the information in Figure U5-14.
  940.  
  941.     --------------------------------------------------------------------
  942.           /* 123456-leave six blanks to allow for numbers in .SO file */
  943.        $msg "                             ! !";
  944.        $msg "      c                       r r !";
  945.        $msg "      p                       a a r";
  946.        $msg "      u           ! ! r       m m o w w r";
  947.        $msg "      _           m m e       _ _ m a a e";
  948.        $msg "      c a a a a a e e s !     c c _ i i a";
  949.        $msg "      l 1 1 1 1 1 m m e o     s s c t t d";
  950.        $msg "      k 5 4 3 2 1 w r t e     1 0 s 1 2 y";
  951.        $msg "      ____________________________________________";
  952.     --------------------------------------------------------------------
  953.     Figure  U5-14.   Vectors    Table Header
  954.  
  955.     Now enter the test vectors.  Create the vectors by assigning a value 
  956.     to each of the input variables and an expected value to each of the 
  957.     output variables. Refer to Table 4-4 in Chapter 4, "Using CSIM", for 
  958.     allowable values to use for test vectors.  Use the $MSG directive to 
  959.     describe the device function tested by the function. The ORDER 
  960.     statement above specifies the spacing when creating the test 
  961.     vectors.  For example, create the first vector, Power On Reset, by 
  962.     typing:
  963.  
  964.                    $msg "      Power On Reset ";
  965.                         0 X X X X X 1 1 1 0 H H H * * Z
  966.  
  967.     Note that the output value (*) has been used for WAIT1 and WAIT2 to 
  968.     instruct CSIM to calculate the power-on state of the registers, 
  969.     since some devices power-on to X and some to H or L.  Using the 
  970.     asterisk gives a more universal simulation file.
  971.  
  972.     Type in the rest  of the test vectors, as shown in Figure U5-15.
  973.  
  974.        -----------------------------------------------------------
  975.        $msg "    Power On Reset       ";
  976.                   O X X X X X 1 1 1 0       H H H * * Z
  977.        $msg "    Reset Flip Flops       ";
  978.                   C X X X X X 1 1 0 0       H H H L L Z
  979.        $msg "    Write RAM0       ";
  980.                   0 0 0 1 0 0 0 1 0 0       H L H L L Z
  981.        $msg "    Read RAM0       ";
  982.                   0 0 0 1 0 0 1 0 0 0       H L H L L Z
  983.        $msg "    Write RAM1       ";
  984.                   0 0 0 1 0 1 0 1 0 0       L H H L L Z
  985.        $msg "    Read RAM1       ";
  986.                   0 0 0 1 0 1 1 0 0 0       L H H L L Z
  987.        $msg "    Begin ROM read       ";
  988.                   0 0 0 0 0 0 1 0 0 0       H H L L L L
  989.        $msg " Two clocks for wait state, Then drive READY High    ";
  990.        $repeat 2;
  991.                   C 0 0 0 0 0 1 0 0 0       H H L * * *
  992.        $msg "    End ROM Read       ";
  993.                   0 0 0 0 0 0 1 1 0 0       H H H H H Z
  994.        $msg "    End ROM Read       ";
  995.                   C 0 0 0 0 0 1 1 0 0       H H H L L Z
  996.        -----------------------------------------------------------
  997.     Figure U5-15.  Test Vectors
  998.  
  999.     The $REPEAT directive in the test vectors causes the eighth vector 
  1000.     to be repeated twice.  The asterisks in the eighth vector for WAIT1, 
  1001.     WAIT2, and READY tell CSIM to compute the output based on the inputs 
  1002.     and place the results in the output file.
  1003.  
  1004.     The value of the clock variable, CPU_CLK, is 0 in some vectors and C 
  1005.     in others.  A value of 0 causes no clocking to occur.  A value of C 
  1006.     causes CSIM to examine the input values in the vector and also look 
  1007.     back to the previous vector for any registered outputs that would be 
  1008.     fed back internally prior to the clock. Then, after a clock is 
  1009.     applied, CSIM computes the appropriate expected outputs for 
  1010.     registered and non-registered variables.  After putting in the 
  1011.     VECTORS statement, save the file. The next step is to run CSIM to 
  1012.     perform the simulation.
  1013.  
  1014. o   .c3.STEP 8.   RUNNING CSIM
  1015.     When CSIM is run, it creates SAMPLE.SO, which contains the result of 
  1016.     the simulation.  Specify the -l flag to list any errors that might 
  1017.     be generated.
  1018.  
  1019.     To run CSIM, type:
  1020.  
  1021.         csim -1 p16r4 sample [Enter]
  1022.  
  1023.    ============================================================
  1024.    Note
  1025.      If WAITGEN.PLD was used to run CUPL in step 6, specify WAITGEN 
  1026.      instead of SAMPLE when running CSIM.
  1027.    ============================================================
  1028.  
  1029.  
  1030.     CSIM displays the amount of time to perform the simulation, as 
  1031.     follows:
  1032.  
  1033.      CSIM: CUPL Simulation Program
  1034.      Version 4.XX
  1035.      Serial # XX-XXX-XXXXCopyright (C)
  1036.      1983, 1990 Logical Devices, Inc.
  1037.      csima
  1038.      time:     4 secs
  1039.      total time: 4 secs
  1040.  
  1041.     When the prompt reappears, the simulation is complete.  SAMPLE.SO is 
  1042.     an ASCII file, so it is possible to display it on the screen, print 
  1043.     a hardcopy of it, or open it with a text editor.
  1044.  
  1045.     Figure U5-16 shows the contents of SAMPLE.SO.
  1046.  
  1047.        -----------------------------------------------------------
  1048.                             SAMPLE.SO
  1049.        CSIM:   CUPL Simulation Program
  1050.        Version 4.XX Serial # XX-XXX-XXXX
  1051.        copyright (c) 1983,1990 Logical Devices,
  1052.        Inc.
  1053.        CREATED Thur Aug 20 09:34:16 1990
  1054.         1: Name                  Sample;
  1055.         2: Partno                P9000183;
  1056.         3: Date                  07/16/87;
  1057.         4: Revision              02;
  1058.         5: Designer              Osann;
  1059.         6: Company               ATI;
  1060.         7: Assembly              PC Memory;
  1061.         8: Location              U106;
  1062.         9:
  1063.        10: /******************************************************/
  1064.        11: /* This device generates chip select signals for one  */
  1065.        12: /* 8Kx8 ROM and two 2Kx8 static RAMs. It also drives  */
  1066.        13: /* the system READY line to insert a wait-state of at */
  1067.        14: /* least one cpu clock for ROM accesses               */
  1068.        15: /******************************************************/
  1069.        16:
  1070.        17: ORDER:
  1071.        18:     cpu_clk, %2, a15, %2, a14, %2,
  1072.        19:     a13, %2, a12, %2, a11, %2,
  1073.        20:     !memw, %2, !memr, %2, reset, %2, !oe,
  1074.        21:     %4, !ram_cs1, %2, !ram_cs0, %2, !rom_cs, %2,
  1075.        22:     wait1, %2, wait2, %2, ready;
  1076.        23:
  1077.        ================================================================= 
  1078.                         Simulation Results 
  1079.        =================================================================
  1080.  
  1081.                                    ! !  
  1082.              c                     r r       !    
  1083.              p                     a a       r    
  1084.              u           ! ! r     m m       o w w r            
  1085.              _           m m e     _ _       m a a e            
  1086.              c a a a a a e e s !   c c       _ i i a            
  1087.              l 1 1 1 1 1 m m e o   s s       c t t d            
  1088.              k 5 4 3 2 1 w r t e   1 0       s 1 2 y
  1089.             ____________________________________________
  1090.            Power On Reset
  1091.        0001: O X X X X X 1 1 1 0   H H       H X X Z
  1092.            Reset Flip Flops
  1093.        0002: C X X X X X 1 1 0 0   H H       H L L Z
  1094.            Write RAM0
  1095.        0003: 0 0 0 1 0 0 0 1 0 0   H L       H L L Z
  1096.            Read RAM0
  1097.        0004: 0 0 0 1 0 0 1 0 0 0   H L       H L L Z
  1098.            Write RAM1
  1099.        0005: 0 0 0 1 0 1 0 1 0 0   L H       H L L Z
  1100.            Read RAM1
  1101.        0006: 0 0 0 1 0 1 1 0 0 0   L H       H L L Z
  1102.            Begin ROM read
  1103.        0007: 0 0 0 0 0 0 1 0 0 0   H H       L L L L
  1104.            Two clocks for wait state, Then drive READY High
  1105.        0008: C 0 0 0 0 0 1 0 0 0   H H       L H L L
  1106.        0009: C 0 0 0 0 0 1 0 0 0   H H       L H H H
  1107.            End ROM Read
  1108.        0010: 0 0 0 0 0 0 1 1 0 0   H H       H H H Z
  1109.            End ROM Read
  1110.        0011: C 0 0 0 0 0 1 1 0 0   H H       H L L Z
  1111.  
  1112.        -----------------------------------------------------------
  1113.      Figure U5-16. SAMPLE.SO 
  1114.  
  1115.     Compare SAMPLE.SO to the SAMPLE.SI file in Figure U5-12. Note that 
  1116.     vectors 8 and 9 were created as a result of the $REPEAT directive, 
  1117.     and that CSIM has replaced the asterisks from SAMPLE.SI with the 
  1118.     appropriate logic levels (H and L) for the WAIT1, WAIT2 and READY 
  1119.     signals.
  1120.  
  1121.     Now that a successful simulation has been completed, test vectors 
  1122.     can be added to the JEDEC file created while running CUPL (in step 
  1123.     6).  Run the simulation again with the -j option flag, by typing:
  1124.  
  1125.                    csim -j p16r4 sample [Enter]
  1126.  
  1127.     If WAITGEN.SI was used to perform the simulation, specify it here 
  1128.     instead of SAMPLE.SI.
  1129.  
  1130.     Figure U5-17 shows the contents of SAMPLE.JED, which now contains 
  1131.     both programming and testing information.
  1132.  
  1133.        -----------------------------------------------------------
  1134.                                       SAMPLE.JED
  1135.  
  1136.        CUPL              4.XX  Serial# XX-XXX-XXXX
  1137.        Device            p16r4 Library DLIB-d-26-11
  1138.        Created           Thur Aug 20 09:52:02 1990
  1139.        Name              Sample
  1140.        Partno            P9000183
  1141.        Revision          02
  1142.        Date              12/16/89
  1143.        Designer          Osann
  1144.        Company           ATI
  1145.        Assembly          PC Memory;
  1146.        Location          U106;
  1147.        *QP20
  1148.        *QF2048
  1149.        *G0
  1150.        *F0
  1151.        *L00000 11111111111111111111111111111111
  1152.        *L00032 10111011101111111111111110111111
  1153.        *L00256 10111011101111111111111110111111
  1154.        *L00288 11111111111111111111111011111111
  1155.        *L01024 11111111111111111111111101111111
  1156.        *L01056 01111111111111111111111111111111
  1157.        *L01088 11110111111111111111111111111111
  1158.        *L01120 11111111011111111111111111111111
  1159.        *L01152 11111111111111111111111111110111
  1160.        *L01280 11111111111111111111111101111111
  1161.        *L01312 01111111111111111111111111111111
  1162.        *L01344 11110111111111111111111111111111
  1163.        *L01376 11111111011111111111111111111111
  1164.        *L01408 11111111111111111110111111111111
  1165.        *L01536 11111111111111111111111111111111
  1166.        *L01568 10111011011110110111101111111111
  1167.        *L01600 10111011011110110111111110111111
  1168.        *L01792 11111111111111111111111111111111
  1169.        *L01824 10111011011110111011101111111111
  1170.        *L01856 10111011011110111011111110111111
  1171.        *C4D50
  1172.        *V0001 0XXXXX111N0HHXXXXZHN
  1173.        *V0002 CXXXXX110N0HHLLXXZHN
  1174.        *V0003 000100010N0LHLLXXZHN
  1175.        *V0004 000100100N0LHLLXXZHN
  1176.        *V0005 000101010N0HLLLXXZHN
  1177.        *V0006 000101100N0HLLLXXZHN
  1178.        *V0007 000000100N0HHLLXXLLN
  1179.        *V0008 C00000100N0HHLHXXLLN
  1180.        *V0009 C00000100N0HHHHXXHLN
  1181.        *V0010 000000110N0HHHHXXZHN
  1182.        *V0011 C00000110N1HHLLXXZHN
  1183.        *3152
  1184.        -----------------------------------------------------------
  1185.      Figure U5-17.  SAMPLE.JED with Test Vectors
  1186.  
  1187. o   .c3.SUMMARY
  1188.     This part provided the opportunities to create and compile a CUPL 
  1189.     source file and a CSIM test specification file.  The important 
  1190.     points were how to:
  1191.  
  1192.     _      Use the template file.
  1193.  
  1194.     _      Choose a PLD and make pin assignments.
  1195.  
  1196.     _      Write intermediate and logic equations to describe the 
  1197.            design.
  1198.  
  1199.     _      Run CUPL to compile a file.
  1200.  
  1201.     _      Create and compile a test specification file to verify the 
  1202.            design.
  1203.  
  1204.     _      Run CSIM to simulate a logic design.
  1205.  
  1206.     The design examples in Part B do not provide the same step-by-step 
  1207.     instruction, but are provided as familiarization with how CUPL can 
  1208.     be used to describe different types of designs.
  1209.  
  1210.    .c2.PART B.   SAMPLE PLD FILES
  1211.     This section lists the logic description files that are included in 
  1212.     the CUPL package to illustrate how CUPL and CSIM implement various 
  1213.     designs.
  1214.  
  1215.     FILE:       ADDER.PLD
  1216.     DEVICES:    PAL16L8, PAL16P8, 82S153
  1217.     4-bit asynchronous adder implemented as a ripple-carry through four 
  1218.     adder-slice circuits.  Each adder-slice was implemented using a 
  1219.     user-defined function.
  1220.  
  1221.     FILE:       ADDER_TT.PLD
  1222.     DEVICES:    RA9P8 (512x8 PROM)
  1223.     4-bit asynchronous adder implemented using a truth table.  Makes use 
  1224.     of nested $REPEAT statements.
  1225.  
  1226.     FILE:       BARREL22.PLD
  1227.     DEVICES:    PAL22V10
  1228.     8-bit registered barrel shifter with synchronous presetting 
  1229.     capability.
  1230.  
  1231.     FILE:       BUSARB.PLD
  1232.     DEVICES:    82S105
  1233.     Multiprocessor bus arbiter having two machines in one design.
  1234.  
  1235.     FILE:       COUNT8.PLD
  1236.     DEVICES:    PAL20X8
  1237.     8-bit counter with parallel load, clear, and hold using XOR 
  1238.     capability.
  1239.  
  1240.     FILE:       COUNT8A.PLD
  1241.     DEVICES:    PAL20X8
  1242.     8-bit counter with parallel load, clear, and hold using set 
  1243.     notation.
  1244.  
  1245.     FILE:       COUNT10.PLD
  1246.     DEVICES:    PAL16RP4, GAL16V8
  1247.     4-bit up/down decade counter with synchronous clear capability.  An 
  1248.     asynchronous ripple carry output is provided for cascading multiple 
  1249.     devices.
  1250.  
  1251.     FILE:       COUNT13.PLD
  1252.     DEVICES:    PAL32R16
  1253.     13-bit counter using set
  1254.     notation  with  parallel
  1255.     load hold and clear.
  1256.  
  1257.     FILE:       CYP_CNT.PLD
  1258.     DEVICES:    CY7C330
  1259.     Up/Down counter with preloadable upper and lower limits.
  1260.  
  1261.     FILE:       DATASEP.PLD
  1262.     DEVICES:    EP600
  1263.     Single density 8" floppy disk data separator.
  1264.  
  1265.     FILE:       DECADE.PLD
  1266.     DEVICES:    82S157
  1267.     4-bit synchronous free-running decade counter that uses the 
  1268.     complement-array to force invalid states to reset the counter 
  1269.     registers.  State machine syntax is used.
  1270.  
  1271.     FILE:       FLOP.PLD
  1272.     DEVICES:    PAL16R8, PAL16RP8, 82S159
  1273.     Using D-type flip-flop to create a 2-bit counter (four ways).
  1274.  
  1275.     FILE:       GATES.PLD
  1276.     DEVICES:    PAL16L8, PAL16P8 , 82S153
  1277.     Simple use of NOT, AND, OR, and XOR gates.
  1278.  
  1279.     FILE:       HEXDISP.PLD
  1280.     DEVICES:    RA5p8 (32x8 PROM)
  1281.     Hexidecimal to 7-segment decoder used for displaying numbers.
  1282.  
  1283.     FILE:     IODECODE.PLD
  1284.     DEVICES:    PAL12L6 , PAL12P6, 82S153
  1285.     A chip select signal generator for I/O functions.  It also enables 
  1286.     the data bus transceiver for both memory and I/O write cycles.
  1287.  
  1288.     FILE:       IOPORT.PLD
  1289.     DEVICES:    PAL20RA10
  1290.     7-bit register with handshake logic used to interface between a 
  1291.     microprocessor and I/O port.
  1292.  
  1293.     FILE:       KEYBOARD.PLD
  1294.     DEVICES:    82S100
  1295.     Converts the rows and columns of a matrix keyboard and generates the 
  1296.     corresponding ASCII code required for the key.
  1297.  
  1298.     FILE:     LOOKUP.PLD
  1299.     DEVICES:    RA8P8 (256 x 8 EPROM)
  1300.     Arithmetic lookup table that calculates the perimeter of a circle 
  1301.     given the radius.  Truth table syntax is used.
  1302.  
  1303.     FILE:     MDECODE.PLD
  1304.     DEVICES:    PAL16L8, PAL16P8 , 82S153
  1305.     A memory RAS generator and CAS signal initiator.  It also enables 
  1306.     the data bus transceiver for both memory and I/O read cycles.
  1307.  
  1308.     FILE:       MULTIBUS.PLD
  1309.     DEVICES:    PAL23S8
  1310.     Simple MULTIBUS  arbiter
  1311.     supports  parallel   and
  1312.     serial priority.
  1313.  
  1314.     FILE:       PRIORITY.PLD
  1315.     DEVICES:    PALR19L8
  1316.     Priority Interrupt Encoder for the Motorola 68000 using both Boolean 
  1317.     equations and Conditional syntax. The use of input registers is 
  1318.     shown.
  1319.  
  1320.     FILE:       RIPPLE8.PLD
  1321.     DEVICES:    PAL20RA10
  1322.     8-bit ripple counter with asynchronous load.
  1323.  
  1324.     FILE:       SHFTCNT.PLD
  1325.     DEVICES:    82S105
  1326.     4-bit counter/shifter using SR -type flip-flops.
  1327.  
  1328.     FILE:     SHFTCNT4.PLD
  1329.     DEVICES:    82S159
  1330.     4-bit counter/shifter using JK-type flip-flops.
  1331.  
  1332.     FILE:       SHFTCNT6.PLD
  1333.     DEVICES:    82S167
  1334.     4-bit counter/shifter using SR-type flip-flops.
  1335.  
  1336.     FILE:       STEPPER.PLD
  1337.     DEVICES:    PALT19R6
  1338.     Memory mapped stepper motor controller interfaced to the 8048 single 
  1339.     chip microprocessor.
  1340.  
  1341.     FILE:       TCOUNTER.PLD
  1342.     DEVICES:    EP600
  1343.     16-bit up/down counter with built-in shift register using toggle 
  1344.     flip-flops.
  1345.  
  1346.     FILE:       TTL.PLD
  1347.     DEVICES:    PAL16L8
  1348.     Multiple TTL chip representation using $Macros from the $Include 
  1349.     file.
  1350.  
  1351.     Any of these logic description files can be viewed or printed out, 
  1352.     or they can be input to CUPL to generate documentation or download 
  1353.     files.  A corresponding test specification file (filename.SI) is 
  1354.     also provided for each logic description file, so that CSIM can be 
  1355.     run to verify the designs.
  1356.  
  1357.     The following examples describe key points of the following designs 
  1358.     (the logic description file for each design is shown in 
  1359.     parentheses):
  1360.  
  1361.     _      Simple gates                                 (GATES.PLD)
  1362.  
  1363.     _      TTL conversion                               (WGTTL.PLD)
  1364.  
  1365.     _      Two-bit counter                              (FLOPS.PLD)
  1366.  
  1367.     _      Decade up/down counter using 
  1368.            state-machine syntax                         (COUNT10.PLD)
  1369.  
  1370.     _      Seven-segment display decoder                (HEXDISP.PLD)
  1371.  
  1372.  
  1373. o   .c3.EXAMPLE 1.   SIMPLE GATES
  1374.  
  1375.     This example describes a design containing simple gates.  Figure 
  1376.     U5-18 shows the design.
  1377.  
  1378.           [Picture]
  1379.      Figure U5-18. Design with Simple Gates
  1380.  
  1381.     The outputs are labeled to reflect the function of their gate; for 
  1382.     example, the AND gate has an output labeled AND.  Figure U5-19 shows 
  1383.     the CUPL source file (GATES.PLD provided in the CUPL package) that 
  1384.     describes the design.
  1385.  
  1386. -----------------------------------------------------------------
  1387.                               GATES.PLD
  1388.        Name            Gates;
  1389.        Partno          CA0001;
  1390.        Date            07/16/87;
  1391.        Designer        G Woolheiser;
  1392.        Company         ATI;
  1393.        Location        San Jose, CA.;
  1394.        Assembly        Example;
  1395.  
  1396.        /******************************************************/
  1397.        /*                                                    */
  1398.        /* This is an example to demonstrate how CUPL         */
  1399.        /* compiles simple gates.                             */
  1400.        /*                                                    */
  1401.        /******************************************************/
  1402.        /*  Target Devices: P16L8, P16P8, EP300,   and 82S153 */
  1403.        /******************************************************/
  1404.  
  1405.        /* Inputs:  define inputs to build simple gates     */
  1406.        Pin 1 = a;
  1407.        Pin 2 = b;
  1408.  
  1409.        /* Outputs:  define outputs as active HI levels
  1410.  
  1411.          For PAL16L8 and PAL16LD8, De Morgan's Theorem is
  1412.          applied to invert all outputs due to fixed
  1413.          inverting buffer in the device.       */
  1414.  
  1415.        Pin 12 = inva;
  1416.        Pin 13 = invb;
  1417.        Pin 14 = and;
  1418.        Pin 15 = nand;
  1419.        Pin 16 = or;
  1420.        Pin 17 = nor;
  1421.        Pin 18 = xor;
  1422.        Pin 19 = xnor;
  1423.  
  1424.        /* Logic:  examples of simple gates
  1425.        expressed in CUPL */
  1426.  
  1427.        inva = !a;          /* inverters              */
  1428.        invb = !b;
  1429.        and = a & b;        /* and gate                */
  1430.        nand = !(a & b);    /* nand gate                */
  1431.        or  = a # b;        /* or gate                   */
  1432.        xor = a $ b;        /* xor gate                  */
  1433.        nor = !(a # b)      /* nor gate                  */
  1434.        xnor = !(a $ b);    /* exclusive nor gate       */
  1435. -----------------------------------------------------------------
  1436.     Figure U5-19.  Simple Gates Source File (GATES.PLD)
  1437.  
  1438.     The first part of the file provides archival information and a 
  1439.     description of the intended function of the design, including 
  1440.     compatible PLDs.
  1441.  
  1442.     Pin declarations are made corresponding to the inputs and outputs in 
  1443.     the design diagram.
  1444.  
  1445.     In the "Logic" section of the file, equations describe each of the 
  1446.     gates in the design.  For the PAL16L8 and PAL16LD8 devices, which 
  1447.     contain fixed inverting buffers, CUPL applies DeMorgan's Theorem to 
  1448.     invert all outputs because they were all declared active-HI in the 
  1449.     pin list.  For example, during compilation, CUPL converts the 
  1450.     following equation for an OR gate, on an output pin that has been 
  1451.     declared as active high:
  1452.  
  1453.         or = a # b ;
  1454.     
  1455.     to the following single expanded product term (as shown in the 
  1456.     documentation file):
  1457.  
  1458.         or => !a & !b
  1459.  
  1460. o   .c3.EXAMPLE 2.   CONVERTING A TTL   DESIGN TO PLDs
  1461.     This example shows how to use a PLD to replace existing TTL 
  1462.     circuitry.  The conversion requires translating the gates of a TTL 
  1463.     logic design into equivalent Boolean logic equations, which can then 
  1464.     be compiled by CUPL and assigned to a PLD.  Figure U5-20 shows the 
  1465.     TTL gate representations used in designing logic systems and the 
  1466.     corresponding Boolean equation for each gate.
  1467.  
  1468.     [Picture]
  1469.      Figure U5-20. TTL Gate Representations and Boolean Equations
  1470.  
  1471.     The basic conversion rules shown in Figure U5-20 are sufficient to 
  1472.     write equations for each gate within a system of TTL gates when 
  1473.     converting the logic to a PLD equivalent. CUPL uses an expression 
  1474.     substitution process to build larger equations from the smaller 
  1475.     expressions representing each gate in the TTL schematic.  Expression 
  1476.     substitution permits approaching a schematic one gate at a time.
  1477.  
  1478.     Figure U5-21 shows the schematic for the TTL logic that is converted 
  1479.     in Example 1.
  1480.  
  1481.           [Picture]
  1482.      Figure U5-21. TTL Schematic
  1483.  
  1484.     The TTL logic shown in Figure U5-21 performs the same address 
  1485.     decoding and wait state generation as the WAITGEN.PLD file contained 
  1486.     in the CUPL distribution package. The SAMPLE.PLD file created in the 
  1487.     sample design session (see Part A of this chapter) is identical to 
  1488.     WAITGEN.PLD.The PLD equivalent of this TTL circuit replaces five to 
  1489.     six packages with one device.The first step in the conversion 
  1490.     process is to determine from the TTL schematic the logic that is to 
  1491.     be placed in the PLD.
  1492.  
  1493.     Figure U5-22 shows a PLD diagram equivalent to the TTL schematic 
  1494.     with a box around the logic, and PLD pin number assignments.
  1495.  
  1496.     [Picture]
  1497.      Figure U5-22. PLD Equivalent Diagram
  1498.  
  1499.     Note that the outputs of the internal gates (those that do not 
  1500.     connect to the PLD output pins) are arbitrarily labeled with the 
  1501.     variable names, A-H, to aid in entering equations in the logic 
  1502.     description file.
  1503.  
  1504.     The logic description file used to convert this design is named 
  1505.     WGTTL.PLD because it performs wait state generation and is based on 
  1506.     a TTL design.  Figure U5-23 shows the contents of WGTTL.PLD.
  1507.  
  1508. -----------------------------------------------------------------
  1509.                       WGTTL.PLD
  1510.        Name                  Sample;
  1511.        Partno                P9000183;
  1512.        Date                  07/16/87;
  1513.        Revision              02;
  1514.        Designer              Osann;
  1515.        Company               ATI;
  1516.        Assembly              PC Memory;
  1517.        Location              U106;
  1518.        /********************************************************/
  1519.        /* This device generates chip select signals for one   */
  1520.        /* 8Kx8 ROM and two 2Kx8 static RAMs. It also drives   */
  1521.        /* the system READY line to insert a wait-state of at  */
  1522.        /* least one cpu clock for ROM accesses                */
  1523.        /********************************************************/
  1524.        /** Inputs **/
  1525.        PIN 1         = cpu_clk      ; /* CPU clock         */
  1526.        PIN [2..6]    = [a15..11]    ; /* CPU Address Bus   */
  1527.        PIN [7 8]    = ![memw,memr] ; /*  Memory Data Strobes*/
  1528.        PIN 9         = reset        ; /* System Reset      */
  1529.        PIN 11        = !oe          ; /* Output enable     */
  1530.  
  1531.        /** Outputs **/
  1532.        PIN 19        = !rom_cs      ; /* ROM Chip Select   */
  1533.        PIN 18        = ready        ; /* CPU ready signal  */
  1534.        PIN 15        = wait1        ; /* Start wait state  */
  1535.        PIN 14        = wait2        ; /* End wait state    */
  1536.        PIN [13,12]   = ![ram_cs1..0] ; /* RAM chip selects  */
  1537.        /** Declarations and Intermediate Variable Definitions **/
  1538.        a = !(!memw) # !(!memr) ;
  1539.        b = !a15 & !a14 ;
  1540.        c = !a13 ;
  1541.        d = !a12 & !a11 ;
  1542.        e = !a11 ;
  1543.        f = !a12 & !oe ;
  1544.        g = !(!rom_cs # reset) ;
  1545.        h = !(!memr) ;
  1546.        /** Logic Equations **/
  1547.        !rom_cs = !(h & b & c);
  1548.        !ram_cs0 = !(a & b & a13 & d) ;
  1549.        !ram_cs1 = !(a & b & a13 & f) ;
  1550.        wait1.d = g ;
  1551.        wait2.d = wait1 & g ;
  1552.        ready.oe = !(!(h & b & c)) ;
  1553.        ready = wait2 ;
  1554. -----------------------------------------------------------------
  1555.      Figure U5-23. WGTTL.PLD
  1556.  
  1557.     The header information is identical to that in WAITGEN.PLD (and 
  1558.     SAMPLE.PLD; see Part A), because the functionality is the same.
  1559.  
  1560.     The pin assignments match the schematic in Figure U5-22.
  1561.  
  1562.     The logic equations for the internal gates are placed in the section 
  1563.     of the file for "Declarations and Intermediate Variable 
  1564.     Definitions." The equations in this section use the output variable 
  1565.     names, A-H, assigned in the schematic in Figure U5-22. For example, 
  1566.     the AND gate LS02 is described by the following equation:
  1567.  
  1568.         d = !a12 & !a11 ;
  1569.  
  1570.     The equations in this section can be simplified. For example, the 
  1571.     double negations can be eliminated in the following equation:
  1572.  
  1573.         a = !(!memw) # !(!memr) ;
  1574.  
  1575.     by entering:
  1576.  
  1577.         a = memw # memr ;
  1578.  
  1579.     The section of the file "Logic Equations" contains equations that 
  1580.     describe the output signals of the PLD. These equations are written 
  1581.     in terms of the intermediate equations that describe the outputs of 
  1582.     the internal gates.  For example, the AND gate, LS10, has !ROM_CS as 
  1583.     its output signal, and the signals H, B and C as inputs. Therefore, 
  1584.     enter the following equation to describe LS10:
  1585.  
  1586.         !rom_cs = !(h & b & c) ;
  1587.  
  1588.     WGTTL.PLD to WAITGEN.PLD are not exactly alike, because the internal 
  1589.     gates have been defined differently.  When compiled, however, they 
  1590.     perform the same function.  This can be verified by simulating each 
  1591.     logic description in turn with an identical simulation source file 
  1592.     (WGTTL.SI and WAITGEN.SI provided in the CUPL package).
  1593.  
  1594.     When converting a TTL design to a PLD, some slight changes in 
  1595.     functionality are required.  The asynchronous reset capability found 
  1596.     on TTL flip-flops like the LS74 is not found in many of the commonly 
  1597.     available PLDs. However, the same reset capability can be achieved 
  1598.     by including a RESET variable in all product terms to ensure a 
  1599.     synchronous reset at the clock.
  1600.  
  1601.     Therefore, WGTTL.PLD incorporates !RESET into the equation for G, 
  1602.     which is used in the equations for both WAIT1 (wait1.d = g;) and 
  1603.     WAIT2 (wait2.d = wait1.d & g).  Although the functional nature of 
  1604.     the synchronous reset does differ in timing from that of the 
  1605.     asynchronous reset, the synchronous reset is sufficient for proper 
  1606.     function of the device.  The simple methodology described in Example 
  1607.     2 allows the conversion of many TTL designs, especially those 
  1608.     consisting of simple gates, to a PLD equivalent, regardless of the 
  1609.     number of gate delays of TTL (logic) in the original design. In most 
  1610.     cases, the only difference between the TTL design and the PLD is the 
  1611.     total propagation delay through the circuit.
  1612.  
  1613.  
  1614. o   .c3.EXAMPLE 3. TWO-BIT COUNTER
  1615.  
  1616.     This example demonstrates the implementation of a two-bit counter 
  1617.     for a D-type flip-flop.  Figure U5-24 shows the timing diagram for 
  1618.     the counter.
  1619.  
  1620.     [Picture]
  1621.      Figure U5-24. Two-Bit Counter Timing Diagram
  1622.  
  1623.     As indicated by the arrows, the registers are clocked on the rising 
  1624.     edge of the clock signal.  Figure U5-25 shows the CUPL source file 
  1625.     (FLOPS.PLD, provided in the CUPL package) to describe the two-bit 
  1626.     counter design.
  1627.  
  1628. -----------------------------------------------------------------
  1629.  
  1630.                                 FLOPS.PLD
  1631.  
  1632.        Name               Flops;
  1633.        Partno             CA0002;
  1634.        Revision           02;
  1635.        Date               07/16/87;
  1636.        Designer           G. Woolheiser;
  1637.        Company            ATI;
  1638.        Location           None;
  1639.        Assembly           None;
  1640.        /************************************************************/
  1641.        /* This example demonstrates the use of D-type flip-flop    */
  1642.        /* to implement a two bit counter using the following       */
  1643.        /* timing diagram.                                          */
  1644.        /*               ___     ___     ___     ___     ___        */
  1645.        /* clock    |___|   |___|   |___|   |___|   |___|           */
  1646.        /*         _____         _______         _______            */
  1647.        /* q0      ///  |_______|       |_______|       |__         */
  1648.        /*         _____                 _______________            */
  1649.        /* q1      ///  |_______________|               |__         */
  1650.        /*                                                          */
  1651.        /*         _________                                        */
  1652.        /* reset            |___________________________________    */
  1653.        /*                                                          */
  1654.        /************************************************************/
  1655.        /*     Target Devices: PAL16R8, PAL16RP8,   GAL16V8         */
  1656.        /************************************************************/
  1657.        Pin 1 = clock;
  1658.        Pin 2 = reset;
  1659.  
  1660.        /* Outputs: define outputs and output active levels  */
  1661.        Pin 17 = q0;
  1662.        Pin 16 = q1;
  1663.  
  1664.        /* Logic: two bit counter using expanded exclusive ors 
  1665.                  with d-type flip-flop     */
  1666.        qo.d = !reset & (!q0 & !q1
  1667.                     # !q0 & q1);
  1668.        q1.d = !reset & (!q0 & q1
  1669.                     # q0 & !q1);
  1670.        /* ANDed !reset defines a synchronous register reset */
  1671.   -----------------------------------------------------------------
  1672.       Figure U5-25. Two-Bit Counter Source File (FLOPS.PLD)
  1673.  
  1674.     The first part of the file provides archival information and a 
  1675.     description of the intended function of the design, including 
  1676.     compatible PLDs.  Pin declarations are made corresponding to the 
  1677.     inputs and outputs in the design diagram.
  1678.  
  1679.     In the "Logic" section of the file, equations are written to 
  1680.     implement the counter. The equation for q0 is written to define when 
  1681.     q0 asserts; that is, it defines the situation immediately before the 
  1682.     rising clock edge.
  1683.  
  1684.     The !reset term is used in the equations for both q0 and q1 to 
  1685.     initialize the circuit, providing a synchronous reset.  At power-on, 
  1686.     the registers can be either high or low, as indicated by the DON'T 
  1687.     CARE slashes in the timing diagram (see Figure U5-24); the reset 
  1688.     signal is initially asserted.  By ANDing !reset into the equation 
  1689.     for each variable, the conditions are not met at power-on, so the 
  1690.     registers do not set.  Because the reset signal returns LO (false) 
  1691.     after the power-on process is complete, !reset is then true and does 
  1692.     not affect the value of the registers at any other point in the 
  1693.     circuit.  The .d extension in the equations specifies a D-type 
  1694.     flip-flop.  However, when an output is used as feedback, the .d 
  1695.     extension is dropped.  For example, if q0 is fed back to q1, an 
  1696.     equation could be written as:
  1697.  
  1698.         q1.d = q0 & !reset ;
  1699.     not as:
  1700.  
  1701.         q1.d = q0.d & !reset ;
  1702.     or:
  1703.         q1.d = q0.dq & !reset ;
  1704.  
  1705. o .c3.EXAMPLE 4.  DECADE UP/DOWN COUNTER
  1706.  
  1707.     This example describes a four-bit up/down decade counter with a 
  1708.     synchronous clear capacity.  The counter also provides an 
  1709.     asynchronous ripple carry output for cascading multiple devices.  
  1710.     The source file to implement the counter uses CUPL state machine 
  1711.     syntax.  Figure U5-26 shows the counter design and its state.
  1712.  
  1713.           [Picture]
  1714.      Figure U5-26. Up/Down Counter Diagram
  1715.  
  1716.     The input signal dir determines the direction of the count. When dir 
  1717.     is high, the count goes down one on each clock; when dir is low, the 
  1718.     count goes up one on each clock.  The clr signal performs a 
  1719.     synchronous reset.
  1720.  
  1721.     Figure U5-27 shows the CUPL source file (COUNT10.PLD, provided in 
  1722.     the CUPL package) that implements the design.
  1723.  
  1724.      -----------------------------------------------------------------
  1725.                     COUNT10.PLD
  1726.        Name               Count10;
  1727.        Partno             CA0018;
  1728.        Revision           02;
  1729.        Date               07/16/87;
  1730.        Designer           Kahl;
  1731.        Company            ATI;
  1732.        Location           None;
  1733.        Assembly           None;
  1734.        Device             p16rp4;
  1735.        /***********************************************************/
  1736.        /*       */
  1737.        /*                 Decade Counter        */
  1738.        /* This is a 4-bit up/down decade counter with            */
  1739.        /* synchronous clear capability. An asynchronous          */
  1740.        /* ripple carry output is provided for cascading          */
  1741.        /* multiple devices. CUPL state machine syntax            */
  1742.        /* is used       */
  1743.        /***********************************************************/
  1744.        /* Allowable Target Device Types: PAL16RP4, GAL16V8, EP300 */
  1745.        /************************************************************/
  1746.        /** Inputs **/
  1747.        Pin 1 = clk;                /* counter clock             */
  1748.        Pin 2 = clr;                /* counter clear input       */
  1749.        Pin 3 = dir;                /* counter direction input   */
  1750.        Pin 11 = !oe;               /* Register output enable    */
  1751.  
  1752.        /* Outputs        */
  1753.        Pin [14..17] = [Q3..0];     /* counter outputs           */
  1754.        Pin 18 = carry;             /* ripple carry out          */
  1755.        /* Declarations and Intermediate Variable Definitions    */
  1756.        field count = [Q3..0];      /* declare counter bit field */
  1757.        $define S0 'b'0000
  1758.        $define S1 'b'0001
  1759.        $define S2 'b'0010
  1760.        $define S3 'b'0011
  1761.        $define S4 'b'0100
  1762.        $define S5 'b'0101
  1763.        $define S6 'b'0110
  1764.        $define S7 'b'0111
  1765.        $define S8 'b'1000
  1766.        $define S9 'b'1001
  1767.        field node = [clr,dir];    /* declare filed node control */
  1768.        up = mode:0;               /* define count up mode       */
  1769.        down = mode:1;             /* define count down mode     */
  1770.        clear = mode:2..3];        /* define count clear mode    */
  1771.      -----------------------------------------------------------------
  1772.      Figure U5-27. Up/Down Counter Source File (COUNT10.PLD) Sheet 1 of 2
  1773.  
  1774.      -----------------------------------------------------------------
  1775.               /* Logic Equations */
  1776.     sequence count {     /*    free running counter */
  1777.    present S0         if up        next S1;
  1778.                      if down      next S9;
  1779.                      if clear     next S0;
  1780.    present S1         if up        next S2;
  1781.                      if down      next S0;
  1782.                      if clear     next S0;
  1783.    present S2         if up        next S3;
  1784.                      if down      next S1;
  1785.                      if clear     next S0;
  1786.    present S3         if up        next S4;
  1787.                      if down      next S2;
  1788.                      if clear     next S0;
  1789.    present S4         if up        next S5;
  1790.                      if down      next S3;
  1791.                      if clear     next S0;
  1792.    present S5         if up        next S6;
  1793.                      if down      next S4;
  1794.                      if clear     next S0;
  1795.    present S6         if up        next S7;
  1796.                      if down      next S5;
  1797.                      if clear     next S0;
  1798.    present S7         if up        next S8;
  1799.                      if down      next S6;
  1800.                      if clear     next S0;
  1801.    present S8         if up        next S9;
  1802.                      if down      next S7;
  1803.                      if clear     next S0;
  1804.    present S9         if up        next S0;
  1805.                      if down      next S8;
  1806.                      if clear     next S0;
  1807.                      out          carry;
  1808.             /* assert carry output */
  1809.  
  1810.      -----------------------------------------------------------------
  1811.     Figure U5-27. Sheet 2 of   2
  1812.  
  1813.     The first part of the file provides archival information and a 
  1814.     description of the intended function of the design, including 
  1815.     compatible PLDs.
  1816.  
  1817.     Pin declarations are made corresponding to the inputs and outputs in 
  1818.     the design diagram.
  1819.  
  1820.     The "Declarations and Intermediate Variable Definitions" section 
  1821.     contains declarations that simplify the notation.
  1822.  
  1823.     The name "count" is assigned to the output variables Q3, Q2, Q1, and 
  1824.     Q0.
  1825.  
  1826.     The $DEFINE command is used to assign names to ten binary states 
  1827.     representing the state machine output. The state name can then be 
  1828.     used in the logic equations to represent the corresponding binary 
  1829.     number.
  1830.  
  1831.     The FIELD keyword is used to combine the clr and dir inputs into a 
  1832.     set called mode. Mode is defined by the following equations:
  1833.  
  1834.     up = mode:0;
  1835.     down = mode:1;
  1836.     clear = mode[2..3];
  1837.  
  1838.     Mode represents the inputs clr and dir, so the three equations above 
  1839.     are equivalent to the following equations:
  1840.  
  1841.     up = !clr & !dir ; 
  1842.     down = !clr & dir ; 
  1843.     clear = (clr & !dir) # (clr & dir) ;
  1844.  
  1845.     The three modes are defined as follows:
  1846.  
  1847.         up      - Both the dir and clr inputs are not asserted.
  1848.  
  1849.         down    - The dir input is asserted and clr is not asserted.
  1850.  
  1851.         clear   - The clr input is asserted and dir is either asserted or 
  1852.                   not asserted.
  1853.  
  1854.     The "Logic Equations" section contains the state machine syntax that 
  1855.     specifies the states in the counter. In the first line, the SEQUENCE 
  1856.     keyword identifies count (that is, Q3, Q2, Q1, and Q0) as the 
  1857.     outputs to which the state values apply.
  1858.  
  1859.     Conditional statements have been written to specify the transition 
  1860.     from each possible present state to a next state, for each of the 
  1861.     three modes. For example, when the present state is S4, if the mode 
  1862.     is up, the counter goes to S5; if the mode is down the counter goes 
  1863.     to S3; or if the mode is clear, the counter goes to S0.  As example 
  1864.     4 shows, one advantage of the state machine syntax is that it 
  1865.     clearly documents the operation of the design.  In Example 4, state 
  1866.     0 (binary value 0000) is defined, because it is the result of the 
  1867.     clr signal. It is recommended that all designs have a valid 0000 
  1868.     defined to avoid being stuck at state 0. For example, in this 
  1869.     design, if a state that hasn't been defined occurs at power-on, such 
  1870.     as hexadecimal A-F, none of the conditions described in the
  1871.     equations is met, so the state goes to state 0 (hex value 0000). If 
  1872.     0000 has not been defined as a valid state, the counter stays at 
  1873.     state 0.
  1874.  
  1875.     Figure U5-28 shows how this example could have been written as a 
  1876.     virtual design. It is the same file, but it has been modified where 
  1877.     necessary to show the difference between a virtual design and a 
  1878.     device specific design.
  1879.  
  1880.     -----------------------------------------------------------------
  1881.                     COUNT10.PLD
  1882.        Name               Count10;
  1883.        Partno             CA0018;
  1884.        Revision           02;
  1885.        Date               07/16/87;
  1886.        Designer           Kahl;
  1887.        Company            ATI;
  1888.        Location           None;
  1889.        Assembly           None;
  1890.        Device             VIRTUAL;
  1891.        /***********************************************************/
  1892.        /*                                                        */
  1893.        /*                 Decade Counter                         */
  1894.        /* This is a 4-bit up/down decade counter  with           */
  1895.        /* synchronous clear capability. An asynchronous          */
  1896.        /* ripple carry output is provided for cascading          */
  1897.        /* multiple devices. CUPL state machine syntax            */
  1898.        /* is used                                                */
  1899.        /***********************************************************/
  1900.        /* Allowable Target Device Types: PAL16RP4, GAL16V8, EP300 */
  1901.        /************************************************************/
  1902.        /** Inputs **/
  1903.        Pin = clk;               /* counter clock              */
  1904.        Pin = clr;               /* counter clear input        */
  1905.        Pin = dir;               /* counter direction input    */
  1906.        Pin = !oe;               /* Register  output enable    */
  1907.  
  1908.        /* Outputs */
  1909.        Pin = [Q3..0];           /* counter outputs            */
  1910.        Pin = carry;             /* ripple carry out           */
  1911.  
  1912.        /* Declarations and Intermediate Variable Definitions    */
  1913.        field count = [Q3..0];      /* declare counter bit field */
  1914.  
  1915.        $define S0 'b'0000
  1916.        $define S1 'b'0001
  1917.        $define S2 'b'0010
  1918.        $define S3 'b'0011
  1919.        $define S4 'b'0100
  1920.        $define S5 'b'0101
  1921.        $define S6 'b'0110
  1922.        $define S7 'b'0111
  1923.        $define S8 'b'1000
  1924.        $define S9 'b'1001
  1925.  
  1926.        field node = [clr,dir];    /* declare filed node control */
  1927.        up = mode:0;               /* define count up mode       */
  1928.        down = mode:1;             /* define count down mode     */
  1929.        clear = mode:2..3];        /* define count clear mode    */
  1930.  
  1931.     -----------------------------------------------------------------
  1932.      Figure U5-28. Up/Down Counter Source File (virtual) Sheet 1 of 2
  1933.  
  1934.     -----------------------------------------------------------------
  1935.               /* Logic Equations */
  1936.     sequence count {     /*    free running counter */
  1937.    present S0         if up        next S1;
  1938.                      if down      next S9;
  1939.                      if clear     next S0;
  1940.    present S1         if up        next S2;
  1941.                      if down      next S0;
  1942.                      if clear     next S0;
  1943.    present S2         if up        next S3;
  1944.                      if down      next S1;
  1945.                      if clear     next S0;
  1946.    present S3         if up        next S4;
  1947.                      if down      next S2;
  1948.                      if clear     next S0;
  1949.    present S4         if up        next S5;
  1950.                      if down      next S3;
  1951.                      if clear     next S0;
  1952.    present S5         if up        next S6;
  1953.                      if down      next S4;
  1954.                      if clear     next S0;
  1955.    present S6         if up        next S7;
  1956.                      if down      next S5;
  1957.                      if clear     next S0;
  1958.    present S7         if up        next S8;
  1959.                      if down      next S6;
  1960.                      if clear     next S0;
  1961.    present S8         if up        next S9;
  1962.                      if down      next S7;
  1963.                      if clear     next S0;
  1964.    present S9         if up        next S0;
  1965.                      if down      next S8;
  1966.                      if clear     next S0;
  1967.         out          carry;        /* assert carry output */
  1968.  
  1969.     -----------------------------------------------------------------
  1970.     Figure U5-28. Sheet 2 of 2
  1971.  
  1972.     It is possible to use some of the features of the CUPL preprocessor
  1973.     to considerably shorten this PLD file.  Figure U5-29 will show how
  1974.     this same file could be written with a .i.repeat;$REPEAT structure
  1975.     which reduces the file size considerably.
  1976.  
  1977.  
  1978.     -----------------------------------------------------------------
  1979.        Name               Count10;
  1980.        Partno             CA0018;
  1981.        Revision           02;
  1982.        Date               07/16/87;
  1983.        Designer           Kahl;
  1984.        Company            ATI;
  1985.        Location           None;
  1986.        Assembly           None;
  1987.        Device             VIRTUAL;
  1988.        /**********************************************************/
  1989.        /*                                                        */
  1990.        /*                 Decade Counter                         */
  1991.        /* This is a 4-bit up/down decade counter with            */
  1992.        /* synchronous clear capability. An asynchronous          */
  1993.        /* ripple carry output is provided for cascading          */
  1994.        /* multiple devices. CUPL state machine syntax            */
  1995.        /* is used                                                */
  1996.        /***********************************************************/
  1997.        /* Allowable Target Device Types: PAL16RP4, GAL16V8, EP300 */
  1998.        /***********************************************************/
  1999.        /** Inputs **/
  2000.        Pin = clk;               /* counter clock             */
  2001.        Pin = clr;               /* counter clear input       */
  2002.        Pin = dir;               /* counter  direction input   */
  2003.        Pin = !oe;               /* Register output enable    */
  2004.  
  2005.        /* Outputs       */
  2006.        Pin = [Q3..0];     /* counter outputs            */
  2007.        Pin = carry;             /* ripple carry  out          */
  2008.  
  2009.        /* Declarations and Intermediate Variable Definitions    */
  2010.        field count = [Q3..0];      /* declare counter bit field */
  2011.        field node = [clr,dir];    /* declare filed node control */
  2012.        up = mode:0;               /* define count up mode       */
  2013.        down = mode:1;             /* define count down mode     */
  2014.        clear = mode:2..3];        /* define count clear mode    */
  2015.  
  2016.         /* state machine description */
  2017.         sequence count {
  2018.           present 0
  2019.                 if up & !clear  next 1;
  2020.                 if down & !clear next 9;
  2021.                 if clear        next  0;
  2022.         $REPEAT i=[1..9]
  2023.           present {i}
  2024.                 if up & !clear  next {(i+1)%10};
  2025.                 if down & !clear next {(i-1)%10};
  2026.                 if clear next 0;
  2027.         $REPEND
  2028.  
  2029.     -----------------------------------------------------------------
  2030.      Figure U5-29. Up/Down Counter Source File (virtual) Sheet 1 of 2
  2031.  
  2032.     In this variation, we removed the $DEFINE statements because we use
  2033.     the raw numbers instead.  The most significant change is that we
  2034.     used a $REPEAT loop to define most of the states instead of defining
  2035.     each state individually. It is possible to do this because all the
  2036.     states are identical in the sense that all the next states can be 
  2037.     calculated from the present state. State 0 is done separately 
  2038.     because when counting down the next state is -1 modulo 10 which 
  2039.     cannot be handled by the compiler.  We, therefore, define state 0 by 
  2040.     itself and then all the other states are defined in one $REPEAT 
  2041.     loop.  The $REPEAT loop expands upon compilation to give a 
  2042.     definition for each state. Notice that the statement indicating the 
  2043.     next state is given as a calculation from the repeat variable 'i'.  
  2044.     In the loop, 'i' represents the number of the current state. The 
  2045.     next state is therefore 'i+1'.  This will work for all states except 
  2046.     the last state. In the last state, the state machine must go back to 
  2047.     state 0.  To accomplish this, the formula to calculate the next 
  2048.     state is given as '(i+1)%10'. This means 'i+1' `modulo 10.  The 
  2049.     number 10 represents the number of states. Therefore, when in state 
  2050.     9 the next state is calculated as 9+1 = 10 then modulo 10 which 
  2051.     gives 0.  A similar condition occurs in calculating the previous 
  2052.     state except that we subtract 1 instead of adding it. You might have 
  2053.     noticed that we defined state 0 separately. This was done because 
  2054.     the $REPEAT variables can only handle positive numbers.  If we had 
  2055.     defined state 0 in the $REPEAT loop this would result in evaluating 
  2056.     to next state -1 and the compiler would produce an unexpected 
  2057.     result.
  2058.  
  2059. o .c3.EXAMPLE 5.  SEVEN-SEGMENT DISPLAY DECODER
  2060.     This example shows a hexadecimal-to-seven-segme nt decoder for 
  2061.     driving common-anode LEDs.  The design incorporates both a 
  2062.     ripple-blanking input to inhibit the display of leading zeroes, and 
  2063.     a ripple-blanking output for easy cascading of digits
  2064.  
  2065.     Figure U5-30 shows the segment display decoder.
  2066.  
  2067.         [Picture]
  2068.  
  2069.     Figure U5-30.  Seven-Segment Display Decoder
  2070.  
  2071.     The segments in the display, labeled a-g, correspond to the outputs 
  2072.     in the diagram.
  2073.  
  2074.     Figure U5-31 shows the source file (HEXDISP.PLD, provided with the 
  2075.     CUPL package).
  2076.  
  2077.     -----------------------------------------------------------------
  2078.                     HEXDISP.PLD 
  2079.        Name               Hexdisp; 
  2080.        Partno             CA0007; 
  2081.        Revision           02; 
  2082.        Date               07/16/87; 
  2083.        Designer           T. Kahl; 
  2084.        Company            ATI; 
  2085.        Location           None; 
  2086.        Assembly           None; 
  2087.        /******************************************************************/ 
  2088.        /*                                                                */ 
  2089.        /*                                                   a            */ 
  2090.        /* This is a hexadecimal-to-seven-segment          -----          */ 
  2091.        /* decoder capable of driving common-anode        |     |         */ 
  2092.        /* LEDs. It incorporates both a ripple-          f|     |b        */ 
  2093.        /* blanking input (to inhibit displaying          |  g  |         */ 
  2094.        /* leading zeroes) and a ripple blanking output    -----          */ 
  2095.        /* to allow for easy cascading of digits          |     |         */ 
  2096.        /*                                               e|     |c        */ 
  2097.        /*                                                |     |         */ 
  2098.        /*                                                 -----          */ 
  2099.        /*                                                   d            */ 
  2100.        /*                                                                */ 
  2101.        /******************************************************************/ 
  2102.        /* Allowable Target Device Types: 32 x 8  PROM (82S123 or         */ 
  2103.        /* equivalent                                                     */ 
  2104.        /******************************************************************/ 
  2105.        /** Input group (Note this is only a   comment)                  **/ 
  2106.        pin [10..13] = [D0..3];      /* data input lines to display       */ 
  2107.        pin 14 = !rbi;                    /* ripple blanking input        */ 
  2108.  
  2109.        /** Output Group ( Note this is only a comment )                 **/
  2110.        pin [7..1] = ![a,b,c,d,e,f,g];  /* Segment output lines           */ 
  2111.        pin 9     = !rbo;               /* Ripple Blanking output         */ 
  2112.  
  2113.        /** Declarations and Intermedia te Variable Definitions           */ 
  2114.        field data = [D3..0];            /* hexadecimal input field       */ 
  2115.        field segment=[abcdefg];         /* Display segment field         */ 
  2116.        $define ON 'b'1                /* segment lit when logically"ON"  */ 
  2117.        $define OFF 'b'0            /* segment dark when logically "OFF"  */
  2118.  
  2119.     -----------------------------------------------------------------
  2120.     Figure U5-31.  Display Decoder Source File (HEXDISP.PLD) Sheet 1 of 2
  2121.  
  2122.     The first part of the file provides archival information and a 
  2123.     description of the intended function of the design, including 
  2124.     compatible PLDs.
  2125.  
  2126.     Pin declarations are made corresponding to the inputs and outputs in 
  2127.     the design diagram.  In the "Declarations and Intermediate Variables" 
  2128.     section, field assignments are made to group the input pins into a set 
  2129.     named data and the output pins into a set named segment. ON and OFF are 
  2130.     defined respectively as binary 1 and binary 0.
  2131.  
  2132.        -----------------------------------------------------------------
  2133.        /** Logic Equations  **/ 
  2134.              /*      a    b    c    d    e    f    g */ 
  2135.        segment =  
  2136.         /* 0 */     [ ON,  ON,  ON,  ON,  ON,  ON, OFF] & data:0 & !rbi 
  2137.         /* 1 */   # [OFF,  ON,  ON, OFF, OFF, OFF, OFF] & data:1 
  2138.         /* 2 */   # [ ON,  ON, OFF,  ON,  ON, OFF,  ON] & data:2 
  2139.         /* 3 */   # [ ON,  ON,  ON,  ON, OFF, OFF,  ON] & data:3 
  2140.         /* 4 */   # [OFF,  ON,  ON, OFF, OFF,  ON,  ON] & data:4 
  2141.         /* 5 */   # [ ON, OFF,  ON,  ON, OFF,  ON,  ON] & data:5 
  2142.         /* 6 */   # [ ON, OFF,  ON,  ON,  ON,  ON,  ON] & data:6 
  2143.         /* 7 */   # [ ON,  ON,  ON, OFF, OFF, OFF,  ON] & data:7 
  2144.         /* 8 */   # [ ON,  ON,  ON,  ON,  ON,  ON, OFF] & data:8 
  2145.         /* 9 */   # [ ON,  ON,  ON,  ON, OFF,  ON,  ON] & data:9 
  2146.         /* A */   # [ ON,  ON,  ON, OFF,  ON,  ON,  ON] & data:A 
  2147.         /* B */   # [OFF, OFF,  ON,  ON,  ON,  ON,  ON] & data:B 
  2148.         /* C */   # [ ON, OFF, OFF,  ON,  ON,  ON, OFF] & data:C 
  2149.         /* D */   # [OFF,  ON,  ON,  ON,  ON, OFF,  ON] & data:D 
  2150.         /* E */   # [ ON, OFF, OFF,  ON,  ON,  ON,  ON] & data:E 
  2151.         /* F */   # [ ON, OFF, OFF, OFF,  ON,  ON,  ON] & data:F; 
  2152.  
  2153.        rbo = rbi & data:0;
  2154.        -----------------------------------------------------------------
  2155.  
  2156.     Figure U5-31. Sheet 2 of  2
  2157.  
  2158.     The logic equations are set up as a function table to describe the 
  2159.     segments that are lit up by each input pattern.  Comments create a 
  2160.     header for the function table, listing the output segments across the 
  2161.     top and the input numbers vertically down the side.  Each line of the 
  2162.     table describes a decoded hex value and the segments of the display 
  2163.     that the hex value turns on or off.  For example, the line for an input 
  2164.     value of 4 is written as follows:
  2165.  
  2166.     [OFF, ON, ON, OFF, OFF, ON, ON] & data:4
  2167.  
  2168.     The function table format expresses the intent of the design more 
  2169.     clearly than equations; that is, the example above shows that an input 
  2170.     value of 4 turns segment a off, segment b on, segment c on, and so on.
  2171.  
  2172. o    .c3.EXAMPLE 6. 4-BIT COUNTER WITH LOAD AND RESET
  2173.  
  2174.     This example will present a counter that can be loaded and reset.  The 
  2175.     design is done using the VIRTUAL device but it could easily be 
  2176.     implemented in almost any PLD that has four or more registers.
  2177.  
  2178.        -----------------------------------------------------------------
  2179.        Name               Counter; 
  2180.        Partno             FL1201; 
  2181.        Revision           01; 
  2182.        Date               08/26/91; 
  2183.        Designer           RGT; 
  2184.        Company            LDI; 
  2185.        Location           None; 
  2186.        Assembly           None; 
  2187.        Device             VIRTUAL;
  2188.         /*******************************************/
  2189.         /* 4-bit counter                           */
  2190.         /*******************************************/
  2191.         /** inputs **/
  2192.         PIN = clk; /* clock signal for registers */
  2193.         PIN = load;/* load signal */
  2194.         PIN = !ClrFlag;
  2195.         PIN = [LoadPin0..3]; /* pins from which to load data */
  2196.  
  2197.         /** outputs **/
  2198.         PIN = [CountPin0..3];/* intermediate variables and fields */
  2199.         field STATE_BITS = [Count0..3];
  2200.         field LOAD_BUS = [LoadPin0..3];/** state machine definition **/
  2201.         SequenceD STATE_BITS {  
  2202.         /* build a repeated loop for the states */
  2203.         $REPEAT i = [0..15]   Present 'h'{i}   
  2204.         /* go to state 0 if clear signal is true */
  2205.         /* if the load signal is false go to the *    
  2206.          * next state. Note that the next state  *    
  2207.          * is (current state + 1) modulo 16.     *    
  2208.          * This causes the counter to wrap back  *    
  2209.          * to 0 when in the last state           */
  2210.         If !load Next 'h'{(i+1)%16};
  2211.         $REPEND
  2212.         /* Add the load capability by using the         * 
  2213.          * APPEND statement. This has the effect of     *
  2214.          * adding more inputs to the OR gate for        * 
  2215.          * this output. This equation states that if    *
  2216.          * the load signal is true then the counter     *
  2217.          * registers are loaded with data from the      *
  2218.          * load pins. This is why 'load' was used in    *
  2219.          * the equations for the 'IF' statements in     *
  2220.          * the state definitions.                       */
  2221.         APPEND STATE_BITS.d = load & LOAD_BUS;
  2222.  
  2223.        -----------------------------------------------------------------
  2224.      Figure U5-32. Counter With Reset and Load.
  2225.  
  2226.     Since this is a virtual design, pin numbering can be ignored. The 
  2227.     signals to be used are declared without any pin numbers.  When the load 
  2228.     signal is asserted, the values at the load pins are fed into the state 
  2229.     bit registers.  When the 'Clear' signal is asserted, the state machine 
  2230.     is forced to state 0.
  2231.  
  2232.     The $REPEAT loop is defined as [0 ..15]. Inside the loop, the present 
  2233.     state is defined as 'h' {i}. This causes the numbers to be evaluated as 
  2234.     hex numbers. The expansion that results from this is a state machine 
  2235.     with 16 states ranging from 0 to F in hexadecimal. If the 'h' was left 
  2236.     off, the states would have been expanded as 0 to 15 in decimal.  The 
  2237.     compiler would have interpreted these as hex anyway and states A-F 
  2238.     would not have been defined.  Additionally, State 10 in hex cannot 
  2239.     exist with this number of statebits since that would require 5 
  2240.     statebits but all that we have is 4.
  2241.  
  2242.     Notice that all the IF statements are anded with "!load". This was done 
  2243.     because we want to give loading the highest possible priority.  Also 
  2244.     this removes any possible conflict that could occur if load and some 
  2245.     other signal were asserted at the same time.
  2246.  
  2247.     The next state is calculated as (present_state + 1) modulo 16.  This 
  2248.     causes the counter to wrap back to the zero state when it is in the 
  2249.     last state. We use modulo 16 because this is the number of states in 
  2250.     the state machine.
  2251.  
  2252.     The last part of this design involves adding the load capability to our 
  2253.     design. For this we use the .i.append;APPEND statement.  The append 
  2254.     statement causes the expression given to be ORed to the variable 
  2255.     specified.  This entire state machine eventually becomes a set of 
  2256.     equations for each of the state bits. Out intent is to add another 
  2257.     condition where the registers are loaded with the value from a set of 
  2258.     input pins.  Remember that we used '!load' in all the IF statements. 
  2259.     That was to make sure that the equations generated by those IF 
  2260.     statements, would not conflict with the APPEND statement.
  2261.  
  2262.        CountPin0.d = !load & ???.....
  2263.                    # !load & ???.....;
  2264.  
  2265.      Figure U5-33. Equations Before APPEND
  2266.  
  2267.        CountPin0.d = !load & ???.....           
  2268.                    # !load & ???.....
  2269.                    # load &  LoadPin0;
  2270.  
  2271.      Figure U5-34. Equations After APPEND
  2272.  
  2273.     As an exercise, try to add up/down capability to this example. Also, 
  2274.     try implementing it into an actual device.
  2275.     
  2276.     
  2277.  
  2278.