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).