构建真值表、布尔方案和表达式¶
在本演示中,我们将展示如何创建一个离散模型来计算真值表的输出信号,并将其与根据逻辑元素创建的模型进行比较。
模型描述¶
让我们创建一个模型,根据下面的真值表将一组输入比特转换为输出信号:
| a | b | c | y | | - | - | - | - | - | y | | - | - | - | - | | 0 | 0 | 0 | 0 | | 0 | 0 | 1 | 0 | | 0 | 1 | 0 | 1 | | 0 | 1 | 1 | 0 | | 1 | 0 | 0 | 1 | | 1 | 0 | 1 | 0 | | 1 | 1 | 0 | 1 | | 1 | 1 | 1 | 0 |
真值表可以用多种不同的方式定义,例如使用块Engee Function
中的代码。
输入信号通过脉冲发生器Pulse Generator
生成,每个下一个发生器的脉冲周期除以2
("最年轻 "发生器的周期为1 с
,下一个为2 с
,"最老 "发生器为4 с
)。默认情况下,时间零点时刻的所有脉冲发生器都从上一级脉冲开始(在参数Amplitude
中指定)。我们熟悉的真值表形式意味着信号的枚举是从下一级开始的。为避免改变每个振荡器的相位,我们将Not
应用于每个输入通道(使用适当配置的块Logical Operator
)。
模型的采样步长等于0.5
。每个振荡器在一个完整周期内产生上下两个脉冲值,填充因子为 50%。因此我们可以得到以下模型:
在程序块内部,真值表由以下代码描述:
``朱莉娅 function (c::Block)(t::Real, A, B, C) if A == 0 && B == 0 && C == 0 返回 0; elseif A == 0 && B == 0 && C == 1 return 0; elseif A == 0 && B == 1 && C == 0 返回 1; elseif A == 0 && B == 1 && C == 1 return 0; elseif A == 1 && B == 0 && C == 0 return 1; elseif A == 1 && B == 0 && C == 1 return 0; elseif A == 1 && B == 1 && C == 0 return 1; elseif A == 1 && B == 1 && C == 1 return 0; else return 0; end; 结束
我们可以使用 AND、OR、NOT 逻辑元素创建相同的电路。
我们的真值表与$F = (A \lor B) \land (\lnot C$) 所描述的公式相对应。使用几个块就可以轻松实现Logical Operator
。
或者在程序块Fcn
内使用表达式(u[1] || u[2]) && !u[3]
。
运行模型¶
让我们使用软件控制指令运行模型:
modelName = "truth_tables"
# Если модель еще не открыта, загрузим из файла
if modelName ∉ [m.name for m in engee.get_all_models()] engee.load( "$(@__DIR__)/$modelName.engee"); end;
data = engee.run( modelName )
并将结果可视化。如果将真值表转换为逻辑图的过程正确无误,我们将得到三个完全相同的图形:
gr()
plot(
plot( data["Y"].time, data["Y"].value, st=:step, lc=1, leg=false, title="Сигналы по таблице истинности" ),
plot( data["Y1"].time, data["Y1"].value, st=:step, lc=2, leg=false, title="Сигналы по логической схеме" ),
plot( data["Y1"].time, data["Y2"].value, st=:step, lc=3, leg=false, title="Сигналы по логическому выражению" ),
layout=(3,1)
)
结论¶
我们已经建立了一些简单的模型,可用于研究微电子学或为测试数字设备创造环境。