S3esk_startup_rev2 S3esk Startup Rev2

User Manual: s3esk_startup_rev2

Open the PDF directly: View PDF PDF.
Page Count: 13

DownloadS3esk_startup_rev2 S3esk Startup Rev2
Open PDF In BrowserView PDF
Initial Design
for

Spartan-3E Starter Kit
(LCD Display Control)
Ken Chapman
Xilinx Ltd
16th February 2006
Rev.2

Limitations
Limited Warranty and Disclaimer. These designs are provided to you “as is”. Xilinx and its licensors make and you receive no
warranties or conditions, express, implied, statutory or otherwise, and Xilinx specifically disclaims any implied warranties of
merchantability, non-infringement, or fitness for a particular purpose. Xilinx does not warrant that the functions contained in these
designs will meet your requirements, or that the operation of these designs will be uninterrupted or error free, or that defects in
the Designs will be corrected. Furthermore, Xilinx does not warrant or make any representations regarding use or the results of
the use of the designs in terms of correctness, accuracy, reliability, or otherwise.
Limitation of Liability. In no event will Xilinx or its licensors be liable for any loss of data, lost profits, cost or procurement of
substitute goods or services, or for any special, incidental, consequential, or indirect damages arising from the use or operation
of the designs or accompanying documentation, however caused and on any theory of liability. This limitation will apply even if
Xilinx has been advised of the possibility of such damage. This limitation shall apply not-withstanding the failure of the essential
purpose of any limited remedies herein.
This design module is not supported by general Xilinx Technical support as an official Xilinx Product.
Please refer any issues initially to the provider of the module.
Any problems or items felt of value in the continued improvement of KCPSM3 or this reference design would be gratefully
received by the author.
Ken Chapman
Senior Staff Engineer – Spartan Applications Specialist
email: chapman@xilinx.com
The author would also be pleased to hear from anyone using KCPSM3 or the UART macros with information about your
application and how these macros have been useful.

PicoBlaze Spartan-3E Starter Kit Initial Design 2

Design Overview
This design is provided on the Spartan-3E Starter Kit when it is dispatched from the factory. It confirms that the board is operational by scrolling a simple
message across the LCD display and allowing the LED’s to be controlled by the rotary knob, press buttons and slide switches.
The principle purpose of this document is to illustrate how PicoBlaze can be used to control the LCD display. It is hoped that the design may form the basis
for future PicoBlaze designs as well as provide a general introduction to the board. Some exercises are suggested to encourage further self study.

Try it now – it only takes 30 seconds!
It is recommended that you try this to become familiar with what the design does
before continuing to read. If your board is ‘fresh out of the box’, then simply connect
the power supply, switch on and see the design come to life. If it doesn’t work (XCDONE LED remains unlit), check that all 3 jumpers are installed in J30 and press the
PROG button again.
If your board has be reprogrammed since it arrived, you can still try the design quickly.
As well as the source design files, a compiled configuration bit file is provided which
you can immediately download into the Spartan XC3S500E device on your board. To
make this task really easy the first time, unzip all the files provided into a directory and
then….
double click on ‘install_s3esk_startup.bat’.
Assuming you have the Xilinx software installed, your board connected with the USB
cable and the board powered (don’t forget the switch), then this should open a DOS
window and run iMPACT in batch mode to configure the Spartan-3E with the design.

Rotate knob to control position
of the illuminated LED

West
North
South
East
SW3
SW2
SW1
SW0

Press and release knob to
toggle between control modes

PicoBlaze Spartan-3E Starter Kit Initial Design 3

Operate buttons and switches
to illuminated each LED

4 press
buttons

Scrolling message
8 LEDs

4 slide
switches

PicoBlaze Design Size
The images and statistics on this page show that the design occupies just 113 slices and 1 BRAM. This is only 2.5% of the slices and 5% of the BRAMs
available in an XC3S500E device and would still be less than 12% of the slices in the smallest XC3S100E device.
MAP report
Number of occupied Slices:
Number of Block RAMs:

113 out of
1 out of

Total equivalent gate count for design:

FPGA Editor view
XC3S500E

PicoBlaze Spartan-3E Starter Kit Initial Design 4

4,656
20
75,945

