Modelica中的解码器有什么问题?
我正在尝试写一个块解码器,它是ADC的一部分。输入和输出为数字矢量,由逻辑“1”或“0”组成。 当ADC具有10位时,输入向量为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” 然后我删除了初始算法
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;