Professional Documents
Culture Documents
VLSI Design of A QDR SRAM Controller: A Project Report On
VLSI Design of A QDR SRAM Controller: A Project Report On
VLSI Design of a
QDR SRAM Controller
By
Amrita Banerjee
Smitha C. Suresh
Titu K. Zaman
Ushasree Boppudi
For the Partial Fulfillment of requirements of the course ECE-758,
VLSI DESIGN-II
Table of Contents
1) Abstract.....3
2) Introduction..4
3) Block Diagram of the QDR SRAM Controller. ...5
4) Hardware Architecture of the QDR SRAM Controller...6
5) VHDL Code..8
6) Synthesis.19
7) Critical path delay..........................................................................20
8) Test Bench ..................................21
9) Simulation...24
10) Schematic Generation38
11) Layout. 44
12) DRC and Overflows45
13) LVS...46
14) IC extraction47
15) Chip Area.48
16) Symbol of the QDR SRAM Controller..49
17) I/O pad bonding...50
18) GDS file.51
19) Summary...52
20) Reference..53
Abstract:
This document describes the interior operation of a QDR SRAM Controller
design that is used to interface between the Host and the QDR SRAM. This document
does attempt to describe rigorously every little detail. It gives an overview of the QDR
SRAM Controller modules inner working by taking examples and going through the
block diagram, timing diagram, schematic circuit description, simulation results, critical
path delay, and physical description including floor plan. All the results are attached to
this document to fulfill the reader demand. The objective of this project is to design a
QDR SRAM Controller that will interface between the Host and the QDR SRAM to read,
write or simultaneous read- write operations from and to QDR SRAM respectively. The
controller is optimized to operate at a frequency of 200MHz (but not lower than
167MHz) using TSMC 0.35m technology. It should have a minimum power
consumption, minimum chip area, minimum pin count and low noise.
Introduction:
Explosive growth of Internet is boosting the demand for high-speed data
communication. SRAMS are widely used in data communication systems, due to their
fast, low latency access to the CPU. The QDR SRAM Controller serves as the interface
between the Host and the QDR SRAM device. And it can be operated at 200MHz speed,
while now a days 167MHz is the working speed.
QDR SRAM controller features the HSTL I/O standards on QDR SRAM side and
LVTTL on Host side. HSTL eliminates the need for external level translators to interface
with high-speed memories. It reduces the over all system design complexity and cost is a
process and technology independent I/O standard. The HSTL nominal logic switching
rang is 0.0V to 1.5V hence faster outputs with reduced power dissipation and minimized
EMI radiation. It provides enhanced flexibility in optimizing system performance with
adjustable trip point (VREF) and output power supply voltage, also improves over all
system performances and hence is ideal for driving address busses to multiple memory
banks.
QDR SRAM stands for Quad Data Rate SRAM. It has separate input and output
ports for both read and write operations so that it can read, write, or simultaneous read
and write operations. Four words can be transferred from and to the QDR SRAM on
every clock cycle, two in the rising edge of the clock and two in the falling edge of the
clock.
There are different types of SRAMs:
a. Asynchronous SRAM.
b. PBSRAM.
c. NoBL SRAM.
d. ZBT SRAM.
Most existing SRAM solutions are relics from the PC time, with interfaces
designed to transfer data efficiently for PC-type single input/output (I/O) applications.
Continuous data transfer between the SRAM and the memory controller is a necessity in
most networking applications. In such applications, there are continuous transitions
between read and write cycles through the memory. Single I/O devices like standard
synchronous Pipelined SRAMs (PBSRAMs) do not perform well in these applications.
The No Bus Latency (NoBL)/Zero Bus Turnaround (ZBT) family of SRAMs have
optimized the synchronous SRAM architecture to allow nolatency in the read/write
transitions and have a 100% utilization of the I/O bus.
Cmd=00
Latch R
address
Decode CMD
/R address
(20, 19)
Latch W
address/
W data
Cmd =
01
/RPS(x)
On K
Wait
Cmd=1
0
/RPS(x)
On K
Cmd = 11
Write
Read
A(0:17)=Raddr
ess(0:17) On K
Decode
CMD /W
address (20,
19)
Read/Wr
ite
A(0:17)=W
address(0:17)
On K
R data(33:18)=
data (0:17) on / C
Data (33:18) =W
data (0:17) on / C
10
VHDL Code:
Top level QDR SRAM Controller:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity QDR_TOP is
Port (HOST_CLK: in std_logic;
HOST_DWL: in std_logic_vector(17 downto 0);
HOST_DWH: in std_logic_vector(17 downto 0);
HOST_DRL: out std_logic_vector(17 downto 0);
HOST_DRH: out std_logic_vector(17 downto 0);
HOST_A_R: in std_logic_vector(17 downto 0);
HOST_A_W: in std_logic_vector(17 downto 0);
CMD_RW: in std_logic_vector(1 downto 0);
RST: in std_logic;
QDR_K_CLK: out std_logic;
QDR_Kn_CLK: out std_logic;
QDR_C_CLK: out std_logic;
QDR_Cn_CLK: out std_logic;
QDR_A_RD: out std_logic_vector(17 downto 0);
QDR_A_WR: out std_logic_vector(17 downto 0);
QDR_WD_BW0: out std_logic_vector(17 downto 0);
QDR_WD_BW1: out std_logic_vector(17 downto 0);
QDR_D_R: in std_logic_vector(17 downto 0);
QDR_W: out std_logic;
QDR_R: out std_logic);
end QDR_TOP;
architecture RTL of QDR_TOP is
--***********************************************
--* Components declaration
--***********************************************
component ADD_GEN
Port (CLK90: in std_logic;
ADD_R: in std_logic_vector(17 downto 0);
ADD_W: in std_logic_vector(17 downto 0);
CMD_R: in std_logic;
CMD_W: in std_logic;
RST: in std_logic;
LOCK_PLL: in std_logic;
QDR_RD_A: out std_logic_vector(17 downto 0);
QDR_WR_A: out std_logic_vector(17 downto 0));
end component;
11
component CLK_GENERATE
Port (CLKIN: in std_logic;
RST: in std_logic;
CLK0: out std_logic;
CLK90: out std_logic;
K_CLK: out std_logic;
Kn_CLK: out std_logic;
C_CLK: out std_logic;
Cn_CLK: out std_logic;
CLK_LOCKED: out std_logic);
end component;
component WRITE_BURST
Port (CLK90: in std_logic;
D0: in std_logic_vector(17 downto
D1: in std_logic_vector(17 downto
CMD_W: in std_logic;
RST: in std_logic;
LOCK_PLL: in std_logic;
Q_WD_BW0: out std_logic_vector(17
Q_WD_BW1: out std_logic_vector(17
end component;
0);
0);
downto 0);
downto 0));
component READ_BURST
Port (C_CLK: in std_logic;
CLK90: in std_logic;
D: in std_logic_vector(17 downto 0);
CMD_R: in std_logic;
RST: in std_logic;
Q0: out std_logic_vector(17 downto 0);
Q1: out std_logic_vector(17 downto 0));
end component;
component CTRL_RW
Port (CMD_W: in std_logic;
CMD_R: in std_logic;
RST: in std_logic;
W_CYCLE_GEN: out std_logic;
R_CYCLE_GEN: out std_logic);
end component;
--***********************************************
--* Signals declaration
--***********************************************
signal CLK0: std_logic;
signal CLK90: std_logic;
signal K_C_LOCK: std_logic;
begin
ADD_W_R: ADD_GEN port map (CLK90 => CLK90,
ADD_W => HOST_A_W,
ADD_R => HOST_A_R,
CMD_W => CMD_RW(1),
CMD_R => CMD_RW(0),
12
13
14
signal
signal
signal
signal
signal
begin
C_W_DELAY: std_logic;
A_R_LATCH: std_logic_vector(17 downto 0);
A_W_LATCH: std_logic_vector(17 downto 0);
QDR_A_R: std_logic_vector(17 downto 0);
QDR_A_W: std_logic_vector(17 downto 0);
15
Clock Generator:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity CLK_GENERATE is
Port (CLKIN: in std_logic;
RST: in std_logic;
CLK0: out std_logic;
CLK90: out std_logic;
K_CLK: out std_logic;
Kn_CLK: out std_logic;
C_CLK: out std_logic;
Cn_CLK: out std_logic;
CLK_LOCKED: out std_logic);
end CLK_GENERATE;
architecture RTL of CLK_GENERATE is
--***********************************************
--* Signals and constants declaration
--***********************************************
signal
signal
signal
signal
signal
signal
signal
begin
16
else
if(clk_buf = clk_fbbuf)then
LOCKED_DLL <= '1';
end if;
end if;
end process;
CLK0 <= CLK_0;
CLK90 <= CLK_90;
K_CLK <= CLK_90;
Kn_CLK <= not (CLK_90);
C_CLK <= CLK_0;
Cn_CLK <= not (CLK_0);
CLK_LOCKED <= LOCKED_DLL;
end RTL;
17
Control Write:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity CTRL_RW is
Port (CMD_W: in std_logic;
CMD_R: in std_logic;
RST: in std_logic;
W_CYCLE_GEN: out std_logic;
R_CYCLE_GEN: out std_logic);
end CTRL_RW;
architecture RTL of CTRL_RW is
--***********************************************
--* Signals and constants declaration
--***********************************************
signal w_cycle: std_logic;
signal r_cycle: std_logic;
begin
r_cycle <= '1'
w_cycle <= '1'
W_CYCLE_GEN <=
R_CYCLE_GEN <=
end RTL;
18
Read Burst:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity READ_BURST is
Port (C_CLK: in std_logic;
CLK90: in std_logic;
D: in std_logic_vector(17 downto 0);
CMD_R: in std_logic;
RST: in std_logic;
Q0: out std_logic_vector(17 downto 0);
Q1: out std_logic_vector(17 downto 0));
end READ_BURST;
architecture RTL of READ_BURST is
--***********************************************
--* Components declaration
--***********************************************
component ASYNR_DFF
port(CLK: in std_logic;
D: in std_logic;
RST: in std_logic;
Q : out std_logic);
end component;
component ASYNR_DFF18
port(CLK: in std_logic;
D: in std_logic_vector(17 downto 0);
RST: in std_logic;
Q : out std_logic_vector(17 downto 0));
end component;
--***********************************************
--* Signals and constants declaration
--***********************************************
signal C_CLK_BAR : std_logic;
signal CLK270: std_logic;
signal C_RD: STD_LOGIC;
begin
19
20
Write Burst:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity WRITE_BURST is
Port (CLK90: in std_logic;
D0: in std_logic_vector(17 downto
D1: in std_logic_vector(17 downto
CMD_W: in std_logic;
RST: in std_logic;
LOCK_PLL: in std_logic;
Q_WD_BW0: out std_logic_vector(17
Q_WD_BW1: out std_logic_vector(17
end WRITE_BURST;
0);
0);
downto 0);
downto 0));
21
Asynchronous D flip-flop:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ASYNR_DFF is
Port (CLK: in std_logic;
D: in std_logic;
RST: in std_logic;
Q: out std_logic);
end ASYNR_DFF;
architecture RTL of ASYNR_DFF is
begin
process (CLK,RST)
begin
if(RST = '0')then
Q <= '0';
elsif(CLK'event and CLK = '1')then
Q <= D;
end if;
end process;
end RTL;
22
23
24
Synthesis:
25
Critical path:
26
27
HOST_CLK : std_logic;
HOST_DWL : std_logic_vector(17 downto 0);
HOST_DWH : std_logic_vector(17 downto 0);
HOST_DRL : std_logic_vector(17 downto 0);
HOST_DRH : std_logic_vector(17 downto 0);
HOST_A_R : std_logic_vector(17 downto 0);
HOST_A_W : std_logic_vector(17 downto 0);
CMD_RW : std_logic_vector(1 downto 0);
RST : std_logic;
QDR_K_CLK : std_logic;
QDR_Kn_CLK : std_logic;
QDR_C_CLK : std_logic;
QDR_Cn_CLK : std_logic;
QDR_A_RD : std_logic_vector(17 downto 0);
QDR_A_WR : std_logic_vector(17 downto 0);
QDR_WD_BW0 : std_logic_vector(17 downto 0);
QDR_WD_BW1 : std_logic_vector(17 downto 0);
QDR_D_R : std_logic_vector(17 downto 0);
28
signal QDR_W :
signal QDR_R :
std_logic;
std_logic;
begin
DUT: QDR_TOP Port map(
HOST_CLK => HOST_CLK,
HOST_DWL => HOST_DWL,
HOST_DWH => HOST_DWH,
HOST_DRL => HOST_DRL,
HOST_DRH => HOST_DRH,
HOST_A_R => HOST_A_R,
HOST_A_W => HOST_A_W,
CMD_RW => CMD_RW,
RST => RST,
QDR_K_CLK => QDR_K_CLK,
QDR_Kn_CLK => QDR_Kn_CLK,
QDR_C_CLK => QDR_C_CLK,
QDR_Cn_CLK => QDR_Cn_CLK,
QDR_A_RD => QDR_A_RD,
QDR_A_WR => QDR_A_WR,
QDR_WD_BW0 => QDR_WD_BW0,
QDR_WD_BW1 => QDR_WD_BW1,
QDR_D_R => QDR_D_R,
QDR_W => QDR_W,
QDR_R => QDR_R
);
--***********************************************
-- Generate clock for the simulation
--***********************************************
process
begin
HOST_CLK <= '1';
wait for 5 ns;
HOST_CLK <= '0';
wait for 5 ns;
end process;
--***********************************************
-- Initialization
--***********************************************
process
begin
HOST_DWL <= "000000000000000000";
HOST_DWH <= "000000000000000000";
HOST_A_R <= "000000000000000000";
HOST_A_W <= "000000000000000000";
CMD_RW <= "00";
RST <= '0';
QDR_D_R <= "000000000000000000";
wait for 200 ns;
29
<=
<=
<=
<=
"000000000011001111";
"111100110000000000";
"000000000000100011";
"000000000011001100";
30
31
Simulation:
Clock Generator:
32
Read operation:
33
Write operation:
34
35
Idle or no operation:
36
VLSI Design
Schematic Generation
This is the schematic of the QDR top level design. The schematics of the subblocks of the QDR SRAM controller are in the following pages.
37
Address Generator:
38
Clock Generator:
Control Read/Write:
39
Read Burst:
40
Write Burst:
41
42
43
44
LVS:
Below is our present LVS report.
45
IC extraction:
IC extraction is an IC Station tool that obtains information from an IC layout
about parasitic resistance and parasitic capacitances.
Since the IC extraction depends entirely on the LVS, IC extraction could not be finished.
The following steps are followed for IC extraction:
46
Chip Area
The area of the chip is calculated by measuring length and height:
Length of the chip: 3338m
Height of the chip: 2764m
AREA of the chip = 9256192 m-sq
47
48
49
50
GDS File:
After the DRC, LVS, I/O pad bonding is finished, GDS file is obtained.
Following steps are required to get GDS file:
1. Go to Translate.
2. Click on write GDS II.
3. Give the name of the cell.
4. Give path and a name for output GDS file.
5. Give the path name of the log file which will be same as the
layout name but with .gds extension.
6. At the place of cell name, give the path of the map file.
7. After the above steps are followed, the gds file is obtained.
51
Summary:
- The design operates at 200 MHz.
- VHDL code is simulated using Modelsim and synthesized successfully
using Leonardo spectrum.
- Schematic Generation is done for QDR top level design and for all the sub-blocks
using mentor graphics tools.
- Place and Route is finished successfully using Mentor Graphics tools to use
TSMC .35um technology.
- The chip area and critical path delay is calculated.
- There are no overflows and DRC errors in the QDR top level design.
- LVS and IC extraction is in progress.
52
Reference:
53