Я пытаюсь написать блочный декодер, который является частью 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;
У меня нет идеала, чтобы исправить. Должен ли я написать первоначальный алгоритм или нет?