Забавляюсь последнее время по работе с СистемСи. Это такая надстройка над Си++, по сути набор классов для симуляции цифровых электронных систем. Пародия на СистемВерилог: работает так же шустро, и не стоит никаких денег. Но код выглядит ужасно.
Цифровые схемы уже несколько приелись, и решил я развлечься чем-нибудь более человеческим. Благо, к СистемСи народ умудрился добавить расширение для работы с аналоговыми вещами.
Зацените: модель материальной точки с одной степенью свободы. Как бы аналоговый элемент с одним входом и двумя выходами. На входе воздействующая сила, на выходе скорость и координата. Внутренний параметр - масса.
Добавляем второй элемент - пружину, получаем маятник. Результат симуляции выглядит вполне симпатично:

Полные исходники примера можно посмотреть здесь: https://code.google.com/p/vak-opensource/source/browse/#svn%2Ftrunk%2Fhardware%2Fsystemc-ams
Но все это не просто ради забавы. Есть у меня задумка попытаться сделать одноногого прыгающего робота. Типа Pogo Stick, но без привлечения человека.
Цифровые схемы уже несколько приелись, и решил я развлечься чем-нибудь более человеческим. Благо, к СистемСи народ умудрился добавить расширение для работы с аналоговыми вещами.
Зацените: модель материальной точки с одной степенью свободы. Как бы аналоговый элемент с одним входом и двумя выходами. На входе воздействующая сила, на выходе скорость и координата. Внутренний параметр - масса.
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);
}
};Добавляем второй элемент - пружину, получаем маятник. Результат симуляции выглядит вполне симпатично:

Полные исходники примера можно посмотреть здесь: https://code.google.com/p/vak-opensource/source/browse/#svn%2Ftrunk%2Fhardware%2Fsystemc-ams
Но все это не просто ради забавы. Есть у меня задумка попытаться сделать одноногого прыгающего робота. Типа Pogo Stick, но без привлечения человека.

no subject
Date: 2014-10-21 09:21 (UTC)Код на си понятен.
no subject
Date: 2014-10-21 09:35 (UTC)Прелесть SystemC-AMS в том, что он навязывает некую правильную методологию.