有关在Omnet ++中模拟时钟模块的问题

时间:2018-11-19 16:18:12

标签: c++ simulation omnet++

场景:

节点1(发送方)具有本地时钟(40.000 MHz),并通过串行(即光纤)链路将此时钟信号作为连续的比特流(01010101 ...)发送到节点2(接收方)。

节点2具有自己的(本地或全局,例如41.000 MHz)时钟,并且必须使用从节点1接收到的(时钟)数据来确定节点1本地时钟相对于其自身时钟的相位和频率。

或者,我可以想到节点1向节点2发送单个消息,但以明确定义的40.000 MHz频率向节点2发送。同样,节点2(具有自己的本地或全局41.000 MHz时钟)必须确定相位节点1从节点1接收到的消息的到达时间,将节点1的本地时钟相对于其自身时钟的频率和频率

问题:我该如何在OMNet ++中实现这两种情况?

1 个答案:

答案 0 :(得分:0)

我不了解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大的东西来存储刻度线,但是我不知道在这种情况下是什么阶段。