В чем проблема с декодером в Modelica? - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь написать блочный декодер, который является частью AD C. Вход и выход - цифровой вектор, который состоит из лог c '1' или '0'. Входной вектор равен 1023bits (1023=2^10-1) lang, а выходной вектор равен 10 bits lang, когда бит AD C 10 имеет.

Идеал декодера: во-первых, я получаю число «1» во входном векторе. Затем я использую функции div() и mod() для изменения числа в десятичной системе в двоичную систему. Для остальной части цифрового выхода я даю все биты «0».

Но компилятор сказал, что

"Данная система является смешанно-определенной. [Index> 3] Пожалуйста, проверьте параметр" --maxMixedDeterminedIndex "."

Чем я удалил исходный алгоритм и поместил его в алгоритм. Но в Output нет начального значения и

'Обнаружена вибрация около времени 0..9.22009327831e-011 (100 событий состояния подряд с общей разницей во времени меньше, чем размер шага 0,002). Это может быть узким местом в производительности. Используйте -lv LOG_EVENTS для получения дополнительной информации. Пересечение нуля было: div (decoder1.a, 2, 2) '

block decoder
  parameter Integer Res(min = 1, start = 10, fixed = true);
  parameter Integer Step(min = 1, start = 1023, fixed = true);
  //Resolution
  Modelica.Electrical.Digital.Interfaces.DigitalInput result[Step] annotation(
    Placement(visible = true, transformation(origin = {-100, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {-100, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Modelica.Electrical.Digital.Interfaces.DigitalOutput Binary[Res] annotation(
    Placement(visible = true, transformation(origin = {106, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {106, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Integer a;
  Integer b;
  import L = Modelica.Electrical.Digital.Interfaces.Logic;
  Modelica.Electrical.Digital.Interfaces.DigitalInput De_clk annotation(
    Placement(visible = true, transformation(origin = {-6, 98}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {-6, 98}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
initial algorithm
  for i in 1:Res loop
    Binary[i] := L.'0';
  end for;
algorithm
  a := 0;
  b := 0;
  if De_clk == L.'1' or De_clk == L.'H' then
    for i in 1:Step loop
      if result[i] == L.'1' then
        a := a + 1;
      end if;
    end for;
    while div(a, 2) <> 0 loop
      when mod(a, 2) == 1 then
        Binary[Res - b] := L.'1';
      end when;
      when mod(a, 2) == 0 then
        Binary[Res - b] := L.'0';
      end when;
      a := div(a, 2);
      b := b + 1;
    end while;
    Binary[Res - b] := L.'1';
  end if;
  if Res - b - 1 > 0 then
    for i in 1:Res - b - 1 loop
      Binary[i] := L.'0';
    end for;
  end if;
equation

end decoder;

У меня нет идеала, чтобы исправить. Должен ли я написать первоначальный алгоритм или нет?

...