Project Report Final 042112
Project Report Final 042112
AND
Area and Time optimization of ASIC “FIFO” design using Synopsys design compiler
In Electrical Engineering
By
May 2012
The graduate project of Pranav Biscuitwala is approved:
________________________________________________ ______________
Dr. Ali Amini Date
_________________________________________________ ______________
Dr. Somnath Chattopadhyay Date
_________________________________________________ ______________
Dr. Ramin Roosta, Chair Date
ii
ACKNOWLEDGEMENT
I would like to thank Dr. Ramin Roosta for introducing me to the field of ASIC
Design and to learn the basics of Front end ASIC design flow, Types of ASIC Architecture
and allowing me to use Synopsys compiler for verification of my design.
I also want to thank Dr. Ali Amini and Dr. Somnath Chattopadhyay for their
valued attention and encouragement.
Special thanks to Shashank, Keyur, Mayur, Tejas, Naveen for their guidance and
motivation. I also want to thank all my friends and my brother back in my home country
and CSUN for supporting and believing in me.
iii
TABLE OF CONTENTS
Signature Page .................................................................................................................... ii
Acknowledgement ............................................................................................................. iii
List of Figures ....................................................................................................................... v
List of Tables .................................................................................................................... vii
Abstract ............................................................................................................................. viii
iv
LIST OF FIGURES
vi
ABSTRACT
By
Part 1: In this the main objective of the project was to produce a VHDL design which can
be programmed on Altera DE2 board. This project gives an overview of how different
components of DE2 board can be interfaced. This project uses the various part of DE2
board like LCD screen, LEDs , Push Buttons, 7-segment display etc.
Part 2: In this the main objective of the project was to produce ASIC design and optimize
the design using synopsys tool. This optimization is done using 90nm technology. The
target was to create design of asynchronous FIFO for n-bit wide (using parameter) data.
Whose default width is 16 bits. Since it is asynchronous it’s input clock chosen is 200 MHz
and output clock is 40 MHz. In this data arrive in 32 word (n-bit wide) bursts. This
interface signals to the transmitting device when it is clear to send a burst.
This design was synthesized and simulated at the gate level. This design was optimized for
time and area.
vii
Ch ap t er 1 : Layout and Components of DE2 board
The following hardware is provided on the DE2 board:Altera Cyclone® II 2C35 FPGA
device
• Altera Serial Configuration device - EPCS16
• USB Blaster (on board) for programming and user API control; both JTAG and
Active Serial (AS) programming modes are supported
• 512-Kbyte SRAM
• 8-Mbyte SDRAM4-Mbyte Flash memory (1 Mbyte on some boards)
• SD Card socket
• 4 pushbutton switches
• 18 toggle switches
• 18 red user LEDs
• 9 green user LEDs
• 50-MHz oscillator and 27-MHz oscillator for clock sources
• 24-bit CD-quality audio CODEC with line-in, line-out, and microphone-in jacks
• VGA DAC (10-bit high-speed triple DACs) with VGA-out connector
• TV Decoder (NTSC/PAL) and TV-in connector
• 10/100 Ethernet Controller with a connector
• USB Host/Slave Controller with USB type A and type B connectors
1
• RS-232 transceiver and 9-pin connector
• PS/2 mouse/keyboard connector
• IrDA transceiver
• Two 40-pin Expansion Headers with diode protection
2
• Altera’s EPCS16 Serial Configuration device
• On-board USB Blaster for programming and user API control
• JTAG and AS programming modes are supported
SRAM
• 51 2-Kbyte Static RAM memory chip
• Organized as 256K x 16 bits
• Accessible as memory for the Nios II processor and by the DE2 Control Panel
SDRAM
• 8-Mbyte Single Data Rate Synchronous Dynamic RAM memory chip
• Organized as 1M x 16 bits x 4 banks
• Accessible as memory for the Nios II processor and by the DE2 Control Panel
Flash memory
• 4-Mbyte NOR Flash memory (1 Mbyte on some boards)
• 8-bit data bus
• Accessible as memory for the Nios II processor and by the DE2 Control Panel
SD card socket
• Provides SPI mode for SD Card access
• Accessible as memory for the Nios II processor with the DE2 SD Card Driver
Pushbutton switches
• 4 pushbutton switches
• Debounced by a Schmitt trigger circuit
• Normally high; generates one active-low pulse when the switch is pressed
Toggle switches
• 18 toggle switches for user inputs
• A switch causes logic 0 when in the DOWN (closest to the edge of the DE2 board) position
and logic 1 when in the UP position
Clock inputs
• 50-MHz oscillator
• 27-MHz oscillator
• SMA external clock input
Audio CODEC
• Wolfson WM873 1 24-bit sigma-delta audio CODEC
• Line-level input, line-level output, and microphone input jacks
• Sampling frequency: 8 to 96 KHz
• Applications for MP3 players and recorders, PDAs, smart phones, voice recorders, etc.
VGA output
• Uses the ADV7 123 240-MHz triple 10-bit high-speed video DAC
• With 15-pin high-density D-sub connector
• Supports up to 1600 x 1200 at 100-Hz refresh rate
• Can be used with the Cyclone II FPGA to implement a high-performance TV Encoder
NTSC/PAL TV decoder circuit
• Uses ADV7 181 B Multi-format SDTV Video Decoder
• Supports NTSC-(M,J,4.43), PAL-(B/D/G/H/I/M/N), SECAM
• Integrates three 54-MHz 9-bit ADCs
• Clocked from a single 27-MHz oscillator input
• Supports Composite Video (CVBS) RCA jack input.
• Supports digital output formats (8-bit/16-bit): ITU-R BT.656 YCrCb 4:2:2 output + HS, VS,
and FIELD
3
• Applications: DVD recorders, LCD TV, Set-top boxes, Digital TV, Portable video devices
5
Chapter:2 DE2 Control Panel
The DE2 board comes with a Control Panel facility that allows a user to access various components
on the board through a USB connection from a host computer. This chapter first presents some basic
functions of the Control Panel, then describes its structure in block diagram form, and finally
describes its capabilities.
2.1 Control Panel Setup
To run the Control Panel application, it is first necessary to configure a corresponding circuit in the
Cyclone II FPGA. This is done by downloading the configuration file DE2_USB_API.sof into the
FPGA. The downloading procedure is described in Section 4.1.
In addition to the DE2_USB_API.sof file, it is necessary to execute on the host computer the program
DE2_control_panel.exe. Both of these files are available on the DE2 System CD-ROM that
accompanies the DE2 board, in the directory DE2_control_panel. Of course, these files may already
have been installed to some other location on your computer system.
To activate the Control Panel, perform the following steps:
1. Connect the supplied USB cable to the USB Blaster port, connect the 9V power supply, and
turn the power switch ON
2. Set the RUN/PROG switch to the RUN position
3. Start the Quartus II software
4. Select Tools > Programmer to reach the window in Figure 2.1. Click on Add File and in
the pop-up window that appears select the DE2_USB_API.sof file. Next, click on the
Program/Configure box which results in the image displayed in the figure. Now, click Start
to download the configuration file into the FPGA.
5. Start the executable DE2_control_panel.exe on the host computer. The Control Panel user
interface shown in Figure 2.2 will appear.
6. Open the USB port by clicking Open > Open USB Port 0. The DE2 Control Panel
application will list all the USB ports that connect to DE2 boards. The DE2 Control Panel can
control up to 4 DE2 boards using the USB links. The Control Panel will occupy the USB port
until you close that port; you cannot use Quartus II to download a configuration file into the
FPGA until you close the USB port.
7. The Control Panel is now ready for use; experiment by setting the value of some 7-segment
display and observing the result on the DE2 board.
6
Figure 2.1. Quartus II Programmer window.
The concept of the DE2 Control Panel is illustrated in manual. The IP that performs the control
functions is implemented in the FPGA device. It communicates with the Control Panel window,
which is active on the host computer, via the USB Blaster link. The graphical interface is used to
issue commands to the control circuitry. The provided IP handles all requests and performs data
transfers between the computer and the DE2 board.
7
Figure 2.3. The DE2 Control Panel concept.
The DE2 Control Panel can be used to change the values displayed on 7-segment displays, light up
LEDs, talk to the PS/2 keyboard, read/write the SRAM, Flash Memory and SDRAM, load an image
pattern to display as VGA output, load music to the memory and play music via the audio DAC. The
feature of reading/writing a byte or an entire file from/to the Flash Memory allows the user to develop
multimedia applications (Flash Audio Player, Flash Picture Viewer) without worrying about how to
build a Flash Memory Programmer.
In the window shown in Figure 2.4, the values to be displayed by the 7-segment displays (which are
named HEX 7-0) can be entered into the corresponding boxes and displayed by pressing the Set
button. A keyboard connected to the PS/2 port can be used to type text that will be displayed on the
LCD display.
Choosing the LED & LCD tab leads to the window in Figure 2.4. Here, you can turn the individual
LEDs on by selecting them and pressing the Set button. Text can be written to the LCD display by
typing it in the LCD box and pressing the corresponding Set button.
The ability to set arbitrary values into simple display devices is not needed in typical design activities.
However, it gives the user a simple mechanism for verifying that these devices are functioning
correctly in case a malfunction is suspected. Thus, it can be used for troubleshooting purposes.
8
Figure 2.4. Controlling LEDs and the LCD display.
9
Read button. Figure 2.5 depicts the result of writing the hexadecimal value 6CA into location 200,
followed by reading the same location.
The Sequential Write function of the Control Panel is used to write the contents of a file into the
SDRAM as follows:
1. Specify the starting address in the Address box.
2. Specify the number of bytes to be written in the Length box. If the entire file is to be loaded,
then a checkmark may be placed in the File Length box instead of giving the number of
bytes.
3. To initiate the writing of data, click on the Write a File to SDRAM button.
4. When the Control Panel responds with the standard Windows dialog box asking for the
source file, specify the desired file in the usual manner.
The Control Panel also supports loading files with a .hex extension. Files with a .hex extension are
ASCII text files that specify memory values using ASCII characters to represent hexadecimal values.
For example, a file containing the line 0123456789ABCDEF defines four 16-bit values: 0123, 4567,
89AB, CDEF. These values will be loaded consecutively into the memory.
The Sequential Read function is used to read the contents of the SDRAM and place them into a file as
follows:
1. Specify the starting address in the Address box.
2. Specify the number of bytes to be copied into the file in the Length box. If the entire
contents of the SDRAM are to be copied (which involves all 8 Mbytes), then place a
checkmark in the Entire SDRAM box.
3. Press Load SDRAM Content to a File button.
4. When the Control Panel responds with the standard Windows dialog box asking for the
destination file, specify the desired file in the usual manner.
10
2.4 Flash Memory Programmer
The Control Panel can be used to write/read data to/from the Flash memory chip on the DE2 board. It
can be used to:
• Erase the entire Flash memory
• Write one byte to the memory
• Read one byte from the memory
• Write a binary file to the memory
• Load the contents of the Flash memory into a file
To open the Flash memory control window, shown in Figure 2.6, select the FLASH tab in the Control
Panel.
A byte of data can be written into a random location on the Flash chip as follows:
1. Click on the Chip Erase button. The button and the window frame title will prompt you to
wait until the operation is finished, which takes about 20 seconds.
11
2. Enter the desired address into the Address box and the data byte into the wDATA box. Then,
click on the Write button.
To read a byte of data from a random location, enter the address of the location and click on the Read
button. The rDATA box will display the data read back from the address specified.
The Sequential Write function is used to load a file into the Flash chip as follows:
1. Specify the starting address and the length of data (in bytes) to be written into the Flash
memory. You can click on the File Length checkbox to indicate that you want to load the
entire file.
2. Click on the Write a File to Flash button to activate the writing process.
3. When the Control Panel responds with the standard Windows dialog box asking for the
source file, specify the desired file in the usual manner.
The Sequential Read function is used to read the data stored in the Flash memory and write this data
into a file as follows:
1. Specify the starting address and the length of data (in bytes) to be read from the Flash
memory. You can click on the Entire Flash checkbox to indicate that you want to copy the
entire contents of the Flash memory into a specified file.
2. Click on the Load Flash Content to a File button to activate the reading process.
3. When the Control Panel responds with the standard Windows dialog box asking for the
destination file, specify the desired file in the usual manner.
Users can connect circuits of their own design to one of the User Ports of the SRAM/SDRAM/Flash
controller. Then, they can download binary data into the SRAM/SDRAM/Flash. Once the data is
downloaded to the SDRAM/Flash, users can configure the memory controllers so that their circuits can
read/write the SDRAM/Flash via the User Ports connected.
13
Ch a p ter 3 : Us i n g t h e D E 2 B oard
This chapter gives instructions for using the DE2 board and describes each of its I/O devices.
3.1 Configuring the Cyclone II FPGA
The procedure for downloading a circuit from a host computer to the DE2 board is described in the
tutorial Quartus I Introduction. This tutorial is found in the DE2_tutorials folder on the DE2 System
CD-ROM, and it is also available on the Altera DE2 web pages. The user is encouraged to read the
tutorial first, and to treat the information below as a short reference.
The DE2 board contains a serial EEPROM chip that stores configuration data for the Cyclone II
FPGA. This configuration data is automatically loaded from the EEPROM chip into the FPGA each
time power is applied to the board. Using the Quartus II software, it is possible to reprogram the
FPGA at any time, and it is also possible to change the non-volatile data that is stored in the serial
EEPROM chip. Both types of programming methods are described below.
1. JTA G programming: In this method of programming, named after the IEEE standards Joint
Test Action Group, the configuration bit stream is downloaded directly into the Cyclone II
FPGA. The FPGA will retain this configuration as long as power is applied to the board; the
configuration is lost when the power is turned off.
2. AS programming: In this method, called Active Serial programming, the configuration bit
stream is downloaded into the Altera EPCS16 serial EEPROM chip. It provides non-volatile
storage of the bit stream, so that the information is retained even when the power supply to
the DE2 board is turned off. When the board's power is turned on, the configuration data in
the EPCS16 device is automatically loaded into the Cyclone II FPGA.
The sections below describe the steps used to perform both JTAG and AS programming. For both
methods the DE2 board is connected to a host computer via a USB cable. Using this connection, the
board will be identified by the host computer as an Altera USB Blaster device. The process for
installing on the host computer the necessary software device driver that communicates with the USB
Blaster is described in the tutorial Getting Started with Altera's DE2 Board. This tutorial is available
on the DE2 System CD-ROM and from the Altera DE2 web pages.
14
Configuring the FPGA in JTAG Mode
Figure 3.1 illustrates the JTAG configuration setup. To download a configuration bit stream into the
Cyclone II FPGA, perform the following steps:
• Ensure that power is applied to the DE2 board
• Connect the supplied USB cable to the USB Blaster port on the DE2 board
• Configure the JTAG programming circuit by setting the RUN/PROG switch (on the left side
of the board) to the RUN position.
• The FPGA can now be programmed by using the Quartus II Programmer module to select a
configuration bit stream file with the .sof filename extension
15
Figure 3.2. The AS configuration scheme.
In addition to its use for JTAG and AS programming, the USB Blaster port on the DE2 board can also
be used to control some of the board's features remotely from a host computer.
16
Chapter 4 :Working of the Design and Code
In this User gets tree attempts to open the lock. The length of the password is of 8 bit, 2 bit for each push
buttons. This can be modified to improve the safety .
Initially LCD screen display “WELCOME HOME ENTER YOUR PIN”
If the entered code is right. The following message is displayed on LCD screen. Which is “DOOR IS
UNLOCKED PLEASE COME IN”
17
Figure 4.3 Unlocked display
If the entered code is wrong in second trial, user gets one more trial.
If the entered code is wrong in the third trial. The program enters into Admin mode. In this mode Admin
Password has to be entered. This password is different than the normal user password. Unless the correct
Admin password is entered, program will stay in the same state. Once the correct code is entered,
program will get reset and user gets three trials again to enter the code.
18
Figure 4.6 Admin Mode display
Once the correct code is entered, LEDs on the board will blink in ring counter pattern.
19
Figure 4.7 Block diagram of Digital Lock
entity digilock is
port(clk, reset, N, S, E, W: IN STD_LOGIC;
leds: out STD_LOGIC_VECTOR(7 DOWNTO 0);
LCD_DATA: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
LCD_RW, LCD_EN, LCD_RS: OUT STD_LOGIC;
LCD_ON, LCD_BLON: OUT STD_LOGIC);
end digilock;
);
20
END COMPONENT;
--FSM
COMPONENT FSM
PORT(
Nin : IN std_logic;
Sin : IN std_logic;
Ein : IN std_logic;
Win : IN std_logic;
clk : IN std_logic;
reset : IN std_logic;
num_entered : OUT std_logic_vector(2 downto 0);
state_out : OUT std_logic_vector(2 downto 0);
try_out: OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
mode_out : OUT std_logic;
correct : OUT std_logic
);
END COMPONENT;
--LCDdigilock
COMPONENT LCDdigilock
PORT (
Clk50Mhz, reset, unlock, mode: IN STD_LOGIC; --clk, mode, count, try,
unlock
count_key: in STD_LOGIC_VECTOR(2 DOWNTO 0);
try: in STD_LOGIC_VECTOR(1 DOWNTO 0);
LCD_DATA: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
LCD_RW, LCD_EN, LCD_RS: OUT STD_LOGIC;
LCD_ON, LCD_BLON: OUT STD_LOGIC);
END COMPONENT;
--clk generator
component clockGenerator
port(
sysClk: in std_logic;--50Mhz clock
msClk : out std_logic;
secClk: out std_logic);
end component;
SIGNAL msclk, secClk: STD_LOGIC;
SIGNAL mode, correct: STD_LOGIC;
SIGNAL count: std_logic_vector(2 downto 0);
SIGNAL try: STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL state_out: STD_LOGIC_VECTOR(2 DOWNTO 0);
begin
clkgen: clockGenerator port map(sysclk=>clk, msclk=>msclk, secClk=>secClk);
21
state_machine: fsm port map( Nin => not(N), Sin => not(S), Ein => not(E), Win =>
not(W), clk => clk, reset => reset, num_entered => count, state_out => state_out,
try_out=>try, mode_out => mode, correct => correct );
led: led_display port map(count=>count, clk=>secClk,mode=>mode, unlock=>correct,
try=>try, led=>leds);
lcd: LCDdigilock port map(Clk50Mhz=>clk, reset=>reset, unlock=>correct,
mode=>mode,count_key=>count,try=>try,LCD_DATA=>LCD_DATA,LCD_RW=>LCD
_RW, LCD_EN=>LCD_EN, LCD_RS=>LCD_RS,LCD_ON=>LCD_ON,
LCD_BLON=>LCD_BLON);
end Behavioral;
CLOCK GENERATOR
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity clockGenerator is
port(
sysClk: in std_logic;--50Mhz clock
msClk : out std_logic;
secClk: out std_logic);
end clockGenerator;
--generates secClk
if (msCnt = 500)then --half a second?
secclk<='1';
elsif (mscnt = 1000) then --a full second?
secClk <='0';
22
mscnt:=0;
end if;
end if;
end process;
end Behavioral;
23
LCD_DATA[6] PIN_H4 LCD Data[6]
24
Table 4.2 Pattern for character-generator RAM
Character to be displayed are written in “chararray” in the code. Each character has 8 bit
value. This value is as per the table above.
For example to display character “W”, It’s upper four bits are 0101 and lower four bits are
0111. So it’s equivalent Hex value is 57.
25
So X”57” will display “W” on LCD screen.
This are the few predefined code by HITACHI for reset, set, Off , On etc for LCD
Reset Data_bus _value=x”38”
Fun_set Data_bus_value=x”30”
Display off Data_bus_value=x”08”
Display clear Data_bus_value=x”01”
Display On Data_bus_value=x”0C”
Mode_set Data_bus_value=X”06”
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY LCDdigilock IS
PORT (
Clk50Mhz, reset, unlock, mode: IN STD_LOGIC; --clk, mode, count, try, unlock
count_key: in STD_LOGIC_VECTOR(2 DOWNTO 0);
try: in STD_LOGIC_VECTOR(1 DOWNTO 0);
LCD_DATA: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
LCD_RW, LCD_EN, LCD_RS: OUT STD_LOGIC;
LCD_ON, LCD_BLON: OUT STD_LOGIC);
END LCDdigilock;
27
SIGNAL count: INTEGER;
BEGIN
CASE state IS
-- LCD initialization sequence
-- The LCD_DATA is written to the LCD at the falling edge of the E
line
-- therefore we need to toggle the E line for each data write
WHEN s1 =>
LCD_DATA <= initcode(count);
LCD_EN <= '1'; -- EN=1;
LCD_RS <= '0'; -- RS=0; an instruction
LCD_RW <= '0'; -- R/W'=0; write
state <= s2;
WHEN s2 =>
LCD_EN <= '0'; -- set EN=0;
count <= count + 1;
IF count + 1 <= 7 THEN
state <= s1;
ELSE
state <= s10;
END IF;
if(unlock='0') then--locked
if(mode='0') then --usr mode
--led(7)<='1';
if(try="00") then
--led(6 DOWNTO 4)<="000"; -- welcome
home
LCD_DATA <= line1(count);
LCD_EN <= '1'; -- EN=1;
LCD_RS <= '1'; -- RS=1; data
LCD_RW <= '0'; -- R/W'=0; write
state <= s13;
elsif(try="01") then
--led(6 DOWNTO 4)<="001"; -- trial 2/3
LCD_DATA <= line3(count);
LCD_EN <= '1'; -- EN=1;
LCD_RS <= '1'; -- RS=1; data
LCD_RW <= '0'; -- R/W'=0; write
state <= s13;
elsif(try="10") then
--led(6 DOWNTO 4)<="011"; -- trial 3/3
LCD_DATA <= line4(count);
LCD_EN <= '1'; -- EN=1;
LCD_RS <= '1'; -- RS=1; data
LCD_RW <= '0'; -- R/W'=0; write
state <= s13;
else--(try="11") then
--led(6 DOWNTO 4)<="111"; -- trial 4/4
--LCD_DATA <= line5(count);
--LCD_EN <= '1'; -- EN=1;
--LCD_RS <= '1'; -- RS=1; data
--LCD_RW <= '0'; -- R/W'=0; write
state <= s13;
end if;
else --admin mode
--led(7 DOWNTO 4)<=X"F"; -- enter admin
code
LCD_DATA <= line6(count);
LCD_EN <= '1'; -- EN=1;
LCD_RS <= '1'; -- RS=1; data
LCD_RW <= '0'; -- R/W'=0; write
29
state <= s13;
end if;
else
--led<=temp_count; -- door is unlocked
LCD_DATA <= line7(count);
LCD_EN <= '1'; -- EN=1;
LCD_RS <= '1'; -- RS=1; data
LCD_RW <= '0'; -- R/W'=0; write
state <= s13;
end if;
--------------------------------------
-- if (unlock = '0' ) then
-- LCD_DATA <= line3(count);
-- LCD_EN <= '1'; -- EN=1;
-- LCD_RS <= '1'; -- RS=1; data
-- LCD_RW <= '0'; -- R/W'=0; write
-- state <= s13;
-- else
-- LCD_DATA <= line1(count);
-- LCD_EN <= '1'; -- EN=1;
-- LCD_RS <= '1'; -- RS=1; data
-- LCD_RW <= '0'; -- R/W'=0; write
-- state <= s13;
-- end if;
-------------------------------------------
-------------------
if(unlock='0') then--locked
if(count_key="000") then
--led(3 DOWNTO 0)<=X"0"; -- enter your pin
31
LCD_DATA <= line11(count);
LCD_EN <= '1'; -- EN=1;
LCD_RS <= '1'; -- RS=1; data
LCD_RW <= '0'; -- R/W'=0; write
state <= s23;
end if;
else
-- Please Come In
LCD_DATA <= line12(count);
LCD_EN <= '1'; -- EN=1;
LCD_RS <= '1'; -- RS=1; data
LCD_RW <= '0'; -- R/W'=0; write
state <= s23;
end if;
--------------------
-- else
-- LCD_DATA <= line2(count);
-- LCD_EN <= '1'; -- EN=1;
-- LCD_RS <= '1'; -- RS=1; data
-- LCD_RW <= '0'; -- R/W'=0; write
-- state <= s23;
-- end if;
-------------------------------------------------------------
END PROCESS;
ClockDivide: PROCESS
BEGIN
WAIT UNTIL Clk50Mhz'EVENT and Clk50Mhz = '1';
IF clockticks < max THEN
clockticks <= clockticks + 1;
ELSE
clockticks <= 0;
END IF;
IF clockticks < half THEN
clock <= '0';
ELSE
clock <= '1';
END IF;
END PROCESS;
END FSMD;
4.4 Using the LEDs and Switches
The DE2 board provides four pushbutton switches. Each of these switches is debounced
using a Schmitt Trigger circuit.. The four outputs called KEY0, …, KEY3 of the
Schmitt Trigger device are connected directly to the Cyclone II FPGA. Each switch
provides a high logic level (3.3 volts) when it is not pressed, and provides a low logic
level (0 volts) when depressed. Since the pushbutton switches are debounced, they are
appropriate for use as clock or reset inputs in a circuit.
There are also 18 toggle switches (sliders) on the DE2 board. These switches are not
debounced, and are intended for use as level-sensitive data inputs to a circuit. Each
33
switch is connected directly to a pin on the Cyclone II FPGA. When a switch is in the
DOWN position (closest to the edge of the board) it provides a low logic level (0 volts)
to the FPGA, and when the switch is in the UP position it provides a high logic level (3.3
volts)
There are 27 user-controllable LEDs on the DE2 board. Eighteen red LEDs are situated
above the 18 toggle switches, and eight green LEDs are found above the pushbutton
switches (the 9t h green LED is in the middle of the 7-segment displays). Each LED is
driven directly by a pin on the Cyclone II FPGA; driving its associated pin to a high
logic level turns the LED on, and driving the pin low turns it off. A schematic diagram
that shows the pushbutton and toggle switches is given in Figure 4.10. A schematic
diagram that shows the LED circuitry appears in Figure 4.11.
A list of the pin names on the Cyclone II FPGA that are connected to the toggle
switches is given in Table 4.3. Similarly, the pins used to connect to the pushbutton
switches and LEDs are displayed in Tables 4.4 and 4.5, respectively.
34
Figure 4.11. Schematic diagram of the LEDs.
35
Table 4.3. Pin assignments for the toggle switches
36
LEDG[5] PIN_U17 LED Green[5]
LED DISPAY
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity led_display is
port( count: in STD_LOGIC_VECTOR(2 DOWNTO 0);
clk, mode, unlock: in STD_LOGIC;
try: in STD_LOGIC_VECTOR(1 DOWNTO 0);
led: out STD_LOGIC_VECTOR(7 DOWNTO 0));
end led_display;
if(count="000") then
37
led(3 DOWNTO 0)<=X"0";
elsif(count="001") then
led(3 DOWNTO 0)<=X"1";
elsif(count="010") then
led(3 DOWNTO 0)<=X"3";
elsif(count="011") then
led(3 DOWNTO 0)<=X"7";
elsif(count="100") then
led(3 DOWNTO 0)<=X"F";
end if;
else --unlcocked
case temp_count is
when "00000001" => temp_count
<="00000010";
when "00000010" => temp_count
<="00000100";
when "00000100" => temp_count
<="00001000";
when "00001000" => temp_count
<="00010000";
when "00010000" => temp_count
<="00100000";
when "00100000" => temp_count
<="01000000";
when "01000000" => temp_count
<="10000000";
when "10000000" => temp_count
<="00000001";
when others => temp_count <="00000001";
end case;
led<=temp_count;
end if;
end if;
end process;
end Behavioral;
38
Figure 4.12 STATE MACHINE FOR DIGITAL LOCK
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity FSM is
port(Nin, Sin, Ein, Win, clk, reset: in STD_LOGIC;
num_entered: out STD_LOGIC_VECTOR(2 DOWNTO 0);
state_out: out STD_LOGIC_VECTOR(2 DOWNTO 0);
try_out: out STD_LOGIC_VECTOR(1 DOWNTO 0);
mode_out, correct: out STD_LOGIC);
end FSM;
39
attribute ENUM_ENCODING: STRING;
attribute ENUM_ENCODING of STATE_TYPE:type is "000 001 010 011 100";
signal state: STATE_TYPE;
begin
process(state,clk, Nin, Win, Sin, Ein, reset, count, try, mode, k0,k1,k2,k3)
variable temp: STD_LOGIC_VECTOR(1 DOWNTO 0);
begin
if(reset='1') then
state<=usr_store;
correct<='0';
count<="000";
try<="00";
mode<='0';
else
if(clk'EVENT AND clk='1') then
case state is
when usr_store=>
if(Nin='1') then
temp:="00";
count<=count+1;
state<=usr_wait4release;
elsif(Sin='1') then
temp:="01";
count<=count+1;
state<=usr_wait4release;
elsif(Ein='1') then
temp:="10";
count<=count+1;
state<=usr_wait4release;
elsif(Win='1') then
temp:="11";
count<=count+1;
state<=usr_wait4release;
else
count<=count;
temp:=temp;
state<=state;
end if;
if(count="000") then
k0<=temp;
elsif(count="001") then
k1<=temp;
40
elsif(count="010") then
k2<=temp;
elsif(count="011") then
k3<=temp;
end if;
when usr_wait4release=>
if(Nin='0' AND Sin='0' AND Win='0' AND
Ein='0') then
if(count="100") then --all
entered
if(usr_key=(k3 & k2 &
k1 & k0)) then --correct key
state<=good;
else --wrong try
if(try="10") then
mode<='1';
state<=admin_store;
count<="000";
else
try<=try+1;
state<=usr_store;
count<="000";
end if;
end if;
else
state<=usr_store;
end if;
end if;
when admin_store=>
if(Nin='1') then
temp:="00";
count<=count+1;
state<=admin_wait4release;
elsif(Sin='1') then
temp:="01";
count<=count+1;
state<=admin_wait4release;
elsif(Ein='1') then
temp:="10";
count<=count+1;
state<=admin_wait4release;
elsif(Win='1') then
41
temp:="11";
count<=count+1;
state<=admin_wait4release;
else
count<=count;
temp:=temp;
state<=state;
end if;
if(count="000") then
k0<=temp;
elsif(count="001") then
k1<=temp;
elsif(count="010") then
k2<=temp;
elsif(count="011") then
k3<=temp;
end if;
when admin_wait4release=>
if(Nin='0' AND Sin='0' AND Win='0' AND
Ein='0') then
if(count="100") then --all entered
if(admin_key=(k3 & k2 & k1 & k0)) then --
correct key
state<=usr_store;
count<="000";
mode<='0';
try<="00";
else --wrong try
count<="000";
state<=admin_store;
end if;
else
state<=admin_store;
end if;
end if;
when good=>
correct<='1';
state<=good;
when OTHERS=> state<=usr_store;
end case;
end if;
end if;
end process;
42
mode_out<=mode;
num_entered<=count;
try_out<=try;
process(state)
begin
case state is
when usr_store=> state_out<="000";
when usr_wait4release=> state_out<="001";
when admin_store =>state_out<="010";
when admin_wait4release=> state_out<="011";
when good=> state_out<="101";
when others=> state_out<="111";
end case;
end process;
end Behavioral;
Pin Planner:
Flow summery:
43
Analysis and Synthesis Summary
44
Chapter 5: FIFO structure and Design code
AREA AND TIME OPTIMIZATION OF ASIC “FIFO” DESIGN USING SYNOPSYS DESIGN
COMPILER
This is the top module of FIFO design here the aysnchrnously received data from
the one clock domain is transferred to the other clock domain. The data received
from one clock domain is stored in FIFO and then the second domain reads the data
that are stored in FIFO.
`timescale 1ns/1ns
45
module fifo_top(wrt_clk, wrt_rst, wrt_inc, full_flag, rd_clk, rd_rst, rd_inc,
empty_flag, write_data, read_data, read_add, write_add,
write_pointer, read_pointer);
46
assign empty_flag = empty_flg;
assign full_flag = full_flg;
assign read_add = rd_addr;
assign write_add = wrt_addr;
assign write_pointer = wrt_pntr;
assign read_pointer = rd_pntr;
endmodule
Filename: aasd.v
`timescale 1ns/1ns
module aasd(in,clock,reset,aasd);
parameter width = 16;
input clock, reset;
input [width-1:0]in;
output [width-1:0]aasd; // output aasd is of size 8
reg [width-1:0]aasd;
reg [width-1:0]temp; //temporary signal used as output of one register
// and input to other register
Filename: full_flag.v
This code will generate the full flag after comparing the read pointer from
the read clock domain which will be synchronized into the write clock domain and
then will be compared with the write pointer
`timescale 1ns/1ns
parameter addr = 6;
reg full_flag;
always@(read_pointer, write_pointer)
begin
if((write_pointer[addr-1] != read_pointer[addr-1]) &&
(write_pointer[addr-2] != read_pointer[addr-2]) &&
(write_pointer[addr-3:0] == read_pointer[addr-3:0]) || !clk_en)
full_flag = 1'b1; //if the first two MSB's are opposite and
//then all other bits are equal then full
//flag will go high
else
full_flag = 1'b0;// else it will remain low
end
endmodule
Filename: empty_flag.v
This code will generate the empty flag after comparing the write pointer from
the write clock domain which will be synchronized into the read clock domain and
48
then will be compared with the read pointer
`timescale 1ns/1ns
parameter size = 6;
reg empty_flag;
always@(read_pointer, write_pointer)
begin
if(read_pointer == write_pointer)
empty_flag = 1'b1; //if gray pointer of read and write are equal
// then the empty flag will go high
else
empty_flag = 1'b0; //else it will remain low
end
endmodule
Filename: write_pntr.v
`timescale 1ns/1ns
49
reg wclk_en;
reg [size-1:0] write_pointer;
reg [size-2:0] write_address;
reg [size-1:0] bnext;
Filename: read_pntr.v
`timescale 1ns/1ns
51
end
else
begin
read_address = b_next[size-2:0];
read_pointer = bin_gray(b_next);
if(incrementer && !flag)
b_next = b_next + 1;
else
b_next = b_next + 0;
end
end
endmodule
Filename: memory.v
Here is a design of a memory with parallel read and write. Read clock will enable
to read data from the memory and write clock will allow us to write to the memory
`timescale 1ns/1ns
//defining the parameter for width and length of the FIFO memory
parameter width = 16;
parameter addr = 5;
parameter length = 2**addr;
All this modules were connected as shown in block diagram. All the modules
created in this lab is scalable.
Value of addr is passed to full_flag and empty_flag.
I pass the value for memory width and address, which is 16 and 5 respectively. So
length is calculated , which is 2^5 =32 (00 to 1f)
Analyze:
In the test bench data is created using counter. Since data has to be written on the
memory in synchronous with the write clock I incremented data with the period of
5ns.
53
Write 00 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C
data
Read 00 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C
data
54
Figure 5.3 Read from the Memory
3. Empty flag get clear when data is written onto the memory.
From the following waveform we can clearly see that initially value of signal “empty_flag”
is 1. Once we start writing data onto memory,as soon as the posedge of “rd_clk” comes the
“empty_flag” is cleared. Since the “empty_flag “ is cleared data is being read , which is
0000 at address 00 and so on.
55
Figure 5.4 Empty Flag
Empty flag is high as soon as the value for the read and the write pointer is equal. From the figure
below we can see that , value for the read pointer and write pointer is 110101.
By comparing this two I am sure that data being read is not the data written on
2nd time. So fifo is functioning properly even with the latency of 2.
57
Chapter 6: Preparing Design Files for Synthesis
(Reference: Naveen Kumar Project 2011 “Power Optimization in ASIC Design using
Synopsys design ” )
Designs (that is, design descriptions) are stored in design files. Design files must
have unique names. If a design is hierarchical, each sub-design refers to another design
file, which must also have a unique name. Note, however, that different design files can
contain sub-designs with identical names.
58
6.2 Partitioning for Synthesis
Partitioning a design effectively can enhance the synthesis results, reduce compile time,
and simplify the constraint and script files.Partitioning affects block size, and although
Design Compiler has no inherent block size limit, proper care should be taken to control
block size.
If the blocks are made too small, artificial boundaries can be created that restrict effective
optimization. If very large blocks are created, compile runtimes can be lengthy. The
following strategies to partition your design and improve optimization and runtimes:
• Partition for design reuse.
• Keep related combinational logic together.
• Register the block outputs.
• Partition by design goal.
• Partition by compile technique.
• Keep sharable resources together.
• Keep user-defined resources with the logic they drive.
• Isolate special functions, such as pads, clocks, boundary scans, and asynchronous
logic.
59
Chapter 7: Basic Commands
(reference: Naveen Kumar Project 2011 “Power Optimization in ASIC Design using Synopsys design ” )
This chapter lists the basic dc_shell commands for synthesis and provides a brief description for
each command. The commands are grouped in the following sections: x Commands for Defining
Design Rules
• Commands for Defining Design Environments
• Commands for Setting Design Constraints
• Commands for Analyzing and Resolving Design Problems
60
model the drive capability of an external driver.
• set_fanout_load
Defines the external fan-out load values on output ports.
• set_load
Defines the external load values on input and output ports and nets.
• set_operating_conditions
Defines the operating conditions for the current design.
• set_wire_load_model
Sets the wire load model for the current design or for the specified ports. With this command, one
can specify the wire load model to use for the external net connected to the output port.
61
Specifies a minimum delay target for selected paths in the current design.
• report_constraint
Lists the constraints on the current design and their cost, weight, and weighted cost.
• report_delay_calculation
Reports the details of a delay arc calculation.
• report_design
Displays the operating conditions, wire load model and mode, timing ranges, internal
input and output, and disabled timing arcs defined for the current design. x
62
report_hierarchy
Lists the children of the current design.
• report_net
Displays net information for the design of the current instance, if set; otherwise,
displays net information for the current design.
• report_path_group
Lists all timing path groups in the current design.
• report_port
Lists information about ports in the current design.
• report_qor
Displays information about the quality of results and other statistics for the current
design.
• report_resources
Displays information about the resource implementation.
• report_timing
Lists timing information for the current design.
• report_timing_requirements
Lists timing path requirements and related information.
• report_transitive_fanin
Lists the fan-in logic for selected pins, nets, or ports of the current instance. x
report_transitive_fanout
Lists the fan-out logic for selected pins, nets, or ports of the current instance.
63
analyze -f verilog empty_flag.v
elaborate empty_flag
check_design
#setting false path for the signals crossing the clock domain
set_false_path -from [get_clocks wrt_clk] -to [get_clocks rd_clk]
set_false_path -from [get_clocks rd_clk] -to [get_clocks wrt_clk]
64
****************************************
Report : area
Design : fifo_top
****************************************
****************************************
Report : timing
-path full
-delay max
-max_paths 1
Design : fifo_top
****************************************
65
Wire Load Model Mode: enclosed
Startpoint: rpt/read_address_reg[1]
(rising edge-triggered flip-flop clocked by rd_clk)
Endpoint: mem/rdata_reg[2]
(rising edge-triggered flip-flop clocked by rd_clk)
Path Group: rd_clk
Path Type: max
66
Startpoint: wpt/write_address_reg[0]
(rising edge-triggered flip-flop clocked by wrt_clk)
Endpoint: mem/memory_reg[28][6]
(rising edge-triggered flip-flop clocked by wrt_clk)
Path Group: wrt_clk
Path Type: max
7.6 This is the script file to synthesize the FIFO design bottom up
This is the script file to compile the top module using the Characterized lower level modules
check_design
#setting false path for the signals crossing the clock domain
set_false_path -from [get_clocks wrt_clk] -to [get_clocks rd_clk]
set_false_path -from [get_clocks rd_clk] -to [get_clocks wrt_clk]
#compiling the full flag design
68
create_clock clock -period 5
compile
check_design
write -f ddc -o write_pntr_bot_up.ddc
quit
#compiling the read pointer design
FIFO _TOP_GATES
`timescale 1ns/1ns
module fifo_top_gates ( wrt_clk, wrt_rst, wrt_inc, full_flag, rd_clk, rd_rst, rd_inc,
empty_flag, write_data, read_data, read_add, write_add, write_pointer,
read_pointer );
input [15:0] write_data;
output [15:0] read_data;
output [4:0] read_add;
output [4:0] write_add;
output [5:0] write_pointer;
output [5:0] read_pointer;
input wrt_clk, wrt_rst, wrt_inc, rd_clk, rd_rst, rd_inc;
69
output full_flag, empty_flag;
wire \wq2_rpntr[0] , wrt_rst_syn, \mem/N68 , \mem/N67 , \mem/N66 ,
\mem/N65 , \mem/N64 , \mem/N63 , \mem/N62 , \mem/N61 , \mem/N60 ,
\mem/N59 , \mem/N58 , \mem/N57 , \mem/N56 , \mem/N55 , \mem/N54 ,
\mem/N53 , \mem/N36 , \mem/N35 , \mem/N34 , \mem/N33 , \mem/N32 ,
\mem/N31 , \mem/N30 , \mem/N29 , \mem/N28 , \mem/N27 , \mem/N26 ,
\mem/N25 , \mem/N24 , \mem/N23 , \mem/N22 , \mem/N21 ,
\mem/memory[0][0] , \mem/memory[0][1] , \mem/memory[0][2] ,
\mem/memory[0][3] , \mem/memory[0][4] , \mem/memory[0][5] ,
\mem/memory[0][6] , \mem/memory[0][7] , \mem/memory[0][8] ,
\mem/memory[0][9] , \mem/memory[0][10] , \mem/memory[0][11] ,
EMPTY_FLAG_GATES
`timescale 1ns/1ns
module empty_flag_gates ( read_pointer, write_pointer, empty_flag );
input [5:0] read_pointer;
input [5:0] write_pointer;
output empty_flag;
wire n3, n4, n5, n6, n7, n8, n9;
FULL_FLAG_GATES
`timescale 1ns/1ns
module full_flag_gates ( write_pointer, read_pointer, full_flag, clk_en );
input [5:0] write_pointer;
input [5:0] read_pointer;
input clk_en;
output full_flag;
wire n9, n10, n11, n12, n13, n14, n15, n16;
70
EMPTY_FLAG_GATES
`timescale 1ns/1ns
module empty_flag_gates ( read_pointer, write_pointer, empty_flag );
input [5:0] read_pointer;
input [5:0] write_pointer;
output empty_flag;
wire n3, n4, n5, n6, n7, n8, n9;
READ_PNTR_GATES
`timescale 1ns/1ns
module read_pntr_gates ( clock, reset, incrementer, flag, read_pointer, read_address
);
output [5:0] read_pointer;
output [4:0] read_address;
input clock, reset, incrementer, flag;
wire N2, N3, N4, N5, N6, n11, n14, n17, n20, n22, n24, n36, n37, n38, n39,
n40, n41, n42, n43, n44, n45, n46, n47;
wire [5:0] b_next;
WRITE_PNTR_GATES
`timescale 1ns/1ns
module write_pntr_gates ( clock, reset, incrementer, write_flag, empty_flag, wclk_en,
write_pointer, write_address );
output [5:0] write_pointer;
71
output [4:0] write_address;
input clock, reset, incrementer, write_flag, empty_flag;
output wclk_en;
wire N3, N4, N5, N6, N7, n16, n17, n19, n21, n23, n25, n27, n39, n40, n41,
n42, n43, n44, n45, n46, n48, n49, n50, n51, n52, n53;
wire [5:0] bnext;
MEMORY_GATES
`timescale 1ns/1ns
module memory_gates ( wdata, waddr, w_clken, wclk, raddr, rclk, rdata );
input [15:0] wdata;
input [4:0] waddr;
input [4:0] raddr;
output [15:0] rdata;
input w_clken, wclk, rclk;
wire N10, N11, N12, N13, N14, N15, N16, N17, N18, N19, \memory[31][15] ,
\memory[31][14] , \memory[31][13] , \memory[31][12] ,
\memory[31][11] , \memory[31][10] , \memory[31][9] , \memory[31][8] ,
\memory[31][7] , \memory[31][6] , \memory[31][5] , \memory[31][4] ,
\memory[31][3] , \memory[31][2] , \memory[31][1] , \memory[31][0] ,
\memory[30][15] , \memory[30][14] , \memory[30][13] ,
\memory[30][12] , \memory[30][11] , \memory[30][10] , \memory[30][9] ,
\memory[30][8] , \memory[30][7] , \memory[30][6] , \memory[30][5] ,
\memory[30][4] , \memory[30][3] , \memory[30][2] , \memory[30][1] ,
\memory[30][0] , \memory[29][15] , \memory[29][14] , \memory[29][13] ,
\memory[29][12] , \memory[29][11] , \memory[29][10] , \memory[29][9] ,
\memory[29][8] , \memory[29][7] , \memory[29][6] , \memory[29][5] ,
\memory[29][4] , \memory[29][3] , \memory[29][2] , \memory[29][1] ,
\memory[29][0] , \memory[28][15] , \memory[28][14] , \memory[28][13] ,
\memory[28][12] , \memory[28][11] , \memory[28][10] , \memory[28][9] ,
\memory[28][8] , \memory[28][7] , \memory[28][6] , \memory[28][5] ,
AASD_GATES
`timescale 1ns/1ns
module aasd_gates ( in, clock, reset, aasd );
input [15:0] in;
output [15:0] aasd;
input clock, reset;
72
DFFARX1 \aasd_reg[15] ( .D(in[15]), .CLK(clock), .RSTB(reset), .Q(aasd[15])
);
DFFARX1 \aasd_reg[14] ( .D(in[14]), .CLK(clock), .RSTB(reset), .Q(aasd[14])
);
DFFARX1 \aasd_reg[13] ( .D(in[13]), .CLK(clock), .RSTB(reset), .Q(aasd[13])
);
DFFARX1 \aasd_reg[12] ( .D(in[12]), .CLK(clock), .RSTB(reset), .Q(aasd[12])
);
DFFARX1 \aasd_reg[11] ( .D(in[11]), .CLK(clock), .RSTB(reset), .Q(aasd[11])
);
DFFARX1 \aasd_reg[10] ( .D(in[10]), .CLK(clock), .RSTB(reset), .Q(aasd[10])
);
DFFARX1 \aasd_reg[9] ( .D(in[9]), .CLK(clock), .RSTB(reset), .Q(aasd[9]) );
DFFARX1 \aasd_reg[8] ( .D(in[8]), .CLK(clock), .RSTB(reset), .Q(aasd[8]) );
DFFARX1 \aasd_reg[7] ( .D(in[7]), .CLK(clock), .RSTB(reset), .Q(aasd[7]) );
DFFARX1 \aasd_reg[6] ( .D(in[6]), .CLK(clock), .RSTB(reset), .Q(aasd[6]) );
Library(s) Used:
Number of ports: 62
Number of nets: 77
Number of cells: 9
Number of references: 7
73
7.6.3 Timing report for top level module
****************************************
Report : timing
-path full
-delay max
-max_paths 1
Design : fifo_top
****************************************
# A fanout number of 1000 was used for high fanout net computations.
Startpoint: rpt/read_address_reg[0]
(rising edge-triggered flip-flop clocked by rd_clk)
Endpoint: mem/rdata_reg[0]
(rising edge-triggered flip-flop clocked by rd_clk)
Path Group: rd_clk
Path Type: max
74
mem/C1243/Z_15 (fifo_top_MUX_OP_32_5_16) 0.00 1.52 f
mem/rdata_reg[0]/next_state (**SEQGEN**) 0.00 1.52 f
data arrival time 1.52
Startpoint: wpt/write_address_reg[0]
(rising edge-triggered flip-flop clocked by wrt_clk)
Endpoint: mem/memory_reg[0][0]
(rising edge-triggered flip-flop clocked by wrt_clk)
Path Group: wrt_clk
Path Type: max
76
REFERENCES
[1] Michael John Sebastian Smith [June 1997], “Application-Specific Integrated Circuits”, Addison-
Wesley Publishing Company, VLSI Design Series. [April 2011]
[2] http://users.ece.gatech.edu/~hamblen/DE2/DE2%20Reference%20Manual.pdf [Jan 2011]
[3] Himanshu Bhatnagar ~Advanced ASIC chip Synthesis~ Using Synopsys Design Compiler,
Physical Compiler and Primetime. [March 2011]
[4] http://en.wikipedia.org/wiki/Application-specific_integrated_circuit [Feb 2011]
[5] http://www.tutorial-reports.com/hardware/asic/overview.php [Feb 2011]
[6] http://www.utdallas.edu/~zhoud/Lecture 1 .pdf [April 2011]
[7] http://iroi.seu.edu.cn/books/asics/Book2/CH01/CH0 1.1 .htm [Oct 2011]
[8] SYNOPSYS Design Compiler User Guide [December 2011]
[9] http://www.csun.edu/~glaw/ee420.htm [Jan 2012]
[10] http://www.csun.edu/~rmehler/ee527.htm [March 2011]
[11] http://www.synopsys.com/Tools/Implementation/RTLSynthesis/CapsuleModule/hss_bkgrd.pdf
[12] Naveen Kumar Project 2011 “POWER OPTIMIZATION IN ASIC DESIGN USING SYNOPSYS
DESIGN COMPILER” [March 2012]
77