Engee 文档
Notebook

从数字中提取单个位

在本演示中,我们将向您展示如何使用该块。 Extract Bits,它允许您提取位于输入数字的指定位置的位。

该块在设计数字通信系统的算法、在控制系统或机器人中的位信号线建模以及在各种图形编程任务中是非常有用的。

模型描述

Extract Bits 接受一个整数作为输入,并在输出端从它生成一个新的数字。 在块属性中,您可以指定输入数字中的哪些位将被复制,哪些不会被复制。

启动模型

在示例中,我们将馈送块输入 Extract Bits 类型的常量 UInt8 值为255。 这个八位数的所有位位置都被单位占用。 让我们展示块的两种操作模式。 Extract Bits:

  • Preserve fixed-point scaling -输入数据的定点缩放用于确定数据类型转换期间输出的缩放。
  • Treat bit field as an integer -忽略具有固定点的输入数据的缩放,并且仅使用存储的整数来计算输出数据的类型。

现在我们将看到这两种方法的工作有何不同。

将位字段视为整数

模型 extract_bits_treat_bit_fields_as_integer 演示其中所提取的比特序列成为块的输出信号中的低阶比特的模式的操作。

信号 MSB,从数字255通过取数字的两个最高位获得,将等于 0b11 (数字3),因为位的序列是 11 被移位到低阶位的位置。

image.png

保留定点缩放

模型 extract_bits_preserve_fixed_point_scaling 演示不同的块操作模式。 在该模式中,所选位的序列保持在其在位网格中的位置的数字,其余位置被零替换。 我们可以说,通过这种方式,块实现了数字中位的屏蔽。

MSB信号现在将等于 0b11000000 这是192。

image.png

模型比较

让我们通过建模软件控制来运行这两个模型:

In [ ]:
modelName = "extract_bits_preserve_fixed_point_scaling"
model = modelName in [m.name for m in engee.get_all_models()] ? engee.open( modelName ) : engee.load( "$(@__DIR__)/$(modelName).engee");
data1 = engee.run( modelName );

modelName = "extract_bits_treat_bit_fields_as_integer"
model = modelName in [m.name for m in engee.get_all_models()] ? engee.open( modelName ) : engee.load( "$(@__DIR__)/$(modelName).engee");
data2 = engee.run( modelName );
In [ ]:
plot(
    scatter( collect(1:8), replace( data1["Input"].value[end], 0=>NaN), ylims=(0,2), title="Preserve fixed point scaling\n(маскирование)", ylabel="Input", titlefont=font(9) ),
    scatter( collect(1:8), replace( data2["Input"].value[end], 0=>NaN), ylims=(0,2), title="Treat bit fields as integer\n(выборка)", titlefont=font(9) ),
    scatter( collect(1:8), replace( data1["MSB"].value[end], 0=>NaN), ylims=(0,2), ylabel="MSB" ),
    scatter( collect(1:8), replace( data2["MSB"].value[end], 0=>NaN), ylims=(0,2) ),
    scatter( collect(1:8), replace( data1["Mid SB"].value[end], 0=>NaN), ylims=(0,2), ylabel="Mid SB" ),
    scatter( collect(1:8), replace( data2["Mid SB"].value[end], 0=>NaN), ylims=(0,2) ),
    scatter( collect(1:8), replace( data1["LSB"].value[end], 0=>NaN), ylims=(0,2), ylabel="LSB" ),
    scatter( collect(1:8), replace( data2["LSB"].value[end], 0=>NaN), ylims=(0,2) ),
    leg=:false, layout=(4,2)
)
Out[0]:

我们可以看到在不同块设置下采样位网格的高、中、低位时,位序列是什么样子的。

结论

我们已经演示了该块的操作 Extract BitsInteger To Bit Conversion. 因此,我们展示了屏蔽整数是如何工作的,以及如何在输出端只获得选定的位,从它们形成一个简短的新序列。

随着 BusMux 这是另一种方法,允许您通过单个信号线发送许多信号。 但是,当然,这不是这个块的唯一而不是主要应用。

示例中使用的块