Modelica中的解码器有什么问题?

Modelica中的解码器有什么问题?,modelica,adc,openmodelica,Modelica,Adc,Openmodelica,我正在尝试写一个块解码器,它是ADC的一部分。输入和输出为数字矢量,由逻辑“1”或“0”组成。 当ADC具有10位时,输入向量为1023位(1023=2^10-1)lang,输出向量为10位lang 解码器的理想是:首先,我得到输入向量中的数字“1”。然后我使用函数div()和mod()将十进制中的数字改为二进制。对于数字输出的其余部分,我给出所有位“0” 但是编译人员说 “给定的系统是混合确定的。[索引>3]请签出 选项“-maxMixedDeterminedIndex” 然后我删除了初始算法

我正在尝试写一个块解码器,它是ADC的一部分。输入和输出为数字矢量,由逻辑“1”或“0”组成。 当ADC具有10位时,输入向量为
1023位(1023=2^10-1)
lang,输出向量为
10位
lang

解码器的理想是:首先,我得到输入向量中的数字“1”。然后我使用函数
div()
mod()
将十进制中的数字改为二进制。对于数字输出的其余部分,我给出所有位“0”

但是编译人员说

“给定的系统是混合确定的。[索引>3]请签出 选项“-maxMixedDeterminedIndex”

然后我删除了初始算法并将其放入算法中。但是输出没有beginvalue和

'在时间0..9.22009327831e-011左右检测到抖动(一行中有100个状态事件,总时间增量小于步长0.002)。这可能是性能瓶颈。有关详细信息,请使用-lv LOG_events。过零为:div(decoder1.a,2,2)'

块解码器
参数整数Res(min=1,start=10,fixed=true);
参数整数步长(min=1,start=1023,fixed=true);
//决议
Modelica.Electrical.Digital.Interfaces.DigitalInput结果[步骤]注释(
位置(可视=真,变换(原点={-100,0},范围={-10,-10},{10,10},旋转=0),iconTransformation(原点={-100,0},范围={-10,-10},{10,10},旋转=0));
Modelica.Electrical.Digital.Interfaces.DigitalOutput二进制[Res]注释(
位置(可视=真,变换(原点={106,0},范围={-10,-10},{10,10},旋转=0),iconTransformation(原点={106,0},范围={-10,-10},{10,10},旋转=0));
整数a;
整数b;
导入L=Modelica.Electrical.Digital.Interfaces.Logic;
Modelica.Electrical.Digital.Interfaces.DigitalInput De_clk注释(
位置(可视=真,转换(原点={-6,98},范围={-10,-10},{10,10},旋转=0),iconTransformation(原点={-6,98},范围={-10,-10},{10,10},旋转=0));
初始算法
对于1:Res循环中的i
二进制[i]:=L.'0';
结束于;
算法
a:=0;
b:=0;
如果deu clk==L.'1'或deu clk==L.'H',则
对于1:Step循环中的i
如果结果[i]==L.'1',则
a:=a+1;
如果结束;
结束于;
而div(a,2)0循环
当mod(a,2)==1时,则
二进制[Res-b]:=L.'1';
结束时;
当mod(a,2)=0时,则
二进制[Res-b]:=L.'0';
结束时;
a:=div(a,2);
b:=b+1;
结束时;
二进制[Res-b]:=L.'1';
如果结束;
如果Res-b-1>0,则
对于1:Res-b-1循环中的i
二进制[i]:=L.'0';
结束于;
如果结束;
方程式
终端解码器;

我没有一个理想的解决方案。我是否应该编写初始算法?

您的代码中存在一些基本问题:
when
不能用于while循环。例如,Dymola拒绝翻译您的模型。为什么在使用
语句时使用
?您是否完全理解了
when
if
的区别?你应该重写你的算法部分。也许你喋喋不休的烦恼到时候也会消失。那你真是太好了。我将when语句更改为if语句,它确实有效。但是你能告诉我“如果”和“什么时候”的区别吗?参见问题的答案和
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;