Home
Welcome
Information


FPGA projects
Basic
Music box
LED displays
Pong game
R/C servos
Text LCD module
Quadrature decoder
PWM and one-bit DAC
Debouncer
Crossing clock domains
External contributions

Interfaces
RS-232
JTAG
I2C
EPP
SPI
PCI
PCI Express
10BASE-T

Advanced
Digital oscilloscope
Graphic LCD panel
Direct Digital Synthesis
CNC steppers
Spoc CPU core

Hands-on
A simple oscilloscope


FPGA introduction
What are FPGAs?
How FPGAs work
Internal RAM
FPGA pins
Clocks and global lines
Download cables
Configuration
Learn more

FPGA software
Design software
Pin assignment
Design-entry/HDL
Simulation/HDL
Synthesis and P&R

FPGA electronic
SMD technology
Crystals and oscillators

HDL info
HDL tutorials
Verilog tips
VHDL tips

Quick-start guides
ISE
Quartus

Site
News
FPGA links
HDL tutorials
Forum


Integrator

The secret

In our implementation, the PC doesn't sends any position or speed information to the FPGA. Instead, it sends acceleration and time information. The FPGA uses integrators to convert them into speed and position (and drives the Step/Dir signals accordingly).

So our motion controller works as an acceleration integrator. That's easy to implement because in an FPGA, an integrator is simply an accumulator. The following "C" code illustrates what the FPGA performs at each clock cycle:

  // Acceleration is known (provided by the PC)
  Speed += Acceleration;
  Position += Speed;
Acceleration integrator example

Let's illustrate that by an example: we want to move an axis by +50.

We could do the following:

  1. Accelerate by +1 for 5 clock cycles.
  2. Accelerate by 0 for 5 clock cycles.
  3. Accelerate by -1 for 5 clock cycles.

After 15 clock cycles, our integrator has reached the position +50.

CycleAccelerationSpeedPosition
0000
1+1+1+1
2+1+2+3
3+1+3+6
4+1+4+10
5+1+5+15
60+5+20
70+5+25
80+5+30
90+5+35
100+5+40
11-1+4+44
12-1+3+47
13-1+2+49
14-1+1+50
15-10+50

Easy, right?

Fixed point precision arithmetic

Now there is a problem: the FPGA clock runs much faster than the steppers can accept steps. So the calculations must be done on fractional numbers. For example, we could decide that the position 50 above represents actually 0.000050mm in the hardware.

After careful consideration, we decided to use 64 bits fixed point precision arithmetic.
In more details:

Of course, with a 3-axis system, we have 3 of each (3 positions, 3 speeds and 3 acceleration registers). The PC provides groups of 3 accelerations numbers (16 bits each), plus a duration, and the FPGA calculates the speeds and positions automatically using integrators.



>>> NEXT: FPGA motion controller >>>



This page was last updated on October 08 2007.