DecomposeInt32 (10025)




1) Przeznaczenie bloku

DecomposeInt32 służy do rozbicia jednej 32-bitowej liczby całkowitej ze znakiem (Int32 / I32) na dwie liczby 16-bitowe.
Blok wykonuje operację odwrotną do ComposeInt32:
z jednej liczby I32
tworzy dwa słowa 16-bitowe:

młodsze (low)
starsze (high)

2) Interfejs bloku (wejścia / wyjścia)

Wejście

in
Typ: I32 (Int32)
Liczba 32-bitowa ze znakiem, która ma zostać rozłożona na dwa słowa 16-bitowe.

Wyjścia

low
Zawiera młodsze 16 bitów liczby wejściowej in.
Odpowiada bitom 0…15.

high
Zawiera starsze 16 bitów liczby wejściowej in.
Odpowiada bitom 16…31.

Oznaczenie I32 widoczne na bloku odnosi się do typu wejściowego.

3) Zasada działania (bit po bicie)

Blok rozkłada liczbę wejściową in w następujący sposób:

low otrzymuje dolne 16 bitów wejścia
high otrzymuje górne 16 bitów wejścia

Schemat bitowy:

low[15:0] = in[15:0]
high[15:0] = in[31:16]

W zapisie operacyjnym:

low = in AND 0xFFFF
high = (in >> 16) AND 0xFFFF

4) Zachowanie znaku (liczby dodatnie i ujemne)

Wejście in jest typu Int32, czyli liczbą ze znakiem (kod U2 / two’s complement).
low zawsze zawiera „surowe” młodsze 16 bitów – bez interpretacji znaku.
high zawiera starsze 16 bitów, w tym bit znaku (bit 31 oryginalnej liczby).

Jeżeli in jest liczbą ujemną:
w wyjściu high będzie ustawiony bit 15 (odpowiadający bitowi znaku liczby 32-bitowej),
co jest poprawne i oczekiwane przy dalszym składaniu lub transmisji danych.

5) Kolejność słów (istotna przy komunikacji)

Blok zawsze rozkłada liczbę w sposób jednoznaczny:

low = młodsze słowo (LSW)
high = starsze słowo (MSW)

Przy przesyłaniu danych do urządzeń zewnętrznych (np. rejestry komunikacyjne):
należy sprawdzić, czy urządzenie oczekuje kolejności:

low → rejestr n, high → rejestr n+1

czy odwrotnie

Sam blok nie zmienia kolejności – jedynie rozdziela bity.

6) Procedura użycia krok po kroku

Podłącz liczbę Int32 do wejścia in.

Odczytaj:

low jako młodsze 16 bitów,
high jako starsze 16 bitów.
Przypisz low i high do zmiennych, rejestrów lub dalszych bloków.
Przy komunikacji – upewnij się, że zapisujesz je w odpowiedniej kolejności.

7) Przykład na konkretnych liczbach (z obliczeniem)

Przykład 1 – liczba dodatnia

Załóżmy:

in = 131073

Postać heksadecymalna:

131073 = 0x00020001

Rozkład:

low = 0x0001 → 1
high = 0x0002 → 2

Na wyjściach bloku:

low = 1
high = 2

Przykład 2 – liczba ujemna

Załóżmy:

in = -65536

Postać heksadecymalna (Int32):

-65536 = 0xFFFF0000

Rozkład:

low = 0x0000 → 0
high = 0xFFFF → -1 (w interpretacji 16-bitowej ze znakiem)

Na wyjściach bloku:

low = 0
high = -1

8) Jak można wykorzystać blok DecomposeInt32

Blok DecomposeInt32 stosuje się wszędzie tam, gdzie:
wewnętrznie pracujesz na liczbach 32-bitowych (Int32),
a musisz je:
zapisać do dwóch rejestrów 16-bitowych,
przesłać przez protokół operujący na słowach 16-bitowych,
przygotować do dalszego przetwarzania słowami.

Typowe zastosowania:

zapis wartości liczników, energii, pozycji, czasu itp. do rejestrów,
przygotowanie danych do komunikacji,
pełna para z blokiem ComposeInt32 (rozkład → transmisja → złożenie).