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:.
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-protOptional:
False
Outputs:
output: Demodulated PPM binary data.Protocol:
bool_timed_sample-protOptional:
False
Properties
samps_per_sym: Number of samples per symbol. One symbol is two halves of pulse position.Type:
ucharAccess:
Parameter:
FalseWritable:
FalseInitial:
TrueVolatile:
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:
boolAccess:
Parameter:
FalseWritable:
FalseInitial:
TrueVolatile:
False
Default value:
false
Implementations
ppm_demodulation_s_b(HDL)
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.