2%
5%

PicoBlaze makes extensive use of the distributed memory features of the
Spartan-3E device leading to very high design efficiency. If this design
was replicated to fill the XC3S500E device, it would represent the
equivalent of over 1.5 million gates. Not bad for a device even marketing
claims to be 500 thousand gates
Floorplanner view

Design Files
The source files provided for the reference design are…..

s3esk_startup.vhd

Top level file and main description of hardware.
Contains I/O required to disable other StrataFLASH memory device on the board which may
otherwise interfere with the LCD display.

s3esk_startup.ucf

I/O constraints file for Spartan-3E Starter Kit
and timing specifications for 50MHz clock.

kcpsm3.vhd

PicoBlaze processor for Spartan-3E devices.

control.vhd

Assembled program for PicoBlaze (stored in a Block memory)
control.psm

s3esk_startup_rev2.mcs

PicoBlaze program source assembler code

PROM programming file for this design for use with any of the FLASH storage devices

Note: The file shown in green is not included with the reference design as it is provided with PicoBlaze download. Please visit the PicoBlaze Web site
for your free copy of PicoBlaze, assembler, JTAG_loader and documentation.

www.xilinx.com/picoblaze

Hint - If you only want to write new programs for PicoBlaze using the existing hardware design, then simply use the JTAG_Loader utility supplied with
PicoBlaze. The design supplied is already equipped with the JTAG loading circuit (see schematic on next page).

PicoBlaze Spartan-3E Starter Kit Initial Design 5

PicoBlaze Circuit Diagram
Vcc

* StrataFLASH memory must be
disabled to prevent interference
with the LCD display.

strataflash_oe
strataflash_ce
strataflash_we

‘JTAG_loader’ allows rapid
PicoBlaze code development.
program_rom

*
*
*

led(7)

control
proc_reset

led(6)

JTAG

led(5)

lcd(6)
lcd(5)
lcd(4)

kcpsm3

input_ports

rotary_press_in

Pull-down resistors added
to switch and press
button inputs in UCF file.

output_ports

led(2)

7

led(0)

address
out_port

btn_west

1

btn_north

0

port_id

btn_east
interrupt

switch(2)
switch(1)

clk

interrupt

read_strobe
port_id

reset

switch(3)

bidirectional
LCD data

write_strobe
read_strobe

btn_south

interrupt_ack

lcd(7)
lcd(6)
lcd(5)
lcd(4)

clk

switch(0)

lcd_rs
lcd_rw

interrupt_control

rotary_filter & direction

See reference
design called
‘Rotary Encoder
Interface for
Spartan-3E Starter
Kit’ for details of
this section.

led(3)
led(1)

out_port
in_port

rotary_b

processor

instruction

in_port

rotary_a

led(4)

address

write_strobe

rotary_press

clk

instruction

lcd(7)

address

kcpsm3_reset

instruction

6
rotary_left
interrupt_ack

rotary_event

PicoBlaze Spartan-3E Starter Kit Initial Design 6

50MHz

clk

Synchronous design

lcd_e

LCD Display Connections
The board is set up to use the 4-wire data interface to the LCD character module. The data connections are shared with the StrataFLASH memory which
must be disabled to prevent interference. This diagram shows the pin connections to the Spartan-3E device.
The LCD display is powered by a +5v supply. This
means that if the display is read it will potentially
drive the data signal lines above the maximum level
(VCCO+0.5v) allowed for the Spartan-3E and
StrataFLASH pins which are both powered by 3.3v.
Therefore the display data pins have been
connected via 390Ω series resistors to limit the
current and voltage during read operations.

+5v

lcd_rs
lcd_rw
lcd_e

L18

LCD_RS

L17

LCD_RW

M18

LCD_E

D7

RS
RW
E

LCD
Display

D6
D5
D4

390Ω
390Ω
390Ω
390Ω

M15

lcd(7)

P17

lcd(6)

R16

lcd(5)

R15

lcd(4)

Hint – This design provides all the mechanisms to enable
the display to be read but does not actually need to use it.
Most applications only require write operations.
+3.3v

strataflash_oe

C18

SF-OE

OE#

D11

SF-D11

strataflash_we

D17

SF-WE

WE#

D10

