Вопрос по моделированию модулей часов в Omnet ++ - PullRequest
0 голосов
/ 19 ноября 2018

Сценарий:

Узел 1 (Отправитель) имеет локальный тактовый генератор (40 000 МГц) и отправляет этот тактовый сигнал в виде непрерывного потока битов (01010101 ...) по последовательной (т. Е. Волоконно-оптической) линии связи на Узел 2 (Приемник).

Узел 2 имеет свои собственные (локальные или глобальные, например, 41.000 МГц) тактовые импульсы и должен определять фазу и частоту локальных тактовых импульсов Узла 1 относительно своих собственных тактовых импульсов, используя данные (тактовых импульсов), которые он получает от Узла 1. .

В качестве альтернативы, я могу думать о том, что Узел 1 отправляет отдельные сообщения, но на четко определенной частоте 40.000 МГц, в Узел 2. Опять же, Узел 2 (который имеет свой собственный локальный или глобальный тактовый генератор 41.000 МГц) должен определить фазу и частота локальных часов Узла 1 по отношению к его собственным часам с использованием времени прихода сообщений, которые он получает от Узла 1

Вопрос: Как бы я реализовал любой из этих сценариев в OMNet ++?

1 Ответ

0 голосов
/ 19 ноября 2018

Я не знаю OMNet ++, но если у вас есть тиков обоих часов, то

the_other_clocks_freq = the_other_clocks_ticks*your_own_freq/your_own_ticks

работать, чтобы получить частоту? Пример:

#include <iostream>

class Clock {
    uint64_t m_freq;
    uint64_t m_ticks;
public:
    Clock(uint64_t Base) : m_freq(Base), m_ticks(0) {}
    void tick() { ++m_ticks; }
    operator double () const { return static_cast<double>(m_ticks)/static_cast<double>(m_freq); }
    uint64_t getTicks() const { return m_ticks; }
    uint64_t getOtherClockFreq(uint64_t other_ticks) {
        return (other_ticks*m_freq)/m_ticks;
    }

};
int main() {
    Clock Node1(40000000);
    Clock Node2(41000000);

    // simulate 0.00075s
    for(int i=0; i<40000*75/100; ++i) Node1.tick();
    for(int i=0; i<41000*75/100; ++i) Node2.tick();

    std::cout << Node1 << "s\n"; // 0.00075s
    std::cout << Node2 << "s\n"; // 0.00075s

    // calculate the base freq of the other clock
    std::cout << Node1.getOtherClockFreq(Node2.getTicks()) << " Node2 base\n";
    std::cout << Node2.getOtherClockFreq(Node1.getTicks()) << " Node1 base\n";
}

выход

0.00075s
0.00075s
41000000 Node2 base
40000000 Node1 base

На этих скоростях вам может понадобиться что-то большее, чем uint64_t для хранения тиков, хотя ... и я не знаю, какая фаза в этом случае.

...