Files
bouwhuim.nikhef.nl dee2668a61 newest version WRPC
2013-09-10 08:08:59 +00:00

96 lines
1.8 KiB
C

/*
* This work is part of the White Rabbit project
*
* Copyright (C) 2010 - 2013 CERN (www.cern.ch)
* Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
*
* Released according to the GNU GPL, version 2 or any later version.
*/
/* spll_ptracker.c - implementation of phase trackers. */
#include "spll_ptracker.h"
void ptracker_init(struct spll_ptracker_state *s, int id_a,
int id_b, int num_avgs)
{
s->tag_a = s->tag_b = -1;
s->id_a = id_a;
s->id_b = id_b;
s->ready = 0;
s->n_avg = num_avgs;
s->acc = 0;
s->avg_count = 0;
s->sample_n = 0;
s->preserve_sign = 0;
}
void ptracker_start(struct spll_ptracker_state *s)
{
s->tag_a = s->tag_b = -1;
s->ready = 0;
s->acc = 0;
s->avg_count = 0;
s->sample_n = 0;
s->preserve_sign = 0;
spll_enable_tagger(s->id_a, 1);
spll_enable_tagger(s->id_b, 1);
}
#define PTRACK_WRAP_LO (1<<(HPLL_N-2))
#define PTRACK_WRAP_HI (3*(1<<(HPLL_N-2)))
int ptracker_update(struct spll_ptracker_state *s, int tag,
int source)
{
if (source == s->id_a)
s->tag_a = tag;
if (source == s->id_b)
s->tag_b = tag;
if (s->tag_a >= 0 && s->tag_b >= 0) {
int delta = (s->tag_a - s->tag_b) & ((1 << HPLL_N) - 1);
s->sample_n++;
if (s->avg_count == 0) {
if (delta <= PTRACK_WRAP_LO)
s->preserve_sign = -1;
else if (delta >= PTRACK_WRAP_HI)
s->preserve_sign = 1;
else
s->preserve_sign = 0;
s->avg_count++;
s->acc = delta;
} else {
if (delta <= PTRACK_WRAP_LO && s->preserve_sign > 0)
s->acc += delta + (1 << HPLL_N);
else if (delta >= PTRACK_WRAP_HI
&& s->preserve_sign < 0)
s->acc += delta - (1 << HPLL_N);
else
s->acc += delta;
s->avg_count++;
if (s->avg_count == s->n_avg) {
s->phase_val = s->acc / s->n_avg;
s->ready = 1;
s->acc = 0;
s->avg_count = 0;
}
}
s->tag_b = s->tag_a = -1;
}
return SPLL_LOCKING;
}