500 likes | 662 Views
BOARD BUS EE138 – Fall 2013. OBJECTIVES: Defining the different types of buses Discussing bus arbitration and handshaking schemes Introducing I2C and PCI bus examples Interconnection Standards. GENERAL BUS STRUCTURE
E N D
OBJECTIVES: Defining the different types of buses Discussing bus arbitration and handshaking schemes Introducing I2C and PCI bus examples Interconnection Standards
GENERAL BUS STRUCTURE All of the other major components that make up an embedded board—the master processor, I/O components, and memory—are interconnected via buses on the embedded board.
For embedded boards with several buses connecting components that need to inter-communicate, bridges on the board connect the various buses and carry information from one bus to another. A bridge can automatically provide a transparent mapping of address information when data is transferred from one bus to another, implement different control signal requirements for various buses—acknowledgment cycles, for example—as well as modify the data being transmitted if any transfer protocols differ bus to bus. For instance, if the byte ordering differs, the bridge can handle the byte swapping.
BOARD BUSES System buses (also referred to as “main,” “local,” or “processor-memory” buses) interconnect external main memory and cache to the master CPU and/or any bridges to the other buses. System buses are typically shorter, higher speed, custom buses. Backplane buses are also typically faster buses that interconnect memory, the master processor, and I/O, all on one bus. I/O buses, also referred to as “expansion,” “external,” or “host” buses, in effect act as extensions of the system bus to connect the remaining components to the master CPU, to each other, to the system bus via a bridge, and/or to the embedded system itself, via an I/O communication port. I/O buses are typically standardized buses that can be either shorter, higher speed buses such as PCI and USB, or longer, slower buses such as SCSI.
Board Bus Cont. • The major difference between system buses and I/O buses is the possible presence of IRQ control signals on an I/O bus. • Interrupts are the most common methods for I/O and the master processor to communicate. An IRQ line allows for I/O devices on a bus to indicate to the master processor that an event has taken place or an operation has been completed by a signal on that IRQ bus line. • Different I/O buses can have different impacts on interrupt schemes. An ISA bus, for example, requires that each card that generates interrupts must be assigned its own unique IRQ value. The PCI bus, on the other hand, allows two or more I/O cards to share the same IRQ value. • Within each bus category, buses can be further divided into whether the bus is expandable or non-expandable. • Expandable bus (PCMCIA, PCI, IDE, SCSI, USB, etc.) is one in which additional components can be plugged into the board on-the-fly. • Non-expandable bus (DIB, VME, I2C) is one in which additional components cannot be simply plugged into the board and then communicate over that bus to the other components.
Bus Arbitration and Timing • Board devices obtain access to a bus using a bus arbitration scheme. Bus arbitration is based upon devices being classified as either master devices (devices that can initiate a bus transaction) or slave devices (devices which can only gain access to a bus in response to a master device’s request). When only one device on the board—the master processor—to be allowed to be master, while all other components are slave devices, then no arbitration is necessary since there is only one master. • For buses that allow for multiple masters, some have an arbitrator (separate hardware circuitry) that determines under what circumstances a master gets control of the bus. There are several bus arbitration schemes used for embedded buses, the most common being dynamic central parallel, centralized serial(daisy-chain), and distributed self-selection.
Dynamic central parallel arbitration (shown in Figure 7-3a) is a scheme in which the arbitrator is centrally located. All bus masters connect to the central arbitrator. • In this scheme, masters are then granted access to the bus via a FIFO (first in, first out—see Figure 7-3b) or priority-based system (see Figure 7-3c). The FIFO algorithm implements some type of FIFO queue that stores a list of master devices ready to use the bus in the order of bus requests. Master devices are added at the end of the queue, and are allowed access to the bus from the start of the queue. One main drawback is the possibility of the arbitrator not intervening if a single master at the front of the queue maintains control of the bus, never completing and not allowing other masters to access the bus.
Figure 7-3c: Illustrates a possible sequence of events for the case of three masters Assume that master 1 has the highest priority, followed by master 2 and master 3. Master 2 sends a request to use the bus first. Since there are no other requests, the arbiter grants the bus to this master by asserting BG2. When master 2 completes its data transfer operation, it releases the bus by deactivating BR2. By that time, both masters 1 and 3 have activated their request lines. Since device 1 has a higher priority, the arbiter activates BG1 after it deactivates BG2, thus granting the bus to master 1. Later, when master 1 releases the bus by deactivating BR1, the arbiter deactivates BG1 and activates BG3 to grant the bus to master 3. Note that the bus is granted to master 1 before master 3 even though master 3 activated its request line before master 1.
Central-serialized arbitration, also referred to as daisy-chain arbitration, is a scheme in which the arbitrator is connected to all masters, and the masters are connected in serial. Regardless of which master makes the request for the bus, the first master in the chain is granted the bus, and passes the “bus grant” on to the next master in the chain if/when the bus is no longer needed (see Figure 7-4).
Distributed arbitration schemes, which means there is no central arbitrator and no additional circuitry, as shown in Figure 7-5. In these schemes, masters arbitrate themselves by trading priority information to determine if a higher priority master is making a request for the bus, or even by removing all arbitration lines and waiting to see if there is a collision on the bus, which means that the bus is busy with more than one master trying to use it.
Again, depending on the bus, bus arbitrators can grant a bus to a master atomically (until that master is finished with its transmission) or allow for split transmissions, where the arbitrator can preempt devices in the middle of transactions, switching between masters to allow other masters to have bus access. Once a master device is granted the bus, only two devices—a master and another device in slave mode—communicate over that bus at any given time. There are only two types of transactions that a bus device can do—READ (receive) and/or WRITE (transmit). These transactions can take place either between two processors (a master and I/O controller, for example) or processor and memory (a master and memory, for example). Within each type of transaction, whether READ or WRITE, there can also be several specific rules that each device needs to follow in order to complete a transaction. These rules can vary widely between the types of devices communicating, as well as from bus to bus. These sets of rules, commonly referred to as the bus handshake, form the basis of any bus protocol.
Non-Expandable Bus: I2C Bus Example The I2C (Inter IC) bus interconnects processors that have incorporated an I2C on-chip interface, allowing direct communication between these processors over the bus. A master/slave relationship between these processors exists at all times, with the master acting as a master transmitter or master receiver. As shown in Figure 7-8, the I2C bus is a two-wire bus with one serial data line (SDA) and one serial clock line (SCL). The processors connected via I2C are each addressable by a unique address that is part of the data stream transmitted between devices. The I2C master initiates data transfer and generates the clock signals to permit the transfer. Basically, the SCL just cycles between HIGH and LOW (see Figure 7-9). The master then uses the SDA line (as SCL is cycling) to transmit data to a slave. A session is started and terminated as shown in Figure 7-10, where a “START” is initiated when the master pulls the SDA port (pin) LOW while the SCL signal is HIGH, whereas a “STOP” condition is initiated when the master pulls the SDA port HIGH when SCL is HIGH. With regard to the transmission of data, the I2C bus is a serial, 8-bit bus. This means that, while there is no limit on the number of bytes that can be transmitted in a session, only one byte (8 bits) of data will be moved at any one time, 1 bit at a time (serially).
I2C BUS PROTOCOL • The IIC (Inter-Integrated Circuit) is a bus interface connection incorporated into many devices such as sensors, RTC, and EEPROM. The IIC is also referred to as I2C (I2C) or I square C in many technical literatures. In this section we examine the pins of the I2C bus and focus on I2C terminology and protocols. • I2C bus • The I2C bus was originally started by Philips, but in recent years has become a widely used standard adapted by many companies. • I2C devices use only 2 pins for data transfer, instead of the 8 or more pins used in traditional buses. They are called SCL (Serial Clock), which synchronize the data transfer between two chips, and SDA (Serial Data). This reduction of communication pins reduces the package size and power consumption drastically, making them ideal for many applications in which space is a major concern. These two pins, SDA and SCK, make the I2C a 2-wire interface. In many application notes, including AVR datasheets, I2C is referred to as Two-Wire Serial Interface (TWI).
I2C line electrical characteristics I2C devices use only 2 bidirectional open-drain pins for data communication. To implement I2C, only a 4.7 kΩ pull-up resistor for each of bus lines is needed (see below). This implements a wired-AND, which is needed to implement I2C protocols. This means that if one or more devices pull the line to low (zero) level, the line state is zero and the level of line will be 1 only if none of devices pull the line to low level. I2C BUS
I2C nodes In the AVR up to 120 different devices can share an I2C bus. Each of these devices is called a node. In I2C terminology, each node can operate as either master or slave. Master is a device that generates the clock for the system; it also initiates and terminates a transmission. Slave is the node that receives the clock and is addressed by the master. In I2C, both master and slave can receive or transmit data, so there are four modes of operation. They are master transmitter, master receiver, slave transmitter, and slave receiver. Notice that each node can have more than one mode of operation at different times, but it has only one mode of operation at a given time. Example: Show how a device (node) can have more than one mode of operation. Solution: If you connect the AVR to an EEPROM with I2C, the AVR does a master transmit operation to write to EEPROM. The AVR also does master receive operations to read from EEPROM.
Bit format I2C is a synchronous serial protocol; each data bit transferred on the SDA line is synchronized by a high-to-low pulse of clock on the SCL line. According to I2C protocols the data line cannot change when the clock line is high; it can change only when the clock line is low. The STOP and START conditions are the only exceptions to this rule. I2C Bit Format
START and STOP conditions As we mentioned before, I2C is a connection-oriented communication pro- tocol. This means that each transmission is initiated by a START condition and is terminated by a STOP condition. Remember that the START and STOP conditions are generated by the master. STOP and START conditions must be distinguished from bits of address or data. That is why they do not obey the bit format rule that we mentioned before. START and STOP conditions are generated by keeping the level of the SCL line high and then changing the level of the SDA line. The START condition is generated by a high-to-low change in the SDA line when SCL is high. The STOP condition is generated by a low-to-high change in the SDA line when SCL is low. START and STOP Conditions
The bus is considered busy between each pair of START and STOP conditions, and no other master tries to take control of the bus when it is busy. If a master, which has the control of the bus, wishes to initiate a new transfer and does not want to release the bus before starting the new transfer, it issues a new START condition between a pair of START and STOP conditions. It is called the REPEATED START condition REPEATED START Condition
Packet format in I2C In I2C, each address or data to be transmitted must be framed in a packet. Each packet is 9 bits long. The first 8 bits are put on the SDA line by the transmitter, and the 9th bit is an acknowledge by the receiver or it may be NACK (not acknowledge). The clock is generated by the master, regardless of whether it is the transmitter or receiver. To get an acknowledge, the transmitter releases the SDA line during the ninth clock so that the receiver can pull the SDA line low to indicate an ACK. If the receiver doesn’t pull the SDA line low, it is considered as NACK. Packet Format in I2C
Address packet format An address packet consists of seven address bits, one READ/WRITE control bit, and an acknowledge bit. Address bits are used to address a specific slave device on the bus. The 7-bit address lets the master address a maximum of 128 slaves on the bus, although the address 0000 000 is reserved for general call and all addresses of the format 1111 xxx are reserved. That means 119 (128 – 1 – 8) devices can share an I2C bus. In the I2C bus the MSB of the address is transmitted first. The eighth bit in the packet is the READ/WRITE control bit. If this bit is set, the master will read the next frame (Data) from the slave, otherwise, the master will write the next frame (Data) on the bus to the slave. When a slave detects its address on the bus, it knows that it is being addressed and it should acknowledge in the ninth SCL (ACK) cycle by changing SDA to zero. If the addressed slave is not ready or for any reason does not want to service the master, it should leave the SDA line high in the ninth clock cycle. This is considered to be NACK. In case of NACK, the master can transmit a STOP condition to terminate the transmission, or a REPEATED START condition to initiate a new transmission.
Example: Show how a master says that it wants to write to a slave with address 1001101. Solution: The following actions are performed by the master: (1) The master puts a high-to-low pulse on SDA, while SCL is high to generate a start bit condition to start the transmission. (2) The master transmits 10011010 into the bus. The first seven bits (1001101) indicates the slave address, and the eighth bit (0) indicates a Write operation and says that the master will write the next byte (data) into the slave.
Data packet format The first 8 bits are a byte of data to be transmitted, and the 9th bit is ACK. If the receiver has received the last byte of data and there is no more data to be received, or the receiver can not receive or process more data, it will signal a NACK by leaving the SDA line high. In data packets, like address packets, MSB is transmitted first. Combining address and data packets into a transmission In I2C, normally, a transmission is started by a START condition, followed by an address packet (SLA + R/W), one or more data packets, and finished by a STOP condition. Typical Data Transmission
Example: Show how a master writes the value 11110000 to a slave with address 1001101. Solution: The following actions are performed by the master: (1) The master puts a high-to-low pulse on SDA while, SCL is high to generate a START condition to start the transmission. (2) The master transmits 10011010 into the bus. The first seven bits (1001101) indicate the slave address, and the eighth bit (0) indicates the Write operation stating that the master will write the next byte (data) into the slave. (3) The slave pulls the SDA line low to signal an ACK to say that it is ready to receive the data byte. (4) After receiving the ACK, the master will transmit the data byte (1111000) on the SDA line (MSB first). (5) When the slave device receives the data it leaves the SDA line high to signal NACK. This informs the master that the slave received the last data byte and does not need any more data. (6) After receiving the NACK, the master will know that no more data should be transmitted. The master changes the SDA line when the SCL line is high to transmit a STOP condition and then releases the bus.
How this translates into using the SDA and SCL signals is that a data bit is “read” whenever the SCL signal moves from HIGH to LOW, edge to edge. If the SDA signal is HIGH at the point of an edge, then the data bit is read as a “1”. If the SDA signal is LOW, the data bit read is a “0”. An example of byte “00000001” transfer is shown in Figure 7-11a, while Figure 7-11b shows an example of a complete transfer session.
PCI (Peripheral Component Interconnect) Bus Example: Expandable • The latest PCI specification, PCI Local Bus Specification Revision 2.1, defines requirements (mechanical, electrical, timing, protocols, etc.) of a PCI bus implementation. PCI is a synchronous bus, meaning that it synchronizes communication using a clock. • The latest standard defines a PCI bus design with at least a 33 MHz clock (up to 66 MHz) and a bus width of at least 32 bits (up to 64 bits), giving a possible minimum throughput of approximately 132 Mbytes/sec ((33 MHz * 32 bits) / 8)—and up to 528 Mbytes/sec maximum with 64-bit transfers given a 66-MHz clock. PCI runs at either of these clock speeds, regardless of the clock speeds at which the components attached to it are running. • As shown in Figure 7-12, the PCI bus has two connection interfaces: an internal PCI interface that connects it to the main board (to bridges, processors, etc.) via EIDE channels, and the expansion PCI interface, which consists of the slots into which PCI adaptor cards (audio, video, etc.) plug. The expansion interface is what makes PCI an expandable bus; it allows for hardware to be plugged into the bus, and for the entire system to automatically adjust and operate correctly.
Under the 32-bit implementation, the PCI bus is made up of 49 lines carrying multiplexed data and address signals (32 pins), as well as other control signals implemented via the remaining 17 pins (see table in Figure 7-12). Because the PCI bus allows for multiple bus masters (initiators of a bus transaction), it implements a dynamic centralized, parallel arbitration scheme (see Figure 7-13). PCI’s arbitration scheme basically uses the REQ# and GNT# signals to facilitate communication between initiators and bus arbitrators. Every master has its own REQ# and GNT# pin, allowing the arbitrator to implement a fair arbitration scheme, as well as determining the next target to be granted the bus while the current initiator is transmitting data.
In general, a PCI transaction is made up of five steps: 1. An initiator makes a bus request by asserting a REQ# signal to the central arbitrator. 2. The central arbitrator does a bus grant to the initiator by asserting GNT# signal. 3. The address phase which begins when the initiator activates the FRAME# signal, and then sets the C/BE[3:0]# signals to define the type of data transfer (memory or I/O read or write). The initiator then transmits the address via the AD[31:0] signals at the next clock edge. 4. After the transmission of the address, the next clock edge starts the one or more data phases (the transmission of data). Data is also transferred via the AD[31:0] signals. The C/BE[3:0], along with IRDY# and #TRDY signals, indicate if transmitted data is valid. 5. Either the initiator or target can terminate a bus transfer through the deassertion of the #FRAME signal at the last data phase transmission. The STOP# signal also acts to terminate all bus transactions Figures 7-14a and b demonstrate how PCI signals are used for transmission of information.
PCI Express The demands placed on I/O interconnections are ever increasing. Internet connections, sophisticated graphics devices, streaming video and high-definition television are examples of applications that involve data transfers at very high speed. The PCI Express interconnection standard (often called PCIe) has been developed to meet these needs and to anticipate further increases in data transfer rates, which are inevitable as new applications are introduced. PCI Express uses serial, point-to-point links interconnected via switches to form a tree structure, as shown in Figure below. The root node of the tree, called the Root complex, is connected to the processor bus. The Root complex has a special port to connect the main memory. All other connections emanating from the Root complex are serial links to I/O devices. Some of these links may connect to a switch that leads to more serial branches, as shown in the figure. The switch may also connect to bridging interfaces that support other standards, such as PCI or USB. For example, one of the tree branches could be a PCI bus, to take advantage of the wide variety of devices for which PCI interfaces already exist. The basic PCI Express link consists of two twisted pairs, one for each direction of transmission. Data are transmitted at the rate of of 2.5 Gigabits/s over each twisted pair, using the differential signaling scheme described in Section 7.5.1. Data may be transmitted in both directions at the same time. Also, links to different devices may be carrying data at the same time, because there is no shared bus as in the case of PCI or SCSI.
Furthermore, a link may use more than one twisted pair in each direction. The basic arrangement with one twisted pair for each direction is called a lane and referred to as a X1 (read as by 1) connection. A link may use 2, 4, 8, or 16 lanes, in which case it is called a X2, X4, X8, or X16 link. The receiver on a synchronous transmission link must synchronize its clock with that of the sender, as described in Section 7.4.2. To make this possible, the transmitted data are encoded to ensure that 0-to-1 and 1-to-0 transitions occur frequently enough. In the case of PCIe, each 8 bits of data are encoded using 10 bits. Other bits are inserted in the stream to perform various control functions, such as delineating address and data information. After accounting for the additional bits, a single twisted pair on which data are transmitted at 2.5 Gigabits/s actually delivers 1.6 Gigabits/s or 200 MByte/s of useful information. A X16 link transfers data at the rate of 3.2 Gigabyte/s in each direction. By comparison, a 64-bit PCI bus operating at 64 MHz has a peak aggregate data transfer rate of 512 Megabytes/s. PCI Express has the additional advantage of using a small number of wires, resulting in lower-cost hardware
Bus Performance • Bandwidth: the amount of data a bus can transfer for a given length of time. • Bus’s design: the physical design and its associated protocols • Protocols: the simpler the handshaking scheme the higher the bandwidth (fewer “send enquiry”, “wait for acknowledgment”, etc., steps). • The actual physical design of the bus: its length, the number of lines, the number of supported devices, and so on) limits or enhances its performance. The shorter the bus, the fewer connected devices, and the more data lines, typically the faster the bus and the higher its bandwidth. • Number of bus lines and how the bus lines are used: for example, whether there are separate lines for each signal or whether multiple signals multiplex over fewer shared lines— are additional factors that impact bus bandwidth. The more bus lines (wires), the more data that can be physically transmitted at any one time, in parallel. Fewer lines mean more data has to share access to these lines for transmission, resulting in less data being transmitted at any one time. • Bus width: Buses typically have a bandwidth of some binary power of 2—such as 1 (20) for buses with a serial bus width, 8 (23) bit, 16 (24) bit, 32 (25) bit, and so on.
Interconnection Standards The Universal Serial Bus (USB) is the most widely used interconnection standard. A large variety of devices are available with a USB connector, including mice, memory keys, disk drives, printers, cameras, and many more. The commercial success of the USB is due to its simplicity and low cost. The original USB specification supports two speeds of operation, called low-speed (1.5 Megabits/s) and full-speed (12 Megabits/s). Later, USB 2, called High-Speed USB, was introduced. It enables data transfers at speeds up to 480 Megabits/s. As I/O devices continued to evolve with even higher speed requirements, USB 3 (called Super speed) was developed. It supports data transfer rates up to 5 Gigabits/s. The USB has been designed to meet several key objectives: • Provide a simple, low-cost, and easy to use interconnection system • Accommodate a wide range of I/O devices and bitrates, including Internet connections, and audio and video applications • Enhance user convenience through a “plug-and-play” mode of operation
USB Architecture The USB uses point-to-point connections and a serial transmission format. When multiple devices are connected, they are arranged in a tree structure as shown below. Each node of the tree has a device called a hub, which acts as an intermediate transfer point between the host computer and the I/O devices. At the root of the tree, a root hub connects the entire tree to the host computer. The leaves of the tree are the I/O devices: a mouse, a keyboard, a printer, an Internet connection, a camera, or a speaker. The tree structure makes it possible to connect many devices using simple point-to-point serial links.
Electrical Characteristics USB connections consist of four wires, of which two carry power, +5 V and Ground, and two carry data. Thus, I/O devices that do not have large power requirements can be powered directly from the USB. This obviates the need for a separate power supply for simple devices such as a memory key or a mouse. Two methods are used to send data over a USB cable. When sending data at low speed, a high voltage relative to Ground is transmitted on one of the two data wires to represent a 0 and on the other to represent a 1. The Ground wire carries the return current in both cases. Such a scheme in which a signal is injected on a wire relative to ground is referred to as single-ended transmission. The High-Speed USB uses an alternative arrangement known as differential signaling. The data signal is injected between two data wires twisted together. The ground wire is not involved. The receiver senses the voltage difference between the two signal wires directly, without reference to ground. This arrangement is very effective in reducing the noise seen by the receiver, because any noise injected on one of the two wires of the twisted pair is also injected on the other. Since the receiver is sensitive only to the voltage difference between the two wires, the noise component is cancelled out. The ground wire acts as a shield for the Data on the twisted pair against interference from nearby wires. Differential signaling allows much lower voltages and much higher speeds to be used compared to single-ended signaling.
SCSI Bus The acronym SCSI stands for Small Computer System Interface. It refers to a standard bus defined by the American National Standards Institute (ANSI). The SCSI bus may be used to connect a variety of devices to a computer. It is particularly well-suited for use with disk drives. In the original specifications of the SCSI standard, devices are connected to a computer via a 50-wire cable, which can be up to 25 meters in length and can transfer data at rates of up to 5 Megabytes/s. The standard has undergone many revisions, and its data transfer capability has increased rapidly. SCSI-2andSCSI-3 have been defined, and each has several options. Data are transferred either 8 bits or 16 bits in parallel, using clock speeds of up to 80 MHz. There are also several options for the electrical signaling scheme used. The bus may use single-ended transmission, where each signal uses one wire, with a common ground return for all signals. In another option, differential signaling is used, with a pair of wires for each signal.
SATA In the early days of the personal computer, the bus of a popular IBM computer called AT, which was based on Intel’s 8080 microprocessor bus, became an industry standard. It was named ISA, for Industry Standard Architecture. An enhanced version, including a definition of the basic software needed to support disk drives, was later named ATA, for ATAttachment bus. A serial version of the same architecture became known as SATA, which is now widely used as an interface for disks. Like all standards, several versions of SATA have been developed with added features and higher speeds. The original parallel version has been renamed PATA, but it is no longer used in new equipment. The basic SATA connector has 7 pins, connecting two twisted pairs and three ground wires. Differential transmission is used, with clock frequencies ranging from 1.5 to 6.0 Gigabits/s. Some of the recent versions provide an isochronous transmission feature to support audio and video devices.
SAS This is a serial implementation of the SCSI bus, hence its name: Serially Attached SCSI. It is primarily intended for connecting magnetic disks and CD and DVD drives. It uses serial, point-to-point links that are similar to SATA. A SAS link can transfer data in both directions simultaneously, at speeds up to 12 Gigabits/s. At the software level, SAS is fully compatible with SCSI.
Problem: The I/O bus of a computer uses the synchronous protocol shown in Figure below. Maximum propagation delay on this bus is 4 ns. The bus master takes 1.5 ns to place an address on the address lines. Slave devices require 3 ns to decode the address and a maximum of 5 ns to place the requested data on the data lines. Input registers connected to the bus have a minimum setup time of 1ns. Assume that the bus clock has a 50% duty cycle; that is, the high and low phases of the clock are of equal duration. What is the maximum clock frequency for this bus? Solution: The minimum time for the high phase of the clock is the time for the address to arrive and be decoded by the slave, which is 1.5 + 4 + 3 = 8.5 ns. The minimum time for the low phase of the clock is the time for the slave to place data on the bus and for the master to load the data into a register, which is 5 + 4 + 1 = 10 ns. Then, the minimum clock period is 2 × 10 = 20 ns, and the maximum clock frequency is 50 MHz.
References: Embedded Systems Architecture: A Comprehensive Guide for Engineers and Programmers, Second Edition ISBN: 978-0-12-382196-6 Author: Tammy Noergaard Digital Electronics: A Practical Approach with VHDL, Ninth Edition ISBN-13: 978-0-13-254303-3 Author(s): William Kleitz