SF-D10

strataflash_ce

D16

SF-CE0

CE0

D9

SF-D9

D8

SF-D8

IC22
StrataFLASH

Holding all three controls High ensures that the StrataFLASH
memory does not interfere with the LCD display and also prevents
inadvertent modifications to the memory contents.

GND +5v

RS

RW

E D4 D5 D6 D7

Hint - The signals can be easily monitored at
the edge of the display if desired.

PicoBlaze Spartan-3E Starter Kit Initial Design 7

LCD Display Timing
Once mastered, the LCD display is a practical way to display a variety of information using standard ASCII characters and even allows you to create some of
your own. However, these displays are not fast. This design scrolls the display at ½ second intervals and that really is the practical limit for clarity. This low
performance rate also relates to the signals used for communication. Compared with a Spartan-3E operating at 50MHz, the display can appear extremely
slow. This is where PicoBlaze can be used to efficiently implement timing delays as well as control the actual content of the display.
4-bit Write Operation

50MHz

This timing diagram shows a single write operation being performed. The
diagram is approximately to scale showing the minimum times allowed for
setup, hold and enable pulse length relative to a 50MHz clock (20ns period).
The data D[7:4], Register Select (RS) and write control (RW) must be set up at
least 40ns before the enable E goes High. Enable must be High for at least
230ns which is almost 12 clock cycles at 50MHz.
Hint – In a write only system, the R/W signal can be tied Low permanently.

RS

0=command 1=data

D[7:4]

Valid Data

R/W
E

8-bit Write Operation

After initial display communication is established, all data transfers are 8-bit ASCII character
codes, data bytes or 8-bit addresses. Each 8-bit transfer obviously has to be decomposed
into two 4-bit transfers which must be spaced by at least 1µs. Following an 8-bit write
operation, there must be an interval of at least 40µs before the next communication. This
delay must be increased to 1.64ms following a clear display command.
Upper
4-bits

230ns
40ns

10ns

Lower
4-bits

RS
D[7:4]
R/W
E

1µs

40µs

Exercise – Implement a hardware based state machine which obeys the timing requirements for an 8-bit write of data including the 40µs delay. Modify the
PicoBlaze interface and code to use your hardware circuit to write to the display. Under what circumstances would this approach be useful?

PicoBlaze Spartan-3E Starter Kit Initial Design 8

PicoBlaze Timing
In this design, PicoBlaze is used to implement the LCD communication 100% in software. The fact that a processor is sequential in nature means that the
required delays can be formed simply by executing the appropriate number of instructions. PicoBlaze simplifies the task of writing code because all
instructions execute in two clock cycles under all conditions.
CONSTANT delay_1us_constant, 0B
delay_1us: LOAD s0, delay_1us_constant
wait_1us: SUB s0, 01
JUMP NZ, wait_1us
RETURN
delay_40us: LOAD s1, 28
wait_40us: CALL delay_1us
SUB s1, 01
JUMP NZ, wait_40us
RETURN

The PicoBlaze program supplied implements a 1µs delay in software which it then uses as
the base for all operations. This subroutine is invoked with a ‘CALL delay_1us’ which then
LOADs register s0 with 11 (0B hex). This in turn causes the SUB and JUMPNZ instructions
to execute 11 times before RETURN completes the routine. This means that a delay of
exactly 1µs is formed by the 25 instructions each taking two clock cycles at 50MHz.
Creating other delays such as the 40µs required between 8-bit transfers is then a simple
case of calling the ‘delay_1us’ the appropriate number of times. In this case 40 (28 hex)
times results in slightly more than 40µs due to the executions of instructions within the
routine itself.
Exercise – Calculate the exact number of instructions, clock cycles and delay provided by
the ‘delay_40us’ subroutine. Prove your result either by simulation or preferably by
running a test design on the Starter Kit and making measurements.

LCD_pulse_E: XOR s4, LCD_E
OUTPUT s4, LCD_output_port
CALL delay_1us
XOR s4, LCD_E
OUTPUT s4, LCD_output_port
RETURN
The enable E pulse is formed by setting the E signal High on the output
port, waiting for 1µs and then driving E Low again. This oscilloscope screen
shot shows a single enable pulse observed at the LCD display pin. Data bit
D7 is also shown (see code on next page for more details).
Exercise – 1µs is greater than the 230ns minimum requirement for the enable
pulse width. Modify the code to generate an enable pulse which is 250ns.

