Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Lab Objectives
Learn how to interact with peripheral modules (Pmods) using XEM6002 Implement SPI protocol to interface with a gyroscope sensor Pmod Design a FrontPanel profile to display outputs from the gyroscope sensor
1. Introduction
The Opal Kelly XEM6002 allows for the attachment of small peripheral modules (Pmods), which hold different kinds of sensors. In this lab exercise, you will use a Pmod with an on-board 3-axis digital gyroscope: the PmodGYRO. It connects to one of the four POD connectors on the XEM6002 as shown in Figure 1. Note the orientation of the PmodGYRO board, including the eight pins facing up. It is very important to connect the Pmod correctly!
Gyroscopes measure rotational velocity (i.e. how fast it is spinning, also known as its angular rate). This particular sensor (the chip used on the PmodGYRO is L3G4200D) can measure
rotational velocity about the x, y and z axes. The PmodGYRO sensor also measures temperature. It outputs all of this information as digital data. To communicate with the gyroscope sensor onboard the PmodGYRO board, you will use the SPI communication protocol and read back the device ID, temperature, and X, Y and Z values. The relevant datasheets are provided in the lab supplement. They are: XEM6002-UM.pdf: User manual for the Opal Kelly XEM6002 board PmodGYRO_refManual.pdf: Reference manual for the PmodGYRO L3G4200D_refManual.pdf: Reference manual for the L3G4200D gyroscope chip You will be referring to these datasheets as you work through the lab. Read PmodGYRO_refManual.pdf to get a quick overview about PmodGYRO before you proceed to the next section.
The devices communicate with one another using the following four wires: Chip Select (CS): It is the serial port enable and is controlled by the master. It goes low at the start of transmission and returns high at the end of transmission. Serial Clock (SPC): It is the serial port clock and is controlled by the master. It provides the timing of the serial communication. Serial Data Input (SDI): It transfers data serially into the slave device. Values are latched on the rising edge of the SPC. Serial Data Output (SDO): It transfers data serially out of the slave device. Data is shifted out on the falling edge of the SPC.
The gyroscope supports the SPI protocol for reading and writing its registers, which are used to control its behavior and to retrieve rotational velocity data.
The SPI read command is performed with 16 clock pulses using the following sequence: The first bit (bit 0) starts at the first falling edge of SPC after the falling edge of CS. This first bit is the read/write select bit. Its value is set to 1 and is shifted into the PmodGYRO device to indicate a read command. Register address, which is 7 bits wide, is then shifted into the PmodGYRO device starting with the most significant bit, MS bit. The MS bit (bit 1), enables auto increment of register address for multiple byte reading when it is set to 1, otherwise auto increment is disabled when it is set to 0. The rest of register address bits AD(5:0), (bits 2 through 7), are shifted into the PmodGYRO device one bit at a time. Output data DO(7:0), (bits 8 through 15), are shifted out of the PmodGYRO device one bit at a time starting with most significant bit. The last bit (bit 15) starts at the falling edge of SPC just before the rising edge of CS.
The SPI write command is performed with 16 clock pulses using the following sequence: The first bit (bit 0) starts at the first falling edge of SPC after the falling edge of CS. This first bit is the read/write select bit. Its value is set to 0 and is shifted into the PmodGYRO device to indicate a write command. Register address, which is 7 bits wide, is then shifted into the PmodGYRO device starting with the most significant bit, MS bit. The MS bit (bit 1), enables auto increment of register address for multiple byte writing when it is set to 1, otherwise auto increment is disabled when it is set to 0. The rest of register address bits AD(5:0), (bits 2 through 7), are shifted into the PmodGYRO device one bit at a time. Input data DI(7:0), bits 8 through 15, are shifted into the PmodGYRO device one bit at a time starting with most significant bit. The last bit (bit 15) starts at the falling edge of SPC just before the rising edge of CS.
More information about SPI read and write protocols can be found in section 5.2 of L3G4200D_refManual.pdf.
OUT_TEMP get temperature data OUT_X_L get lower byte data of X-axis angular rate OUT_X_H get higher byte data of X-axis angular rate OUT_Y_L get lower byte data of Y-axis angular rate OUT_Y_H get higher byte data of Y-axis angular rate OUT_Z_L get lower byte data of Z-axis angular rate OUT_Z_H get higher byte data of Z-axis angular rate
Angular rate data for each of X, Y, and Z axes is described by 16-bit data that is expressed in 2s complement. The angular rate data for an axis is output in two bytes from two separate registers. For instance, X-axis angular rate data consists of lower byte data from OUT_X_L register and higher byte data from OUT_X_H register.
Figure 6: Master/slave relationship between SPI controller module and PmodGYRO device
The SPI controller module should contain the following input signals: clk clock signal to drive state machine reset signal that resets state machine to idle state EN signal to start execution of state machine from the idle state RdWr signal to indicate read command (RdWr=1) or write command (RdWr=0) regAddress address of the register that will be accessed (8 bits) writeData input data that will be shifted into the PmodGYRO device (8 bits) SDO signal to hold output data serially shifted from the PmodGYRO device The SPI controller module should contain the following output signals: readData - output data shifted out of the PmodGYRO device (8 bits) dataReady signal to indicate that a byte of data shifted from the device is ready for use CS chip select signal to enable serial port of PmodGYRO device SPC serial port clock that provides timing of SPI communication SDI signal to hold data that will be serially shifted into the PmodGYRO device
The state diagram starts with state 0 (idle), where output CS is high and thus SPI communication is inactive. State machine of SPI controller module would transition from state 0 to state 1 when EN signal is high, otherwise the state machine would remain in state 0. At state 1, CS goes low to enable the serial port, which marks the start of transmission. At state 2, RW bit is provided to the SDI wire on the falling edge of SPC At state 3, RW bit is latched into the PmodGYRO device on the rising edge of the SPC At state 4, MS bit is provided to the SDI wire on the falling edge of SPC At state 5, MS bit is latched into the PmodGYRO device on the rising edge of the SPC Similarly, AD(5:0) bits are provided to the SDI wire on the falling edge of the SPC and latched into the device on the rising edge of the SPC during states 6 through 17. State machine of SPI controller module would transition from state 17 to state 18 to perform a read command when RdWr signal is high, otherwise the state machine would transition from state 17 to state 35 to perform a write command when RdWr signal is low. If writing to a register, DI(7:0) bits are provided to the SDI wire on the falling edge of the SPC and latched into the PmodGYRO device on the rising edge of the SPC during states 18 through 33. At state 34, CS goes high to disable the serial port, which marks the end of transmission. The state machine then goes into idle state, state 0, where SPI communication is inactive. If reading from a register, DO(7:0) bits are shifted out of the PmodGYRO device on the falling edge of the SPC and read from the SDO wire on the rising edge of the SPC during states 35 through 50. At state 51, CS goes high to disable the serial port, which marks the end of
transmission. The state machine then goes into idle state, state 0, where SPI communication is inactive. The first three states of the state diagram are shown in Figure 8. The state diagram is represented as a Moore machine, where state and outputs are indicated in a circle, while a directed arc indicates state transition from present state to next state. Inputs are indicated next to the directed arc. In Figure 8, an x indicates value of input or output as a dont care.
4. Exercises
4.1 Designing and simulating the SPI controller module
1. Complete the state diagram to include all 51 states as shown in the annotated timing diagram in Figure 7. 2. Write VHDL code that implements an SPI controller module. The module should read and write data to registers on the PmodGYRO device. It should include a state machine based on the state diagram in (1). Use the following entity for your SPI controller module:
entity spi_controller is port ( clk: IN STD_LOGIC; reset: IN STD_LOGIC; EN: IN STD_LOGIC; RdWr: IN STD_LOGIC; CS: OUT STD_LOGIC; SPC: OUT STD_LOGIC; SDI: OUT STD_LOGIC; SDO: IN STD_LOGIC; regAddress: IN STD_LOGIC_VECTOR(7 DOWNTO 0); writeData: IN STD_LOGIC_VECTOR(7 DOWNTO 0); readData: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); dataReady: OUT STD_LOGIC); end spi_controller;
Refer to Section 3 of this manual for pin description. 3. Simulate the SPI controller module in ModelSim for a 1 MHz clock. Generate SDO input signal using a continuously incrementing counter in your testbench. Make sure that your ModelSim waveform matches the timing diagram shown in Figure 7. 4. Simplify the state machine of your SPI controller module to use less than 10 states. Hint: Use a counter and/or shifting mechanism to iterate through register address, SDI data, and SDO data. The following webpage provides information on shift and other operators in VHDL: http://www.csee.umbc.edu/portal/help/VHDL/operator.html 5. Make a new state diagram for the simplified SPI controller and code the state machine in VHDL. 6. Simulate your simplified SPI controller module to verify its correct operation. You will be graded on this simulation.
2. Click Next . Select IP window will appear as shown in Figure 10. Select FPGA Features and Design > Clocking > Clocking Wizard.
3. Click Next and Finish . A Clocking Wizard will pop up as shown in Figure 11. The wizard will guide you in selecting settings of your IP Core.
4. Page 1 of the clocking wizard will allow you to select clocking features and input clocks. Confirm that frequency of the input clock matches frequency of the system clock, which is 100MHz. Set clock manager type to auto selection, which will allow the wizard to automatically select the appropriate primitive block for your IP Core. Click Next to proceed to page 2. 5. Page 2 of the clocking wizard will allow you to select output clock settings. Set parameters of output clock as follows: 5MHz output frequency, 0 degrees phase, and 50% duty cycle. Click Next to proceed to page 3. 6. Page 3 of the clocking wizard will allow you to select I/O and feedback settings. Deselect reset and locked settings. Select Automatic control on-chip as the clock feedback source. Click Next to proceed to page 4. 7. Page 4 summarizes settings of your IP Core based on your input from previous steps. Click Next to proceed to page 5.
8. Page 5 allows you to select port names of input and output clocks. You may use default names or change names of the ports. Click Next to proceed to page 6. 9. Page 6 provides summary of your IP Core. It lists and briefly describes all the generated files. 10. Click Generate to complete IP Core generation. Wait for the IP Core generation process to complete. A .xco file will be added to your project.
11. To view component declaration and instantiation template of your IP Core, click on the .xco file in the Hierarchy window, expand the CORE Generator in processes window, and double click on View HDL instantiation Template as shown in Figure 12.
Figure 12: View component declaration and instantiation template of the IP Core
4.3 Read device ID, X, Y, Z and temperature data using SPI controller module
1. Make a new module, called top_level. This will be your top-level design. Instantiate the SPI controller module in the top_level module. 2. In the top-level design, instantiate an IP Core that takes 100MHz system clock as the input, and generates 5MHz clock as the output. Use the 5MHz clock to drive the SPI controller state machine. Follow the guide in section 4.2 of this manual to generate the IP Core. 3. In the top-level design, have a second state machine that sends a read request to the SPI controller for the device ID of the PmodGYRO device. See Section 2.3 of this manual for the appropriate register address (WHO_AM_I). 4. You will also need to include the appropriate FrontPanel USB communication module(s) in the top-level design. For more information, consult previous labs. 5. The J1 connector of the PmodGYRO connects to any one of the four POD connectors on the XEM6002 board. The J1 connector has the pinout shown in Figure 13 (from page 2 of PmodGYRO_refManual.pdf datasheet).
Each POD has an associated pinout, as shown in Figure 14. This was taken from page 13 of XEM6002-UM.pdf. Note that there are power (+3.3VDD) and ground (DGND) pins in addition to I/O pins on each POD.
Scroll down the UCF file to see where the POD pins are shown. Only the I/O pin connections are modifiable.
# POD1 ####################################################################### #NET "POD1_P1" LOC="M1" | IOSTANDARD="LVCMOS33"; #NET "POD1_P2" LOC="L1" | IOSTANDARD="LVCMOS33"; #NET "POD1_P3" LOC="K1" | IOSTANDARD="LVCMOS33"; #NET "POD1_P4" LOC="J1" | IOSTANDARD="LVCMOS33"; #NET "POD1_P7" LOC="E1" | IOSTANDARD="LVCMOS33"; #NET "POD1_P8" LOC="E2" | IOSTANDARD="LVCMOS33"; #NET "POD1_P9" LOC="F1" | IOSTANDARD="LVCMOS33"; #NET "POD1_P10" LOC="G1" | IOSTANDARD="LVCMOS33";
Depending on which POD you are using to connect your Pmod, uncomment the lines for the POD*_P1 to POD*_P4 pins. These will be connected to the CS, SDI, SDO and SPC ports on the SPI_controller respectively. It is very important that you connect the pins in the right order! 6. Design a FrontPanel profile to display the device ID. If successful, you will see the value 11010011(0xD3). 7. Next, expand the top-level state machine to send a sequence of requests. The sequence of requests starts with initializing the control register CTRL_REG1*, then looping through the following requests: read device ID, temperature and X, Y, Z data. This sequence is looped so all the information updates every few clock cycles. *CTRL_REG1: This is a control register that needs to be set up before the X, Y, Z and temperature information from the sensor can be output. Information on CTRL_REG1 is given in section 7.2. Set the parameters as follows: a. b. c. d. Output Data Rate of 400 Hz, Bandwidth cut-off of 25 Hz, Power-down mode set to normal mode, X axis, Y axis and Z axis all enabled.
8. Expand the FrontPanel profile to observe all the outputs from the gyroscope: device ID, temperature, X, Y and Z data.
Requirement Show drawings of state diagrams: long and simplified Show ModelSim simulation for simplified SPI controller state machine Reading the correct device ID CTRL_REG1 set up with the correct value Reading temperature, X, Y and Z correctly Reading all the values in a loop: ID, temperature, X, Y and Z Total
Points /2 /3 /2 /2 /3 /3 /15
Student Survey:
How much did you learn on this lab? How much did you enjoy this lab? (Nothing) 1 (Unpleasant) 1 2 2 3 3 4 4 5 (Brain Hurts) 5 (Very much)
How many hours outside of scheduled time did you work on this lab? ________ Please write any comments you may have about the lab below: