PPM Demodulator (ppm_demodulation_s_b)

PPM (Pulse Position Modulation) demodulation

Design

Pulse Position Modulation (PPM) is a technique that modulates a carrier signal on and off over a duration of symbol time. PPM is similar to on-off keying (OOK) but is slightly different because the interpreted bit value is dependent on when the pulse within the designated symbol period is on or off. If ON in first half of symbol and OFF in second half is interpreted as a binary ‘1’, then when first half of symbol is OFF and second half is ON, then the binary value will be interpreted as ‘0’. The opposite case is an option for this component as well. The “one_has_leading_zeros” property is used to select either case as shown in Figure 20:.

Skeleton alternative text.

Figure 20: PPM Symbols to bit values.

The correct interpretation is highly dependent on the accurate alignment of the input samples. The component presumes the first sample of PPM input stream is aligned with the start of message (SOM).

Interface

<?xml version="1.0"?>
<componentspec>
  <port name="input" protocol="short_timed_sample-prot"/>
  <port name="output" protocol="bool_timed_sample-prot" producer="true"/>
  <property type="uChar" name="samps_per_sym" initial="true" default="2"
	  description="Number of samples per symbol. One symbol is two halves of 
	  pulse position."/>
  <property type="bool" name="one_has_leading_zero" default="false" initial="true"
	  description="If true, then if first half of pulse position zero, then 
	  bit value is 1. If first half of pulse position is one, then bit value is 0"/>
</componentspec>

Opcode Handling

Component only passes sample opcodes.

Ports

Inputs:

  • input: PPM pulses in. Assumed to be aligned to input message boundary.

    • Protocol: short_timed_sample-prot

    • Optional: False

Outputs:

  • output: Demodulated PPM binary data.

    • Protocol: bool_timed_sample-prot

    • Optional: False

Properties

  • samps_per_sym: Number of samples per symbol. One symbol is two halves of pulse position.

    • Type: uchar

    • Access:

      • Parameter: False

      • Writable: False

      • Initial: True

      • Volatile: False

    • Default value: 2

  • one_has_leading_zero: If true, then if first half of pulse position zero, then bit value is 1. If first half of pulse position is one, then bit value is 0.

    • Type: bool

    • Access:

      • Parameter: False

      • Writable: False

      • Initial: True

      • Volatile: False

    • Default value: false

Implementations

Example Application

<?xml version="1.0"?>
<application done="file_write">
  <instance component="ocpi.core.file_read" connect="ppm_demodulation_s_b">
    <property name="filename" value="input.bin"/>
  </instance>
  <instance component="ocpi.examples.components.ppm_demodulation_s_b" connect="file_write">
     <property name="samps_per_sym" value="4"/>
     <property name= "one_has_leading_zero" value="false"/>
  </instance>
  <instance component="ocpi.core.file_write">
    <property name="filename" value="output.bin"/>
  </instance>
</application>

Dependencies

The dependencies to other elements in OpenCPI are:

None

There is also a dependency on:

  • ieee.std_logic_1164

  • ieee.numeric_std

Limitations

Limitations of ppm_demodulation_s_b are:

  • Input samples must be aligned with the proper pulse position based on start of message.

Testing

Tested platforms: None

Component testing not completed.