PicoBlaze Spartan-3E Starter Kit Initial Design 9

1.08µs

E

D7

PicoBlaze Timing
LCD_write_data: LOAD s4, s5
AND s4, F0
OR s4, 0C
OUTPUT s4, LCD_output_port
CALL LCD_pulse_E
CALL delay_1us
LOAD s4, s5
SL1 s4
SL1 s4
SL0 s4
SL0 s4
OUTPUT s4, LCD_output_port
CALL LCD_pulse_E
CALL delay_40us
LOAD s4, F0
OUTPUT s4, LCD_output_port
RETURN

;Enable=0 RS=0 Instruction, RW=0 Write, E=0
;Enable=1 RS=1 Data, RW=0 Write, E=0
;set up RS and RW >40ns before enable pulse
;write upper nibble
;wait >1us
;select lower nibble with
;Enable=1
;RS=1 Data
;RW=0 Write
;E=0
;set up RS and RW >40ns before enable pulse
;write lower nibble
;wait >40us
;Enable=0 RS=0 Instruction, RW=0 Write, E=0
;Release master enable

>1µs between E pulses writing upper and then lower nibbles

The writing of 8-bit data is
achieved using the delays
and enable pulse routines
together with appropriate
setting the D[7:4] data bits,
RW=0 and RS=1.
Writing command
instructions to the display is
very similar but requires that
RS=0.

8-bit writes. >1µs between E pulses

E
44µs

D7
1µs/div

PicoBlaze Spartan-3E Starter Kit Initial Design 10

Display Setup
Before the display can be used for the first time, there is an initialisation sequence which must be followed to allow communication to take place. These
sequences are ideally suited to an 8-bit processor such as PicoBlaze. Besides the relative complexity of the sequence, the process is only executed once
and then the processor is available to perform other tasks including the control on the display itself.
Hint - The PicoBlaze code provided includes a subroutine called ‘LCD_reset’ which performs this initialisation sequence.
The first part of this sequence is to establish that the 4-wire data interface is being used. Note that some of these delays are in milliseconds.
Power
on

Wait
15ms

4-bit write
= 3 hex

Wait
4.1ms

4-bit write
= 3 hex

Wait
100µs

4-bit write
= 3 hex

Wait
40µs

4-bit write
= 2 hex

Wait
40µs

The 4-wire interface is now established which means that all subsequent communication is formed of the 8-bit writes described previously. Note that
these writes are all commands and therefore RS must be Low. The next part of the sequence is used to establish how the display should operate.
Function Set
28 hex

Entry Mode
06 hex

Display Control
0C hex

Display Clear
01 hex

Wait
1.64ms

Function Set = 28 hex : This code describes the display type as being 2 lines, 5×7 dots per character and using 4-wire communication (again).
Entry Mode = 06 hex

Display Control = 0C hex

0 0 0 0 0 1 1 0

0 0 0 0 1 1 0 0
Do not shift display left or right when writing a character

Cursor blinking off (character flashes)

Increment cursor position when writing a character

Cursor (line under character) is off
Display is ON

Exercise – Implement a hardware state machine which can perform the LCD initialisation sequence. Compare the size of your implementation with the 96
slices required to implement a PicoBlaze processor. Does the claim of the first paragraph hold true?

PicoBlaze Spartan-3E Starter Kit Initial Design 11

Display Control
The most common operation is simply to write ASCII characters to be displayed. These are considered to be data and hence RS will be High.
With the display set up as described previously, writing a series of characters will automatically result in their display on the top line of the display.
LOAD
CALL
LOAD
CALL
LOAD
CALL
LOAD
CALL
LOAD
CALL
LOAD
CALL
LOAD

s5, character_S
LCD_write_data
s5, character_P
LCD_write_data
s5, character_A
LCD_write_data
s5, character_R
LCD_write_data
s5, character_T
LCD_write_data
s5, character_A
LCD_write_data
s5, character_N

Following the execution of this code, the display will look like this.
Cursor is here waiting for the next character to be written

S P A R T A N S S S S S S S S S
S S S S S S S S S S S S S S S S
If you continue to write characters, they will eventually fall off the end of the first line but they will not automatically
appear on the second line. This is because the memory map of this display is not consecutive from line to line. The
diagram below shows the memory address of each character location.

To set the cursor in the position required for subsequent characters to be
displayed, the 8-bit memory address of that position must be written to the
display as a command (RS=0). Note that this can not be confused with any
of the other commands since the MSB is always ‘1’ in these addresses.
The ability to move to any particular location and write a few characters is
ideal for the display of various information as it becomes available such as
time, date, measurements and short status messages.

1 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
2 C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
0

1

2

3

4

5

6

7

8

9

A

B

C

D

E

F

Hint - The PicoBlaze code provided includes a subroutine called ‘LCD_cursor’. Load register ‘s5’ with the desired position. The upper nibble (value 1 or 2)
will define the line and the lower nibble the character position on the line (0 to F). E.g. s5 = 2B will position the cursor at the 12th position on line 2.
Exercise – Although this design does make use of the scrolling display feature, it really is not recommended other than for simple messages as used in
this example. Analyse the supplied PicoBlaze code and LCD display controller data sheets to determine how scrolling is achieved. Implement a design in
which the message is greater than 40 characters per line (Hint – The memory map is actually 40 locations per line. Addresses 80-A7 and C0-E7).

PicoBlaze Spartan-3E Starter Kit Initial Design 12

Complete PicoBlaze Program

Subroutines are used for
delays and LCD display

This information is intended to give a guide to the way in which the PicoBlaze assembler code is organised. It is not intended to be a lesson in how to write
assembler code or explain how PicoBlaze works. Please refer to the documentation for PicoBlaze (KCPSM3).
There are comments contained in the ‘control.psm’ file which should help explain the finer points.

Initialise LCD display

Interrupt Service Routine

Rotary function
Switch/button
function

Enable Interrupts

Fetch walking ‘1’ pattern from SPM

Read switches and Buttons
Write full messages to display memory
SPARTAN-3E STARTER KIT
www.xilinx.com/s3estarter

Output pattern to LEDs

Rotary mode

Test event pending flag

Program maintains 500ms shifting of
LCD display during mode switching
even if button is held down

No event

Event

Set walking ‘1’ LED pattern in SPM
00001000 = 08Hex

clear flag
Shift ‘1’ left or right

Set mode to rotary control in SPM
Fetch mode from SPM

Load counter with 500(ms)

Toggle mode

Read rotary press switch
and test state
up

Fetch mode from
SPM and test

Store mode in SPM

down

Delay 1ms
Decrement counter
and test for zero

Call appropriate routine

>0

Decrement counter
and test for zero
0

down

Delay 1ms
>0

0

Shift LCD display
Load counter with 500

Read rotary press switch
up
Shift LCD display
and test state
PicoBlaze Spartan-3E Starter Kit Initial Design 13

Fetch mode from
SPM and test

Fetch rotary information from SPM

Switch/button mode

Main program

Store walking ‘1’ pattern in SPM

Read direction of
rotary encoder
Set event
pending flag
Store direction
and event in SPM

Output pattern to LEDs
Scratch Pad Memory (SPM)
Interrupts occur every time the rotary control is rotated left or right.
The interrupt service routine (ISR) reads a value set into SPM by
the main program to determine if the LED display mode is using
the rotary control or slide/press button switches to determine if the
interrupt is relevant.
If the rotary control is relevant, then the direction of rotation is read
from the input port and stored together with an ‘event pending’ flag
bit. The main program monitors the SPM to determine if the LED
pattern should change and in what direction.
The position of the walking ‘1’ used in the rotary control mode is
also remembered in scratch pad memory.



Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.3
Linearized                      : No
Page Count                      : 13
Producer                        : GNU Ghostscript 7.06
Title                           : s3esk_startup_rev2
Creator                         : PDFCreator Version 0.8.0
Create Date                     : 2006:02:20 17:14:01
Author                          : Ken Chapman
Modify Date                     : 2006:02:20 17:14:01
Subject                         : 
EXIF Metadata provided by EXIF.tools

Navigation menu