vak: (Улыбка)
[personal profile] vak
Забавляюсь последнее время по работе с СистемСи. Это такая надстройка над Си++, по сути набор классов для симуляции цифровых электронных систем. Пародия на СистемВерилог: работает так же шустро, и не стоит никаких денег. Но код выглядит ужасно.

Цифровые схемы уже несколько приелись, и решил я развлечься чем-нибудь более человеческим. Благо, к СистемСи народ умудрился добавить расширение для работы с аналоговыми вещами.

Зацените: модель материальной точки с одной степенью свободы. Как бы аналоговый элемент с одним входом и двумя выходами. На входе воздействующая сила, на выходе скорость и координата. Внутренний параметр - масса.

SCA_TDF_MODULE(point_mass) {
    sca_in force_in<double>;
    sca_out velocity_out<double>;
    sca_out position_out<double>;

    double mass;
    double position;
    double velocity;
    double time_last;

    SCA_CTOR(point_mass) {
        mass = 1.0; // 1 kg by default
        position = 0;
        velocity = 0;
        time_last = 0;
    }

    void set_attributes() {
        set_timestep(0.001, SC_SEC);
        position_out.set_delay(1);
    }

    void processing() {
        double force = force_in.read();
        double time_now = get_time().to_seconds();
        double delta_t = time_now - time_last;

        velocity += delta_t * force / mass;
        position += velocity * delta_t;
        time_last = time_now;

        velocity_out.write(velocity);
        position_out.write(position);
    }
};


Добавляем второй элемент - пружину, получаем маятник. Результат симуляции выглядит вполне симпатично:

Симуляция в SystemC-AMS

Полные исходники примера можно посмотреть здесь: https://code.google.com/p/vak-opensource/source/browse/#svn%2Ftrunk%2Fhardware%2Fsystemc-ams

Но все это не просто ради забавы. Есть у меня задумка попытаться сделать одноногого прыгающего робота. Типа Pogo Stick, но без привлечения человека.

Date: 2014-10-21 09:21 (UTC)
From: [identity profile] dom3d.livejournal.com
Непонятно, но здорово!

Код на си понятен.