Adding DRAM and SRAM support for the NoC
Generator
Kandidatexamensarbete
VIKTOR ÖBERG
Supervisor: Johnny Öberg and Francesco Robino
Examiner: William Sandqvist
Abstract
A NoC generator tool that generate an arbitrarily large Multi-core
platform, targeted for single-chip FPGA platforms was developed in
2011 by Johnny Öberg and Francesco Robino in the department of
elec-tronic system, KTH, Sweden. In the current implementation of the
platform, only on-chip memory is supported. However, the size of the
data the system needs to handle is often too large to fit in those
memo-ries. Thus, external memory access to both SRAM and SDRAM on the
FPGA board is needed. Adding external memories to an FPGA system
takes a lot of time and hard studies in the Altera platform handbooks.
Adding this feature to the NoC generator would save a lot of time for
the platform developers
In this thesis, an example design using external memories is analysed
to obtain the necessary information needed to update the NoC generator
to support SRAM and SDRAM.
Contents
1
Introduction
1
2
Design
3
2.1
Structure of SOPC file . . . .
3
2.2
The _hw.tcl structure . . . .
4
3
External SRAM and SDRAM
5
3.1
External SRAM . . . .
5
3.1.1
Advantages . . . .
5
3.1.2
Disadvantages . . . .
6
3.1.3
Best Applications . . . .
6
3.1.4
Poor Applications
. . . .
6
3.2
SDRAM . . . .
7
3.2.1
Advantages . . . .
7
3.2.2
Disadvantage . . . .
7
3.2.3
Best Applications . . . .
8
3.2.4
Poor Applications
. . . .
8
4
Adding external SRAM and SDRAM
9
4.1
External SRAM . . . .
9
4.2
Adding SDRAM
. . . .
11
5
Conclusion and future work
13
Bibliography
15
Chapter 1
Introduction
Multiprocessor system-on-a-chip is becoming more common to use in embedded
systems. The size of the data the systems need to process is also increasing. To
be able to grant this expansion the multiprocessor need to access both SRAM and
SDRAM on the FPGA board.
Both type of memories provide a larger size of
memory than the on-chip memory. The SRAM is just a few megabyte but is much
more faster then the SDRAM but on the other hand the SDRAM can store much
more data. So you have to consider which of this memories is best fitted for your
application. Johnny Öberg and Francesco Robino in the department of electronic
system, KTH, Sweden has development a NoC generator tool that allows you to
generate an arbitrarily large Multi-core platform from an XML configuration file,
targeted for single-chip FPGA platforms. In the XML file, the system designer
selects the target technology, the type of NoC topology, which kind of routers and
interconnection schemes that should be generated. For each processor node, a simple
configuration can be done[1].
In this thesis, a study how to add external SDRAM and SRAM for the existing
NoC generator is presented. It will describe the changes that have to be done for
the existing .sopc-file and what you need to add to make it work. The SDRAM
only communicate with the cpu 0 and the SRAM only communicate with cpu 1, to
access the memories you have to communicate with respective cpu.
Chapter 2
Design
2.1
Structure of SOPC file
The NoC generator generates the system .sopc-file for target Altera platform[1], the
.sopc-file contains the hardware contents of the SOPC builder system. It’s divided
in three sections that describes the hardware configuration of the platform.
1. Element- Contain basic information of all the components such as name and
id.
2. Module- Describes what kind of component it is and the value of the
param-eters for the component.
3. Connection- Describes which components that are connected to each other.
In figure 2.1 is a example of how a clock is described in the .sopc-file.
CHAPTER 2. DESIGN
2.2
The _hw.tcl structure
To define SOPC Builder components you can make a Hardware Component
De-scription File (_hw.tcl) that contains declarations of their properties and behavior.
Each _hw.tcl-file represents one component instance which you can add to an SOPC
Builder system.
A typical _hw.tcl file contains the following information[2] :
1. Basic component information-includes the components name, version, and
description, a link to its documentation, and pointers to HDL implementation
files for synthesis and simulation.
2. Parameter Declarations-Parameters are values that the user of your
compo-nent can set that affect how the compocompo-nent is implemented, such as the size
of a memory. Properties of each parameter include the parameter’s name,
whether or not it is visible, and, if visible, the text to display when
describ-ing it. When the SOPC Builder system is generated, the parameters can be
applied to the component as Verilog HDL parameters or VHDL generics.
3. Interface Properties-The interfaces of a component define how to connect it
to the rest of the system and determine how other components in the system
interact with it. When you add interfaces to a component, you declare which
signals make up each interface. You also define interface properties, such as
wait states for an Avalon
®Memory-Mapped (Avalon-MM) interface.
Chapter 3
External SRAM and SDRAM
Both SRAM and SDRAM are volatile memories. Volatile memories can only hold
their contents while power is applied to the memories. When the power is removed,
the memories loses their contents. Volatile memories are unusable for application
that have to retain data when the memory is switched off.
3.1
External SRAM
SRAM is a static RAM device that is connected externally to a FPGA. There are
many varieties of external SRAM devices. The application is what determine what
type of external SRAM to choose. It is both advantages and disadvantages to design
with SRAM memories.
3.1.1
Advantages
SRAM can store a larger amount of data than on-chip memories and is quite fast,
but not as fast as on-chip memories. The typical SRAMs have capacities ranging
from around 128 Kbytes to 10 Mbytes[3]. SRAMs are very low latency and high
throughput devices. They are slower than on-chip memories because they connect
to the FPGA over a shared bidirectional bus. The SRAM interface is very simple
and connecting a SRAM to an FPGA is a simple design task. SRAM buses can be
shared with other external SRAM devices, or even with external memories of other
types, such as flash or SDRAM.
CHAPTER 3. EXTERNAL SRAM AND SDRAM
3.1.2
Disadvantages
The main disadvantages of external SRAM in FPGA-based embedded system are
cost and the space it needs on the board. SRAM are more expensive per Mbyte
than other high-capacity memory types such as SDRAM[3]. They also consume
more board space per Mbyte than both SDRAM and FPGA on-chip memory[3].
The FPGA on-chip memory does not consume any space.
3.1.3
Best Applications
An external SRAM is effective to use as a fast buffer for medium-size blocks of
data[3]. An application is to use SRAM to buffer data that does not fit in
on-chip memory and requires lower latency than a SDRAM can provide. SRAM is
a excellent choice for accessing random data.
External SRAM can be used as
execution memory for a processor without cache. The low latency properties of
external SRAM improves the processor performance if the processor does not have
a cache to mask the higher latency of other memories[3].
3.1.4
Poor Applications
For systems which require large amounts of storage and systems which are
cost-effective, external SRAMs are not a good implementation choice. If the system
requires a block of memory that is larger than 10 Mbytes , you may chose a different
type of memory[3]. SDRAM can fit the block and is less expensive.
3.2. SDRAM
3.2
SDRAM
SDRAM is also a volatile memory. The different between SDRAM and SRAM
is that it is dynamic and must be refreshed periodically to maintain its content.
SDRAM uses dynamic memory cells that are much smaller than the static cell
the SRAM uses. The interface of SDRAM is very complex and require a special
controller hardware. The memory space in SDRAM is divided into banks,rows and
columns. SDRAM multiplexes the row and column over then same address lines,
this reduces the number of pins that a given size of SDRAM need[3].
The SDRAM controller manages all the access to the memory, this allows the
rest of the system to access the memory without any demand to know its internal
architecture. Many embedded system use SDRAM because of its high-capacity and
low-cost.
3.2.1
Advantages
The biggest advantage for SDRAM is their high capacity and low cost. No other of
RAM is near this combination. That makes it a very popular choice. SRAM also
uses less pins on FPGA because row and column addresses are multiplexed over the
same address pins [3]. The power consumption is often lower for SDRAM compared
to same capacity SRAM devices.
3.2.2
Disadvantage
The interface for SDRAM is complex and requires an SDRAM controller to manage
SDRAM refresh cycles,address multiplexing and interface timing [3]. The controller
consumes FPGA logic elements that could be used for other logic on the FGPA.
SDRAM has long access time, this force the controller to make preparations to
minimize the latencies. The latency for SDRAM is always higher than for SRAM
and the FPGA on-chip memory. After the initial access latency is overcome, the
throughput of the SDRAM is quit high[6].
CHAPTER 3. EXTERNAL SRAM AND SDRAM
3.2.3
Best Applications
The large capacity SDRAM can provide makes it very suitable for buffering large
data blocks. This is common used in network packets, video and audio buffers. It
could also be used to store large programs for microprocessor software, this improves
the performance for the software.
3.2.4
Poor Applications
If you need to access a block of data with low latency and the first-access latency is
to high for the application, you should consider low latency memories. The FGPA
logic elements are limited and if your application does not need the capacity from a
SDRAM it could be a smarter choice to use SRAM or the FPGA on-chip memory
that does not consume as many FPGA logic element as the SDRAM controller does.
Chapter 4
Adding external SRAM and SDRAM
4.1
External SRAM
First you need to add a Avolon-MM Tristate Bridge on the FPGA, it is required
to let you access the external SRAM memory chip. By adding the Avolon-MM
Tristate Bridge in the SOPC builder you can extract the code that describes the
tristate bridge in a generated .sopc-fille. The code that describes the components
that were added to the system is documented in the Appendix.
CHAPTER 4. ADDING EXTERNAL SRAM AND SDRAM
Figure 4.1. Example Design Block Diagram
To add the SRAM component you have to use the SOPC builder component
editor and define the interface. In the SOPC builder component editor you can
choose to use templates for a typical Avolon-MM Tristate Slave. You have to look
at the datasheet for your external SRAM memory chip, the datasheet provides you
with information about the chip such as signal it need to communicate and timing
to be able to talk with the tristate bridge. All the parameters can be changed and
4.2. ADDING SDRAM
added in the SOPC builder component editor. When you are done the component
is saved as a _hw.tcl-file that represents a component which can be added to the
SOPC builder system. The _hw.tcl-file for the SRAM memory chip on the altera
DE2-115 board is documented in the appendix. The generated code in the .sopc-file
that describes the relationship with the FPGA-chip and SRAM is also documented
in the appendix.
4.2
Adding SDRAM
The Altera DE2-115 board contains 2 SDRAM chips that can each store 64 Mbytes
of data. Each chip is organized as 8M x 16 bits x 4 banks [4]. The SDRAM chips
require careful timing control. To provide access to the SDRAM chips, the SOPC
Builder implements an SDRAM Controller circuit. This circuit generates the signals
needed to deal with the SDRAM chips.
The signals needed to communicate with a chip are shown in Figure 4.2. All of
the signals, except the clock, can be provided by the SDRAM Controller generated
by the SOPC builder. The clock signal is provided separately. It has to meet the
clock-skew requirements.
CHAPTER 4. ADDING EXTERNAL SRAM AND SDRAM
Figure 4.3. SDRAM contoller and SDRAM chip
The clock skew depends on physical characteristics of the DE2-115 board. For
proper operation of the SDRAM chip, it is necessary that its clock signal, SDRAM
Clock, leads the Nios II system clock, by 3 nanoseconds.[5] This can be accomplished
by using a phase-locked loop (PLL) circuit which can be manually created using
the MegaWizard plug-in from Altera and make a new ALTPLL.The PLL have one
in signal from the system clock and two output signals. One of the output signal
is the same as the system clock and is connected to the SDRAM controller, the
other output signal is phase with -3 ns and is connected to the SDRAM chip. Both
the SDRAM Contoller and the PLL curcit are added in the SOPC builder and the
code from the generated .sopc-file is extracted for each component and documented
in the Appendix. Because the NoC generator generates a .sopc file from an xml
document it is important to extract the code for each component, you should be
able to choose if you want to add SRAM, SDRAM or both in the NoC generator.
Chapter 5
Conclusion and future work
By adding support for SRAM and SDRAM it becomes easier for the software
devel-opers to work with the Multi-core platform. It opens up for using larger programs.
Adding memories to an FPGA system takes lot of time and hard studies in the
handbooks about the Altera platform. Adding this feature to the NoC generator
saves a lot of time for the software developers.
In the future, CPU nodes in the Multi-core platofrm should be able to share the
connected external memories with other CPU nodes on the platform by requesting
data from them using some kind of Message Passing (MP) protocol. Also, at the
moment only Altera platforms is supported but in the future Xilinx and Leon3
systems will be supported.
Bibliography
[1] Johnny Öberg, Francesco Robino,2011
A NoC System Generator for the
Sea-of-Cores Era,
[2] Quartus II Handbook Version 12.0
Volume 1: Design and Synthesis, june 2012,
[3] Altera,
Embedded Design Handbook ©February 2010 Altera Corporation,
[4] Altera,
Using the SDRAM on Alteras DE2-115 Board with Verilog Designs, July
2010
[5] Altera,
Using the SDRAM on Alteras DE2-115 Board with Verilog Designs, May
2012,
[6] Vinodh Cuppu, Bruce Jacob, Brian Davis, Trevor Mudge,1999
A Performance
Comparison of Contemporary DRAM Architectures
Appendix A
Source code
APPENDIX
A.
SOUR
CE
CODE
Bilaga A.1. Code for SDRAM and PLL
1−−−−−−−ELEMENTS−−−−−−−−−−−−−− 2 e l e m e n t s d r a m _ p l l . c 0 3 { 4 datum _clockDomain 5 { 6 v a l u e = " cl k _ 0 "; 7 t y p e = " S t r i n g "; 8 } 9 } 10 e l e m e n t s d r a m _ p l l . c 1 11 { 12 datum _clockDomain 13 { 14 v a l u e = " sdram_clk "; 15 t y p e = " S t r i n g "; 16 } 17 } 18 e l e m e n t s d r a m _ p l l . p l l _ s l a v e 19 { 20 datum _ l o c k e d A d d r e s s 21 { 22 v a l u e = " 0 "; 23 t y p e = " b o o l e a n "; 24 } 25 datum b a s e A d d r e s s 26 { 27 v a l u e = " 16 384 "; 28 t y p e = " l o n g "; 29 } 30 } 31 e l e m e n t sdram . s 1 32 { 33 datum _ l o c k e d A d d r e s s 34 { 35 v a l u e = " 1 "; 36 t y p e = " b o o l e a n "; 37 } 38 datum b a s e A d d r e s s 39 { 40 v a l u e = " 1 3 4 2 1 7 7 2 8 ";
18
41 t y p e = " l o n g "; 42 } 43 } 44 e l e m e n t sdram 45 { 46 datum _ s o r t I n d e x 47 { 48 v a l u e = " 16 "; 49 t y p e = " i n t "; 50 } 51 datum m e g a w i z a r d _ u i p r e f e r e n c e s 52 { 53 v a l u e = " { o u t p u t _ l a n g u a g e=VHDL, o u t p u t _ d i r e c t o r y=C : \ \ . . . } "; 54 t y p e = " S t r i n g "; 55 } 56 } 57 e l e m e n t s d r a m _ p l l 58 { 59 datum _ s o r t I n d e x 60 { 61 v a l u e = " 15 "; 62 t y p e = " i n t "; 63 } 64 } 65−−−−−−−MODULE−−−−−−−−−−−−−− 66
67 <module k i n d=" a l t e r a _ n i o s 2 " v e r s i o n=" 1 0 . 0 " e n a b l e d=" 1 " name=" cpu_0 ">
68 . . . .
APPENDIX
A.
SOUR
CE
CODE
80 <p a r a m e t e r name="WIDTH_PHASECOUNTERSELECT" v a l u e=" " /> 81 <p a r a m e t e r name="PRIMARY_CLOCK" v a l u e=" " /> 82 <p a r a m e t e r name="INCLK0_INPUT_FREQUENCY" v a l u e=" 20 00 0 " /> 83 <p a r a m e t e r name="INCLK1_INPUT_FREQUENCY" v a l u e=" " />84 <p a r a m e t e r name="OPERATION_MODE" v a l u e="NORMAL" />
85 <p a r a m e t e r name="PLL_TYPE" v a l u e="AUTO" />
86 <p a r a m e t e r name="QUALIFY_CONF_DONE" v a l u e=" " /> 87 <p a r a m e t e r name="COMPENSATE_CLOCK" v a l u e="CLK0" /> 88 <p a r a m e t e r name="SCAN_CHAIN" v a l u e=" " /> 89 <p a r a m e t e r name="GATE_LOCK_SIGNAL" v a l u e=" " /> 90 <p a r a m e t e r name="GATE_LOCK_COUNTER" v a l u e=" " /> 91 <p a r a m e t e r name="LOCK_HIGH" v a l u e=" " /> 92 <p a r a m e t e r name="LOCK_LOW" v a l u e=" " /> 93 <p a r a m e t e r name="VALID_LOCK_MULTIPLIER" v a l u e=" " /> 94 <p a r a m e t e r name="INVALID_LOCK_MULTIPLIER" v a l u e=" " /> 95 <p a r a m e t e r name="SWITCH_OVER_ON_LOSSCLK" v a l u e=" " /> 96 <p a r a m e t e r name="SWITCH_OVER_ON_GATED_LOCK" v a l u e=" " /> 97 <p a r a m e t e r name="ENABLE_SWITCH_OVER_COUNTER" v a l u e=" " /> 98 <p a r a m e t e r name="SKIP_VCO" v a l u e=" " /> 99 <p a r a m e t e r name="SWITCH_OVER_COUNTER" v a l u e=" " /> 100 <p a r a m e t e r name="SWITCH_OVER_TYPE" v a l u e=" " /> 101 <p a r a m e t e r name="FEEDBACK_SOURCE" v a l u e=" " /> 102 <p a r a m e t e r name="BANDWIDTH" v a l u e=" " />
103 <p a r a m e t e r name="BANDWIDTH_TYPE" v a l u e="AUTO" />
104 <p a r a m e t e r name="SPREAD_FREQUENCY" v a l u e=" " /> 105 <p a r a m e t e r name="DOWN_SPREAD" v a l u e=" " /> 106 <p a r a m e t e r name="SELF_RESET_ON_GATED_LOSS_LOCK" v a l u e=" " /> 107 <p a r a m e t e r name="SELF_RESET_ON_LOSS_LOCK" v a l u e=" " /> 108 <p a r a m e t e r name="CLK0_MULTIPLY_BY" v a l u e=" 1 " /> 109 <p a r a m e t e r name="CLK1_MULTIPLY_BY" v a l u e=" 1 " /> 110 <p a r a m e t e r name="CLK2_MULTIPLY_BY" v a l u e=" " /> 111 <p a r a m e t e r name="CLK3_MULTIPLY_BY" v a l u e=" " /> 112 <p a r a m e t e r name="CLK4_MULTIPLY_BY" v a l u e=" " /> 113 <p a r a m e t e r name="CLK5_MULTIPLY_BY" v a l u e=" " /> 114 <p a r a m e t e r name="CLK6_MULTIPLY_BY" v a l u e=" " /> 115 <p a r a m e t e r name="CLK7_MULTIPLY_BY" v a l u e=" " /> 116 <p a r a m e t e r name="CLK8_MULTIPLY_BY" v a l u e=" " /> 117 <p a r a m e t e r name="CLK9_MULTIPLY_BY" v a l u e=" " /> 118 <p a r a m e t e r name="EXTCLK0_MULTIPLY_BY" v a l u e=" " /> 119 <p a r a m e t e r name="EXTCLK1_MULTIPLY_BY" v a l u e=" " /> 120 <p a r a m e t e r name="EXTCLK2_MULTIPLY_BY" v a l u e=" " />
20
121 <p a r a m e t e r name="EXTCLK3_MULTIPLY_BY" v a l u e=" " /> 122 <p a r a m e t e r name="CLK0_DIVIDE_BY" v a l u e=" 1 " /> 123 <p a r a m e t e r name="CLK1_DIVIDE_BY" v a l u e=" 1 " /> 124 <p a r a m e t e r name="CLK2_DIVIDE_BY" v a l u e=" " /> 125 <p a r a m e t e r name="CLK3_DIVIDE_BY" v a l u e=" " /> 126 <p a r a m e t e r name="CLK4_DIVIDE_BY" v a l u e=" " /> 127 <p a r a m e t e r name="CLK5_DIVIDE_BY" v a l u e=" " /> 128 <p a r a m e t e r name="CLK6_DIVIDE_BY" v a l u e=" " /> 129 <p a r a m e t e r name="CLK7_DIVIDE_BY" v a l u e=" " /> 130 <p a r a m e t e r name="CLK8_DIVIDE_BY" v a l u e=" " /> 131 <p a r a m e t e r name="CLK9_DIVIDE_BY" v a l u e=" " /> 132 <p a r a m e t e r name="EXTCLK0_DIVIDE_BY" v a l u e=" " /> 133 <p a r a m e t e r name="EXTCLK1_DIVIDE_BY" v a l u e=" " /> 134 <p a r a m e t e r name="EXTCLK2_DIVIDE_BY" v a l u e=" " /> 135 <p a r a m e t e r name="EXTCLK3_DIVIDE_BY" v a l u e=" " /> 136 <p a r a m e t e r name="CLK0_PHASE_SHIFT" v a l u e=" 0 " /> 137 <p a r a m e t e r name="CLK1_PHASE_SHIFT" v a l u e=" −3000 " /> 138 <p a r a m e t e r name="CLK2_PHASE_SHIFT" v a l u e=" " /> 139 <p a r a m e t e r name="CLK3_PHASE_SHIFT" v a l u e=" " /> 140 <p a r a m e t e r name="CLK4_PHASE_SHIFT" v a l u e=" " /> 141 <p a r a m e t e r name="CLK5_PHASE_SHIFT" v a l u e=" " /> 142 <p a r a m e t e r name="CLK6_PHASE_SHIFT" v a l u e=" " /> 143 <p a r a m e t e r name="CLK7_PHASE_SHIFT" v a l u e=" " /> 144 <p a r a m e t e r name="CLK8_PHASE_SHIFT" v a l u e=" " /> 145 <p a r a m e t e r name="CLK9_PHASE_SHIFT" v a l u e=" " /> 146 <p a r a m e t e r name="EXTCLK0_PHASE_SHIFT" v a l u e=" " /> 147 <p a r a m e t e r name="EXTCLK1_PHASE_SHIFT" v a l u e=" " /> 148 <p a r a m e t e r name="EXTCLK2_PHASE_SHIFT" v a l u e=" " />
21
APPENDIX
A.
SOUR
CE
CODE
162 <p a r a m e t e r name="EXTCLK2_DUTY_CYCLE" v a l u e=" " /> 163 <p a r a m e t e r name="EXTCLK3_DUTY_CYCLE" v a l u e=" " />164 <p a r a m e t e r name=" PORT_clkena0 " v a l u e="PORT_UNUSED" />
165 <p a r a m e t e r name=" PORT_clkena1 " v a l u e="PORT_UNUSED" />
166 <p a r a m e t e r name=" PORT_clkena2 " v a l u e="PORT_UNUSED" />
167 <p a r a m e t e r name=" PORT_clkena3 " v a l u e="PORT_UNUSED" />
168 <p a r a m e t e r name=" PORT_clkena4 " v a l u e="PORT_UNUSED" />
169 <p a r a m e t e r name=" PORT_clkena5 " v a l u e="PORT_UNUSED" />
170 <p a r a m e t e r name=" PORT_extclkena0 " v a l u e=" " />
171 <p a r a m e t e r name=" PORT_extclkena1 " v a l u e=" " />
172 <p a r a m e t e r name=" PORT_extclkena2 " v a l u e=" " />
173 <p a r a m e t e r name=" PORT_extclkena3 " v a l u e=" " />
174 <p a r a m e t e r name=" PORT_extclk0 " v a l u e="PORT_UNUSED" />
175 <p a r a m e t e r name=" PORT_extclk1 " v a l u e="PORT_UNUSED" />
176 <p a r a m e t e r name=" PORT_extclk2 " v a l u e="PORT_UNUSED" />
177 <p a r a m e t e r name=" PORT_extclk3 " v a l u e="PORT_UNUSED" />
178 <p a r a m e t e r name="PORT_CLKBAD0" v a l u e="PORT_UNUSED" />
179 <p a r a m e t e r name="PORT_CLKBAD1" v a l u e="PORT_UNUSED" />
180 <p a r a m e t e r name=" PORT_clk0 " v a l u e="PORT_USED" />
181 <p a r a m e t e r name=" PORT_clk1 " v a l u e="PORT_USED" />
182 <p a r a m e t e r name=" PORT_clk2 " v a l u e="PORT_UNUSED" />
183 <p a r a m e t e r name=" PORT_clk3 " v a l u e="PORT_UNUSED" />
184 <p a r a m e t e r name=" PORT_clk4 " v a l u e="PORT_UNUSED" />
185 <p a r a m e t e r name=" PORT_clk5 " v a l u e="PORT_UNUSED" />
186 <p a r a m e t e r name=" PORT_clk6 " v a l u e=" " />
187 <p a r a m e t e r name=" PORT_clk7 " v a l u e=" " />
188 <p a r a m e t e r name=" PORT_clk8 " v a l u e=" " />
189 <p a r a m e t e r name=" PORT_clk9 " v a l u e=" " />
190 <p a r a m e t e r name="PORT_SCANDATA" v a l u e="PORT_UNUSED" />
191 <p a r a m e t e r name="PORT_SCANDATAOUT" v a l u e="PORT_UNUSED" />
192 <p a r a m e t e r name="PORT_SCANDONE" v a l u e="PORT_UNUSED" />
193 <p a r a m e t e r name="PORT_SCLKOUT1" v a l u e=" " />
194 <p a r a m e t e r name="PORT_SCLKOUT0" v a l u e=" " />
195 <p a r a m e t e r name="PORT_ACTIVECLOCK" v a l u e="PORT_UNUSED" />
196 <p a r a m e t e r name="PORT_CLKLOSS" v a l u e="PORT_UNUSED" />
197 <p a r a m e t e r name="PORT_INCLK1" v a l u e="PORT_UNUSED" />
198 <p a r a m e t e r name="PORT_INCLK0" v a l u e="PORT_USED" />
199 <p a r a m e t e r name="PORT_FBIN" v a l u e="PORT_UNUSED" />
200 <p a r a m e t e r name="PORT_PLLENA" v a l u e="PORT_UNUSED" />
201 <p a r a m e t e r name="PORT_CLKSWITCH" v a l u e="PORT_UNUSED" />
202 <p a r a m e t e r name="PORT_ARESET" v a l u e="PORT_UNUSED" />
203 <p a r a m e t e r name="PORT_PFDENA" v a l u e="PORT_UNUSED" />
204 <p a r a m e t e r name="PORT_SCANCLK" v a l u e="PORT_UNUSED" />
205 <p a r a m e t e r name="PORT_SCANACLR" v a l u e="PORT_UNUSED" />
206 <p a r a m e t e r name="PORT_SCANREAD" v a l u e="PORT_UNUSED" />
207 <p a r a m e t e r name="PORT_SCANWRITE" v a l u e="PORT_UNUSED" />
208 <p a r a m e t e r name="PORT_ENABLE0" v a l u e=" " />
209 <p a r a m e t e r name="PORT_ENABLE1" v a l u e=" " />
210 <p a r a m e t e r name="PORT_LOCKED" v a l u e="PORT_UNUSED" />
211 <p a r a m e t e r name="PORT_CONFIGUPDATE" v a l u e="PORT_UNUSED" />
212 <p a r a m e t e r name="PORT_FBOUT" v a l u e=" " />
213 <p a r a m e t e r name="PORT_PHASEDONE" v a l u e="PORT_UNUSED" />
214 <p a r a m e t e r name="PORT_PHASESTEP" v a l u e="PORT_UNUSED" />
215 <p a r a m e t e r name="PORT_PHASEUPDOWN" v a l u e="PORT_UNUSED" />
216 <p a r a m e t e r name="PORT_SCANCLKENA" v a l u e="PORT_UNUSED" />
217 <p a r a m e t e r name="PORT_PHASECOUNTERSELECT" v a l u e="PORT_UNUSED" />
218 <p a r a m e t e r name="PORT_VCOOVERRANGE" v a l u e=" " /> 219 <p a r a m e t e r name="PORT_VCOUNDERRANGE" v a l u e=" " /> 220 <p a r a m e t e r name="DPA_MULTIPLY_BY" v a l u e=" " /> 221 <p a r a m e t e r name="DPA_DIVIDE_BY" v a l u e=" " /> 222 <p a r a m e t e r name="DPA_DIVIDER" v a l u e=" " /> 223 <p a r a m e t e r name="VCO_MULTIPLY_BY" v a l u e=" " /> 224 <p a r a m e t e r name="VCO_DIVIDE_BY" v a l u e=" " /> 225 <p a r a m e t e r name="SCLKOUT0_PHASE_SHIFT" v a l u e=" " /> 226 <p a r a m e t e r name="SCLKOUT1_PHASE_SHIFT" v a l u e=" " /> 227 <p a r a m e t e r name="VCO_FREQUENCY_CONTROL" v a l u e=" " /> 228 <p a r a m e t e r name="VCO_PHASE_SHIFT_STEP" v a l u e=" " /> 229 <p a r a m e t e r name="USING_FBMIMICBIDIR_PORT" v a l u e=" " /> 230 <p a r a m e t e r name="SCAN_CHAIN_MIF_FILE" v a l u e=" " />
23
APPENDIX
A.
SOUR
CE
CODE
PORT_UNUSED CT#PORT_PHASEUPDOWN PORT_UNUSED CT#PORT_extclk3 PORT_UNUSED CT#PORT_extclk2 PORT_UNUSED CT# PORT_extclk1 PORT_UNUSED CT#PORT_PHASECOUNTERSELECT PORT_UNUSED CT#PORT_extclk0 PORT_UNUSED CT#
PORT_ACTIVECLOCK PORT_UNUSED CT#CLK0_DUTY_CYCLE 50 CT#CLK0_DIVIDE_BY 1 CT#CLK1_DIVIDE_BY 1 CT#PORT_LOCKED PORT_UNUSED</p a r a m e t e r >
233 <p a r a m e t e r name="HIDDEN_PRIVATES">PT#GLOCKED_FEATURE_ENABLED 0 PT#SPREAD_FEATURE_ENABLED 0 PT#BANDWIDTH_FREQ_UNIT MHz PT#CUR_DEDICATED_CLK c 0 PT#INCLK0_FREQ_EDIT 5 0 . 0 0 0 PT#BANDWIDTH_PRESET Low PT#PLL_LVDS_PLL_CHECK 0 PT# BANDWIDTH_USE_PRESET 0 PT#AVALON_USE_SEPARATE_SYSCLK NO PT#PLL_ENHPLL_CHECK 0 PT#OUTPUT_FREQ_UNIT1 MHz PT# OUTPUT_FREQ_UNIT0 MHz PT#PHASE_RECONFIG_FEATURE_ENABLED 1 PT#CREATE_CLKBAD_CHECK 0 PT#CLKSWITCH_CHECK 0 PT# INCLK1_FREQ_EDIT 1 0 0 . 0 0 0 PT#NORMAL_MODE_RADIO 1 PT#SRC_SYNCH_COMP_RADIO 0 PT#PLL_ARESET_CHECK 0 PT#
LONG_SCAN_RADIO 1 PT#SCAN_FEATURE_ENABLED 1 PT#PHASE_RECONFIG_INPUTS_CHECK 0 PT#USE_CLK1 1 PT#USE_CLK0 1 PT# PRIMARY_CLK_COMBO i n c l k 0 PT#BANDWIDTH 1 . 0 0 0 PT#GLOCKED_COUNTER_EDIT_CHANGED 1 PT#PLL_FASTPLL_CHECK 0 PT# SPREAD_FREQ_UNIT KHz PT#PLL_AUTOPLL_CHECK 1 PT#LVDS_PHASE_SHIFT_UNIT1 deg PT#LVDS_PHASE_SHIFT_UNIT0 deg PT# OUTPUT_FREQ_MODE1 0 PT#SWITCHOVER_FEATURE_ENABLED 0 PT#MIG_DEVICE_SPEED_GRADE Any PT#OUTPUT_FREQ_MODE0 0 PT# BANDWIDTH_FEATURE_ENABLED 1 PT#INCLK0_FREQ_UNIT_COMBO MHz PT#ZERO_DELAY_RADIO 0 PT#OUTPUT_FREQ1 1 0 0 . 0 0 0 0 0 0 0 0 PT#OUTPUT_FREQ0 1 0 0 . 0 0 0 0 0 0 0 0 PT#SHORT_SCAN_RADIO 0 PT#LVDS_MODE_DATA_RATE_DIRTY 0 PT#CUR_FBIN_CLK c 0 PT# PLL_ADVANCED_PARAM_CHECK 0 PT#CLKBAD_SWITCHOVER_CHECK 0 PT#PHASE_SHIFT_STEP_ENABLED_CHECK 0 PT#
DEVICE_SPEED_GRADE Any PT#PLL_FBMIMIC_CHECK 0 PT#LVDS_MODE_DATA_RATE { Not A v a i l a b l e } PT#LOCKED_OUTPUT_CHECK 0 PT#SPREAD_PERCENT 0 . 5 0 0 PT#PHASE_SHIFT1 −3.00000000 PT#PHASE_SHIFT0 0 . 0 0 0 0 0 0 0 0 PT#DIV_FACTOR1 1 PT#DIV_FACTOR0
1 PT#CNX_NO_COMPENSATE_RADIO 0 PT#USE_CLKENA1 0 PT#USE_CLKENA0 0 PT#CREATE_INCLK1_CHECK 0 PT# GLOCK_COUNTER_EDIT 1 0 4 8 5 7 5 PT#INCLK1_FREQ_UNIT_COMBO MHz PT#EFF_OUTPUT_FREQ_VALUE1 5 0 . 0 0 0 0 0 0 PT#
EFF_OUTPUT_FREQ_VALUE0 5 0 . 0 0 0 0 0 0 PT#SPREAD_FREQ 5 0 . 0 0 0 PT#USE_MIL_SPEED_GRADE 0 PT#EXPLICIT_SWITCHOVER_COUNTER 0 PT#STICKY_CLK1 1 PT#STICKY_CLK0 1 PT#EXT_FEEDBACK_RADIO 0 PT#MIRROR_CLK1 0 PT#MIRROR_CLK0 0 PT#
SWITCHOVER_COUNT_EDIT 1 PT#SELF_RESET_LOCK_LOSS 0 PT#PLL_PFDENA_CHECK 0 PT#INT_FEEDBACK__MODE_RADIO 1 PT# INCLK1_FREQ_EDIT_CHANGED 1 PT#CLKLOSS_CHECK 0 PT#SYNTH_WRAPPER_GEN_POSTFIX 0 PT#PHASE_SHIFT_UNIT1 ns PT# PHASE_SHIFT_UNIT0 deg PT#BANDWIDTH_USE_AUTO 1 PT#HAS_MANUAL_SWITCHOVER 1 PT#MULT_FACTOR1 1 PT#MULT_FACTOR0 1 PT#SPREAD_USE 0 PT#GLOCKED_MODE_CHECK 0 PT#SACN_INPUTS_CHECK 0 PT#DUTY_CYCLE1 5 0 . 0 0 0 0 0 0 0 0 PT#
INTENDED_DEVICE_FAMILY { C y c l o n e IV E} PT#DUTY_CYCLE0 5 0 . 0 0 0 0 0 0 0 0 PT#PLL_TARGET_HARCOPY_CHECK 0 PT# INCLK1_FREQ_UNIT_CHANGED 1 PT#RECONFIG_FILE ALTPLL1335359197336492 . m i f PT#ACTIVECLK_CHECK 0</ p a r a m e t e r >
234 <p a r a m e t e r name="HIDDEN_USED_PORTS">UP#c 1 u s e d UP#c 0 u s e d UP#i n c l k 0 used </p a r a m e t e r >
235 <p a r a m e t e r name="HIDDEN_IS_NUMERIC">IN#WIDTH_CLOCK 1 IN#CLK0_DUTY_CYCLE 1 IN#PLL_TARGET_HARCOPY_CHECK 1 IN# CLK1_MULTIPLY_BY 1 IN#SWITCHOVER_COUNT_EDIT 1 IN#INCLK0_INPUT_FREQUENCY 1 IN#PLL_LVDS_PLL_CHECK 1 IN# PLL_AUTOPLL_CHECK 1 IN#PLL_FASTPLL_CHECK 1 IN#CLK1_DUTY_CYCLE 1 IN#PLL_ENHPLL_CHECK 1 IN#DIV_FACTOR1 1 IN# DIV_FACTOR0 1 IN#LVDS_MODE_DATA_RATE_DIRTY 1 IN#GLOCK_COUNTER_EDIT 1 IN#CLK0_DIVIDE_BY 1 IN#MULT_FACTOR1 1 IN# MULT_FACTOR0 1 IN#CLK0_MULTIPLY_BY 1 IN#USE_MIL_SPEED_GRADE 1 IN#CLK1_DIVIDE_BY 1</ p a r a m e t e r >
236 <p a r a m e t e r name="HIDDEN_MF_PORTS" v a l u e="MF#c l k 1 MF#i n c l k 1 " />
237 <p a r a m e t e r name="HIDDEN_IF_PORTS">IF#l o c k e d { o u t p u t 0} IF#r e s e t { i n p u t 0} IF#c l k { i n p u t 0} IF#r e a d d a t a { o u t p u t 32} IF#w r i t e { i n p u t 0} IF#p h a s e d o n e { o u t p u t 0} IF#a d d r e s s { i n p u t 2} IF#c 1 { o u t p u t 0} IF#c 0 { o u t p u t 0} IF#
w r i t e d a t a { i n p u t 32} IF#r e a d { i n p u t 0}</ p a r a m e t e r >
238 <p a r a m e t e r name="HIDDEN_IS_FIRST_EDIT" v a l u e=" 0 " />
239 <p a r a m e t e r name="AUTO_INCLK_INTERFACE_CLOCK_RATE" v a l u e=" 5 0 0 0 0 0 0 0 " />
240 <p a r a m e t e r name="AUTO_DEVICE_FAMILY" v a l u e=" C y c l o n e IV E" />
241 </module> 242 243 <module 244 k i n d=" a l t e r a _ a v a l o n _ n e w _ s d r a m _ c o n t r o l l e r " 245 v e r s i o n=" 1 0 . 0 " 246 e n a b l e d=" 1 " 247 name=" sdram "> 248 <p a r a m e t e r name="TAC" v a l u e=" 5 . 5 " /> 249 <p a r a m e t e r name="TMRD" v a l u e=" 3 " /> 250 <p a r a m e t e r name="TRCD" v a l u e=" 2 0 . 0 " /> 251 <p a r a m e t e r name="TRFC" v a l u e=" 7 0 . 0 " /> 252 <p a r a m e t e r name="TRP" v a l u e=" 2 0 . 0 " /> 253 <p a r a m e t e r name="TWR" v a l u e=" 1 4 . 0 " /> 254 <p a r a m e t e r name=" c a s L a t e n c y " v a l u e=" 3 " /> 255 <p a r a m e t e r name=" c l o c k R a t e " v a l u e=" 5 0 0 0 0 0 0 0 " /> 256 <p a r a m e t e r name=" columnWidth " v a l u e=" 10 " /> 257 <p a r a m e t e r name=" dataWidth " v a l u e=" 32 " /> 258 <p a r a m e t e r name=" g e n e r a t e S i m u l a t i o n M o d e l " v a l u e=" t r u e " /> 259 <p a r a m e t e r name=" initNOPDelay " v a l u e=" 0 . 0 " /> 260 <p a r a m e t e r name=" i n i t R e f r e s h C o m m a n d s " v a l u e=" 2 " /> 261 <p a r a m e t e r name=" m a s t e r e d T r i s t a t e B r i d g e S l a v e " v a l u e=" " />
262 <p a r a m e t e r name=" model " v a l u e=" custom " />
263 <p a r a m e t e r name=" numberOfBanks " v a l u e=" 4 " /> 264 <p a r a m e t e r name=" n u m b e r O f C h i p S e l e c t s " v a l u e=" 1 " /> 265 <p a r a m e t e r name=" p i n s S h a r e d V i a T r i S t a t e " v a l u e=" f a l s e " /> 266 <p a r a m e t e r name=" powerUpDelay " v a l u e=" 2 0 0 . 0 " /> 267 <p a r a m e t e r name=" r e f r e s h P e r i o d " v a l u e=" 7 . 8 1 2 5 " /> 268 <p a r a m e t e r name=" r e g i s t e r D a t a I n " v a l u e=" t r u e " />
25
APPENDIX
A.
SOUR
CE
CODE
282 k i n d=" a v a l o n " 283 v e r s i o n=" 6 . 1 " 284 s t a r t=" cpu_0 . i n s t r u c t i o n _ m a s t e r " 285 end=" sdram . s 1 "> 286 <p a r a m e t e r name=" a r b i t r a t i o n P r i o r i t y " v a l u e=" 1 " /> 287 <p a r a m e t e r name=" b a s e A d d r e s s " v a l u e=" 0 x 0 8 0 0 0 0 0 0 " /> 288 </ c o n n e c t i o n >289 <c o n n e c t i o n k i n d=" a v a l o n " v e r s i o n=" 6 . 1 " s t a r t=" cpu_0 . data_master " end=" sdram . s 1 ">
290 <p a r a m e t e r name=" a r b i t r a t i o n P r i o r i t y " v a l u e=" 1 " /> 291 <p a r a m e t e r name=" b a s e A d d r e s s " v a l u e=" 0 x 0 8 0 0 0 0 0 0 " /> 292 </ c o n n e c t i o n > 293 <c o n n e c t i o n 294 k i n d=" c l o c k " 295 v e r s i o n=" 1 0 . 0 " 296 s t a r t=" s y s _ c l k . c l k " 297 end=" s d r a m _ p l l . i n c l k _ i n t e r f a c e " /> 298 <c o n n e c t i o n k i n d=" c l o c k " v e r s i o n=" 1 0 . 0 " s t a r t=" s y s _ c l k . c l k " end=" sdram . c l k " />
26
Bilaga A.2. Code for SRAM and Tristate Bridge
1−−−−−−−ELEMENTS−−−−−−−−−−−−−− 2 e l e m e n t sram_1024Kx16bit . a v a l o n _ t r i s t a t e _ s l a v e 3 { 4 datum b a s e A d d r e s s 5 { 6 v a l u e = " 4 1 9 4 3 0 4 "; 7 t y p e = " l o n g "; 8 } 9 } 10 e l e m e n t sram_1024Kx16bit 11 { 12 datum _ s o r t I n d e x 13 { 14 v a l u e = " 17 "; 15 t y p e = " i n t "; 16 } 17 } 18 e l e m e n t t r i _ s t a t e _ b r i d g e _ 0 19 { 20 datum _ s o r t I n d e x 21 { 22 v a l u e = " 18 "; 23 t y p e = " i n t "; 24 } 25 datum m e g a w i z a r d _ u i p r e f e r e n c e s 26 {27
APPENDIX
A.
SOUR
CE
CODE
39 <module 40 k i n d=" sram_1024Kx16bit " 41 v e r s i o n=" 1 . 0 " 42 e n a b l e d=" 1 " 43 name=" sram_1024Kx16bit "> 44 <p a r a m e t e r name=" s h a r e d P o r t s " v a l u e=" " /> 45 </module> 46 <module 47 k i n d=" a l t e r a _ a v a l o n _ t r i _ s t a t e _ b r i d g e " 48 v e r s i o n=" 1 0 . 0 " 49 e n a b l e d=" 1 " 50 name=" t r i _ s t a t e _ b r i d g e _ 0 "> 51 <p a r a m e t e r name=" r e g i s t e r I n c o m i n g S i g n a l s " v a l u e=" t r u e " /> 52 </module> 53 54−−−−CONNECTION−−−−−−−−−−−−−−−− 55 <c o n n e c t i o n 56 k i n d=" a v a l o n " 57 v e r s i o n=" 6 . 1 " 58 s t a r t=" cpu_1 . i n s t r u c t i o n _ m a s t e r " 59 end=" t r i _ s t a t e _ b r i d g e _ 0 . a v a l o n _ s l a v e "> 60 <p a r a m e t e r name=" a r b i t r a t i o n P r i o r i t y " v a l u e=" 1 " /> 61 <p a r a m e t e r name=" b a s e A d d r e s s " v a l u e=" 0 x0000 " /> 62 </ c o n n e c t i o n > 63 64 65 <c o n n e c t i o n 66 k i n d=" a v a l o n " 67 v e r s i o n=" 6 . 1 " 68 s t a r t=" cpu_1 . data_master " 69 end=" t r i _ s t a t e _ b r i d g e _ 0 . a v a l o n _ s l a v e "> 70 <p a r a m e t e r name=" a r b i t r a t i o n P r i o r i t y " v a l u e=" 1 " /> 71 <p a r a m e t e r name=" b a s e A d d r e s s " v a l u e=" 0 x0000 " /> 72 </ c o n n e c t i o n > 73 74 <c o n n e c t i o n 75 k i n d=" a v a l o n _ t r i s t a t e " 76 v e r s i o n=" 1 0 . 0 " 77 s t a r t=" t r i _ s t a t e _ b r i d g e _ 0 . t r i s t a t e _ m a s t e r " 78 end=" sram_1024Kx16bit . a v a l o n _ t r i s t a t e _ s l a v e "> 79 <p a r a m e t e r name=" a r b i t r a t i o n P r i o r i t y " v a l u e=" 1 " />28
80 <p a r a m e t e r name=" b a s e A d d r e s s " v a l u e=" 0 x 0 0 4 0 0 0 0 0 " /> 81 </ c o n n e c t i o n > 82 83 <c o n n e c t i o n 84 k i n d=" c l o c k " 85 v e r s i o n=" 1 0 . 0 " 86 s t a r t=" s y s _ c l k . c l k " 87 end=" t r i _ s t a t e _ b r i d g e _ 0 . c l k " />
Bilaga A.3. Tcl code for SRAM
1 #TCL F i l e G e n e r a t e d by Component E d i t o r 1 0 . 0
2 #Wed Apr 25 1 5 : 1 5 : 4 4 CEST 2012
3 #DO NOT MODIFY 4 5 6 #+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 7 # | 8 # | sram_1024Kx16bit " sram_1024Kx16bit " v1 . 0 9 # | n u l l 2 0 1 2 . 0 4 . 2 5 . 1 5 : 1 5 : 4 4 10 # | 11 # | 12 #+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 13 14 #+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 15 # | r e q u e s t TCL p a c k a g e from ACDS 1 0 . 0 16 # |
29
APPENDIX
A.
SOUR
CE
CODE
31 s e t _ m o d u l e _ p r o p e r t y ANALYZE_HDL TRUE 32 # | 33 #+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 34 35 #+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 36 # | f i l e s 37 # | 38 # | 39 #+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 40 41 #+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 42 # | p a r a m e t e r s 43 # | 44 # | 45 #+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 46 47 #+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 48 # | d i s p l a y i t e m s 49 # | 50 # | 51 #+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 52 53 #+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 54 # | c o n n e c t i o n p o i n t a v a l o n _ t r i s t a t e _ s l a v e 55 # | 56 a d d _ i n t e r f a c e a v a l o n _ t r i s t a t e _ s l a v e a v a l o n _ t r i s t a t e end57 s e t _ i n t e r f a c e _ p r o p e r t y a v a l o n _ t r i s t a t e _ s l a v e a ctiveCSTh roughReadL atency f a l s e
58 s e t _ i n t e r f a c e _ p r o p e r t y a v a l o n _ t r i s t a t e _ s l a v e e x p l i c i t A d d r e s s S p a n 0 59 s e t _ i n t e r f a c e _ p r o p e r t y a v a l o n _ t r i s t a t e _ s l a v e holdTime 5 60 s e t _ i n t e r f a c e _ p r o p e r t y a v a l o n _ t r i s t a t e _ s l a v e isMemoryDevice t r u e 61 s e t _ i n t e r f a c e _ p r o p e r t y a v a l o n _ t r i s t a t e _ s l a v e i s N o n V o l a t i l e S t o r a g e f a l s e 62 s e t _ i n t e r f a c e _ p r o p e r t y a v a l o n _ t r i s t a t e _ s l a v e maximumPendingReadTransactions 0 63 s e t _ i n t e r f a c e _ p r o p e r t y a v a l o n _ t r i s t a t e _ s l a v e p r i n t a b l e D e v i c e f a l s e 64 s e t _ i n t e r f a c e _ p r o p e r t y a v a l o n _ t r i s t a t e _ s l a v e r e a d L a t e n c y 0 65 s e t _ i n t e r f a c e _ p r o p e r t y a v a l o n _ t r i s t a t e _ s l a v e r e a d W a i t S t a t e s 15 66 s e t _ i n t e r f a c e _ p r o p e r t y a v a l o n _ t r i s t a t e _ s l a v e readWaitTime 15 67 s e t _ i n t e r f a c e _ p r o p e r t y a v a l o n _ t r i s t a t e _ s l a v e setupTime 5 68 s e t _ i n t e r f a c e _ p r o p e r t y a v a l o n _ t r i s t a t e _ s l a v e t i m i n g U n i t s N a n o s e c o n d s 69 s e t _ i n t e r f a c e _ p r o p e r t y a v a l o n _ t r i s t a t e _ s l a v e w r i t e W a i t S t a t e s 10 70 s e t _ i n t e r f a c e _ p r o p e r t y a v a l o n _ t r i s t a t e _ s l a v e writeWaitTime 10 71
30
72 s e t _ i n t e r f a c e _ p r o p e r t y a v a l o n _ t r i s t a t e _ s l a v e ASSOCIATED_CLOCK " " 73 s e t _ i n t e r f a c e _ p r o p e r t y a v a l o n _ t r i s t a t e _ s l a v e ENABLED t r u e 74 75 a d d _ i n t e r f a c e _ p o r t a v a l o n _ t r i s t a t e _ s l a v e d a t a d a t a B i d i r 16 76 a d d _ i n t e r f a c e _ p o r t a v a l o n _ t r i s t a t e _ s l a v e cs_n c h i p s e l e c t _ n I n p u t 1 77 a d d _ i n t e r f a c e _ p o r t a v a l o n _ t r i s t a t e _ s l a v e a d d r e s s a d d r e s s I n p u t 20 78 a d d _ i n t e r f a c e _ p o r t a v a l o n _ t r i s t a t e _ s l a v e oe_n o u t p u t e n a b l e _ n I n p u t 1 79 a d d _ i n t e r f a c e _ p o r t a v a l o n _ t r i s t a t e _ s l a v e we_n w r i t e _ n I n p u t 1 80 a d d _ i n t e r f a c e _ p o r t a v a l o n _ t r i s t a t e _ s l a v e be_n b y t e e n a b l e _ n I n p u t 2 81 # | 82 #+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−