Извлечение отдельных битов из числа¶
В этой демонстрации мы покажем, как работать с блоком Extract Bits
, который позволяет извлечь биты, расположенные в заданных позициях входного числа.
Этот блок очень полезен при проектировании алгоритмов систем цифровой связи, при моделировании битовых сигнальных линий в системах управления или робототехнике, а также в разных самых задачах графического программирования.
Блок Extract Bits
принимает на вход целое число и формирует из него новое число на выходе. В свойствах блоков можно указать, какие биты из входного числа будут скопированы, а какие – нет.
В примере мы будем подавать на вход блока Extract Bits
константу типа UInt8
с значением 255. Все разрядные позиции этого восьмибитного числа заняты единицами. Покажем два режима работы блока Extract Bits
:
Preserve fixed-point scaling
— масштабирование входных данных с фиксированной точкой используется для определения масштабирования на выходе во время преобразования типа данных.
Treat bit field as an integer
— масштабирование входных данных с фиксированной точкой игнорируется, а для вычисления типа выходных данных используется только сохраненное целое число.
Сейчас мы увидим, чем различается работа обоих методов.
Treat bit field as an integer¶
Модель extract_bits_treat_bit_fields_as_integer
демонстрирует работу того режима, при котором извлеченная последовательность битов становится младшими битами в выходном сигнале блока.
Сигнал MSB
, полученный из числа 255 взятием двух старших битов числа, будет равен 0b11
(число 3), поскольку последовательность битов 11
смещается на место битов младшего разряда.
Preserve fixed-point scaling¶
Модель extract_bits_preserve_fixed_point_scaling
демонстрирует другой режим работы блока. В этом режиме последовательность выбранных битов остается на своем месте в разрядной сетке числа, остальные позиции заменяются нулями. Можно сказать, что таким образом блок реализует маскирование битов в числе.
Сигнал MSB теперь будет равен 0b11000000
, то есть 192.
Запустим обе модели средствами программного управления моделиравнием:
Out[0]:
Dict{String, DataFrame} with 4 entries:
"Mid SB" => 1×2 DataFrame…
"LSB" => 1×2 DataFrame…
"MSB" => 1×2 DataFrame…
"Input" => 1×2 DataFrame…
Мы видим, как выглядят последовательности бит при выборке старших, средних и младших бит разрядной сетки при разных настройках блока.
Мы продемонстрировали работу блока Extract Bits
в связке с Integer To Bit Conversion
. Таким образом мы показали, как работает маскирование целых чисел и как можно получить на выходе только выбранные биты, образовав из них короткую новую последовательность.
Наряду с Bus
и Mux
это еще один способ, который позволяет пересылать много сигналов по одной сигнальной линии. Но, конечно, это не единственное и не главное применение этого блока.
Блоки, использованные в примере¶
{"id": "8b8cfc17-d6a2-496b-9b01-718130c25e95", "data": [{"showlegend": true, "mode": "markers", "xaxis": "x", "colorbar": {"title": {"text": ""}}, "name": "y1", "zmin": null, "yaxis": "y", "legendgroup": "y1", "marker": {"symbol": "circle", "color": "rgba(0, 154, 250, 1.000)", "line": {"color": "rgba(0, 0, 0, 1)", "width": 1}, "size": 8}, "zmax": null, "y": [1, 1, 1, 1, 1, 1, 1, 1], "type": "scatter", "x": [1, 2, 3, 4, 5, 6, 7, 8], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 8, "currentCount": 8}}}, {"showlegend": true, "mode": "markers", "xaxis": "x2", "colorbar": {"title": {"text": ""}}, "name": "y1", "zmin": null, "yaxis": "y2", "legendgroup": "y1", "marker": {"symbol": "circle", "color": "rgba(0, 154, 250, 1.000)", "line": {"color": "rgba(0, 0, 0, 1)", "width": 1}, "size": 8}, "zmax": null, "y": [1, 1, 1, 1, 1, 1, 1, 1], "type": "scatter", "x": [1, 2, 3, 4, 5, 6, 7, 8], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 8, "currentCount": 8}}}, {"showlegend": true, "mode": "markers", "xaxis": "x3", "colorbar": {"title": {"text": ""}}, "name": "y1", "zmin": null, "yaxis": "y3", "legendgroup": "y1", "marker": {"symbol": "circle", "color": "rgba(0, 154, 250, 1.000)", "line": {"color": "rgba(0, 0, 0, 1)", "width": 1}, "size": 8}, "zmax": null, "y": [1, 1], "type": "scatter", "x": [1, 2], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 2, "currentCount": 2}}}, {"showlegend": true, "mode": "markers", "xaxis": "x4", "colorbar": {"title": {"text": ""}}, "name": "y1", "zmin": null, "yaxis": "y4", "legendgroup": "y1", "marker": {"symbol": "circle", "color": "rgba(0, 154, 250, 1.000)", "line": {"color": "rgba(0, 0, 0, 1)", "width": 1}, "size": 8}, "zmax": null, "y": [1, 1], "type": "scatter", "x": [7, 8], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 2, "currentCount": 2}}}, {"showlegend": true, "mode": "markers", "xaxis": "x5", "colorbar": {"title": {"text": ""}}, "name": "y1", "zmin": null, "yaxis": "y5", "legendgroup": "y1", "marker": {"symbol": "circle", "color": "rgba(0, 154, 250, 1.000)", "line": {"color": "rgba(0, 0, 0, 1)", "width": 1}, "size": 8}, "zmax": null, "y": [1, 1, 1], "type": "scatter", "x": [3, 4, 5], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 3, "currentCount": 3}}}, {"showlegend": true, "mode": "markers", "xaxis": "x6", "colorbar": {"title": {"text": ""}}, "name": "y1", "zmin": null, "yaxis": "y6", "legendgroup": "y1", "marker": {"symbol": "circle", "color": "rgba(0, 154, 250, 1.000)", "line": {"color": "rgba(0, 0, 0, 1)", "width": 1}, "size": 8}, "zmax": null, "y": [1, 1, 1], "type": "scatter", "x": [6, 7, 8], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 3, "currentCount": 3}}}, {"showlegend": true, "mode": "markers", "xaxis": "x7", "colorbar": {"title": {"text": ""}}, "name": "y1", "zmin": null, "yaxis": "y7", "legendgroup": "y1", "marker": {"symbol": "circle", "color": "rgba(0, 154, 250, 1.000)", "line": {"color": "rgba(0, 0, 0, 1)", "width": 1}, "size": 8}, "zmax": null, "y": [1, 1], "type": "scatter", "x": [7, 8], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 2, "currentCount": 2}}}, {"showlegend": true, "mode": "markers", "xaxis": "x8", "colorbar": {"title": {"text": ""}}, "name": "y1", "zmin": null, "yaxis": "y8", "legendgroup": "y1", "marker": {"symbol": "circle", "color": "rgba(0, 154, 250, 1.000)", "line": {"color": "rgba(0, 0, 0, 1)", "width": 1}, "size": 8}, "zmax": null, "y": [1, 1], "type": "scatter", "x": [7, 8], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 2, "currentCount": 2}}}], "config": {"paper_bgcolor": "rgba(255, 255, 255, 1.000)", "xaxis7": {"showticklabels": true, "gridwidth": 0.5, "range": [0.79, 8.21], "domain": [0.07646908719743364, 0.5061698016914553], "mirror": false, "tickangle": 0, "showline": true, "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "y7", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "xaxis8": {"showticklabels": true, "gridwidth": 0.5, "range": [0.79, 8.21], "domain": [0.5637376057159522, 0.9934383202099737], "mirror": false, "tickangle": 0, "showline": true, "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "y8", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "height": 400, "yaxis4": {"showticklabels": true, "gridwidth": 0.5, "range": [0, 2], "domain": [0.5219952974628171, 0.7167199803149606], "mirror": false, "tickangle": 0, "showline": true, "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "x4", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "yaxis2": {"showticklabels": true, "gridwidth": 0.5, "range": [0, 2], "domain": [0.7641827974628171, 0.9589074803149606], "mirror": false, "tickangle": 0, "showline": true, "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "x2", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "xaxis3": {"showticklabels": true, "gridwidth": 0.5, "range": [0.79, 8.21], "domain": [0.07646908719743364, 0.5061698016914553], "mirror": false, "tickangle": 0, "showline": true, "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "y3", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "xaxis4": {"showticklabels": true, "gridwidth": 0.5, "range": [0.79, 8.21], "domain": [0.5637376057159522, 0.9934383202099737], "mirror": false, "tickangle": 0, "showline": true, "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "y4", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "annotations": [{"yanchor": "top", "xanchor": "center", "rotation": 0, "y": 1, "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 13}, "yref": "paper", "showarrow": false, "text": "Preserve fixed point scaling<br>(маскирование)", "xref": "paper", "x": 0.29131944444444446}, {"yanchor": "top", "xanchor": "center", "rotation": 0, "y": 1, "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 13}, "yref": "paper", "showarrow": false, "text": "Treat bit fields as integer<br>(выборка)", "xref": "paper", "x": 0.778587962962963}], "yaxis6": {"showticklabels": true, "gridwidth": 0.5, "range": [0, 2], "domain": [0.27980779746281703, 0.47453248031496054], "mirror": false, "tickangle": 0, "showline": true, "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "x6", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "plot_bgcolor": "rgba(255, 255, 255, 1.000)", "xaxis5": {"showticklabels": true, "gridwidth": 0.5, "range": [0.79, 8.21], "domain": [0.07646908719743364, 0.5061698016914553], "mirror": false, "tickangle": 0, "showline": true, "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "y5", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "showlegend": false, "yaxis8": {"showticklabels": true, "gridwidth": 0.5, "range": [0, 2], "domain": [0.03762029746281702, 0.23234498031496048], "mirror": false, "tickangle": 0, "showline": true, "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "x8", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "yaxis3": {"showticklabels": true, "gridwidth": 0.5, "range": [0, 2], "domain": [0.5219952974628171, 0.7167199803149606], "mirror": false, "tickangle": 0, "showline": true, "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "x3", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "MSB", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "yaxis5": {"showticklabels": true, "gridwidth": 0.5, "range": [0, 2], "domain": [0.27980779746281703, 0.47453248031496054], "mirror": false, "tickangle": 0, "showline": true, "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "x5", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "Mid SB", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "yaxis7": {"showticklabels": true, "gridwidth": 0.5, "range": [0, 2], "domain": [0.03762029746281702, 0.23234498031496048], "mirror": false, "tickangle": 0, "showline": true, "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "x7", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "LSB", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "xaxis2": {"showticklabels": true, "gridwidth": 0.5, "range": [0.79, 8.21], "domain": [0.5637376057159522, 0.9934383202099737], "mirror": false, "tickangle": 0, "showline": true, "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "y2", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "xaxis6": {"showticklabels": true, "gridwidth": 0.5, "range": [0.79, 8.21], "domain": [0.5637376057159522, 0.9934383202099737], "mirror": false, "tickangle": 0, "showline": true, "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "y6", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "margin": {"l": 0, "b": 20, "r": 0, "t": 20}, "width": 1252.953125, "xaxis": {"showticklabels": true, "gridwidth": 0.5, "range": [0.79, 8.21], "domain": [0.07646908719743364, 0.5061698016914553], "mirror": false, "tickangle": 0, "showline": true, "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "y", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "yaxis": {"showticklabels": true, "gridwidth": 0.5, "range": [0, 2], "domain": [0.7641827974628171, 0.9589074803149606], "mirror": false, "tickangle": 0, "showline": true, "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "x", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "Input", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}}}