Łączna liczba wyświetleń

wtorek, 8 marca 2016

Cechy charakterystyczne procesorów sygnałowych

Autor Nauka Programowania  |   20:00

Magistrale danych i architektura ALU


  • Wykonywanie wszystkich głównych operacji arytmetycznych w jednym cyklu zegarowym
  • Wsparcie sprzętowe dla zarządzania obliczeniami numerycznymi i ich dokładnością
  • Rejestry skalujące
  • Linie opóźniające i bufory cyrkulacyjne
  • Bity kontrolne strumieni danych i rozkazów
  • Kontrola przepełnienia

Zbiór instrukcji procesora


  • Złożone, wyspecjalizowane instrukcje
  • Wielokrotne operacje przypadające na jedną instrukcję

Architektura pamięci


  • Architektura Harwardzka
  • Dostęp do 2-4 komórek pamięci na 1 cykl zegarowy
  • Nie jest stosowana pamięć podręczna procesora

Specjalizowane tryby adresowania pamięci


  • Dedykowane jednostki generowania adresu
  • Specjalizowane tryby adresowania np.:
  • Automatyczna inkrementacja adresu
  • Adresowanie „modulo” (bufory cyrkulacyjne)
  • Bit-reserved (FFT)
  • Wsparcie bezpośredniego dostępu do danych

Sterowanie wykonaniem programu


  • Sprzętowe wsparcie dla „fast looping”
  • „Fast interrupts” dla obsługi operacji wejścia/wyjścia
  • Wsparcie trybu debugowania w czasie rzeczywistym

 


Źrodło:


http://galaxy.eti.pg.gda.pl/katedry/ksa/dydaktyka/Procesory_sygnalowe_i_logika_programowalna//Wyklad.pdf

poniedziałek, 7 marca 2016

Cechy wzmacniaczy operacyjnych

Autor Nauka Programowania  |  w wzmacniacz  16:38

Cechy wzmacniaczy operacyjnych

Parametry wzmacniaczy operacyjnych rzeczywistych i idealnych.

Wzmacniacze operacyjne


Wzmacniacze te są największą grupą analogowych układów scalonych. Charakteryzują je następujące właściwości:

  • Bardzo duże wzmocnienie napięciowe (powyżej 10000 V/V, 80 dB)
  • Wzmacniają prąd stały
  • Odwracają fazę sygnału wyjściowego w stosunku do sygnału podawanego na wejście odwracające lub zachowują zgodność w fazie, jeżeli sygnał wejściowy jest podawany na wejście nieodwracające
  • Duża rezystancja wejściowa
  • Mała rezystancja wyjściowa



Podstawowe parametry wzmacniacza rzeczywistego


Parametry rzeczywiste odbiegają od idealnych. Do podstawowych parametrów zalicza się:

  • Wzmocnienie napięciowe przy otwartej pętli sprzężenia zwrotnego ku0 (ang. Open Loop Voltage Gain). Jest to stosunek przyrostu napięcia wyjściowego do wywołującego ten przyrost napięcia wejściowego.

Wzmocnienie to nazywane jest wzmocnieniem sygnału różnicowego.

  • Wejściowe napięcie niezrównoważenia Ui0 (ang. Input Offset Voltage). Jest to stałe napięcie różnicowe  wymagane do uzyskania zerowej wartości napięcia wyjściowego przy otwartej pętli sprzężenia zwrotnego. Wpływa na pracę układu ze sprzężeniem zwrotnym.
  • Wzmocnienie napięciowe sygnału współbieżnego kusw. Stosunek zmiany napięcia wyjściowego ∆Uwy do wywołującej ją zmiany napięcia sygnału współbieżnego (na obydwa wejścia układu jest podawany taki sam sygnał).


    Jeżeli na wejścia układu są podawane napięcia o różnych wartościach:
  • Współczynnik tłumienia sygnału współbieżnego (ang. Common Mode Rejection Ratio – CMRR). Stosunek wartości wzmocnienia napięciowego układu z otwartą pętlą do wartości wzmocnienia napięciowego sygnału współbieżnego.

    Tłumienie sygnału współbieżnego ma największe znaczenie w tych układach, w których sygnału są podawane na oba wejścia.
  • Rezystancja wejściowa:
    Rid – rezystancja dla sygnału różnicowego.
    Riws – rezystancja dla sygnału współbieżnego
    Rezystancja wyjściowa jest mierzona we wzmacniaczu z otwartą pętlą sprzężenia zwrotnego przy napięciach równych zero.
  • Zakres zmian napięcia wejściowego (ang. Input Voltage Range). Jest to zakres zmian napięcia na każdym z wejść względem masy, przy którym wzmacniacz pracuje prawidłowo (tzn. W zakresie liniowym)
  • Maksymalne napięcie wyjściowe (ang. Output Voltage Swing). Jest to maksymalna wartość napięcia wyjściowego wzmacniacza, gdy nie zniekształca on przebiegu wyjściowego
    . Maksymalne napięcie wyjściowe wynosi nieco mniej niż podwojona wartość napięcia zasilania.
  • Częstotliwość graniczna ft Jest to częstotliwość, przy której moduł wzmocnienia maleje do jedności. Decyduje ona o paśmie przenoszenia wzmacniacza.
  • Napięcie Zasilania UCC
  • Wejściowe prądy polaryzujące
  • Maksymalny prąd wyjściowy Iwy max. Jego wartość decyduje o maksymalnej mocy wydzielonej w obciążeniu.
  • Szybkość zmian napięcia wyjściowego Swy. Jest tym większa im większa jest wartość częstotliwości granicznej ft. Decyduje o odpowiedzi układu na skok jednostkowy.
  • Pobór mocy



W poniższej tabeli przedstawiono właściwości, jakie powinien wykazywać idealny oraz cechy, jakie posiada rzeczywisty wzmacniacz operacyjny:

Idealny
Rzeczywisty
Nieskończenie duże wzmocnienie przy otwartej pętli sprzężenia zwrotnego
Współczynnik wzmocnienia przy otwartej pętli sprzężenia zwrotnego osiąga bardzo duże, ale określone skończone wartości. W typowych układach K = 104 – 107
Nieskończone szerokie pasmo przenoszonych częstotliwości
Górną granice pasma przenoszonych częstotliwości są wartości kilkudziesięciu MHz
Nieskończenie duża impedancja wejściowa
Impedancja wejściowa w przedziale 104 – 1013
Impedancja wyjściowa równa zeru
Impedancja wyjściowa jest niewielka, kilkadziesiąt Ω
Wejścia wzmacniacza nie pobierają żadnego prądu z obwodów zewnętrznych
Prąd wejściowy jest niezerowy (jest to prąd polaryzacji), może on przyjmować wartości rzędu 10-4 – 10-15 A
Wzmocnienie idealnie różnicowe
Wzmocnienie rzeczywistego wzmacniacza operacyjnego nie jest idealnie różnicowe
Nieskończenie duża szybkość narastania napięcia wyjściowego
Szybkość narastania napięcia wyjściowego w typowych wzmacniaczach jest rzędu kilku, kilkudziesięciu V/µS
Nieograniczony zakres zmian napięcia wyjściowego
Napięcie wyjściowe jest ograniczone – zwykle mniejsze o 1-2 V od napięcia zasilania
Niezależność parametrów temperatury
Właściwości wzmacniacza zależne są od temperatury
Brak szumów własnych
Wzmacniacze wytwarzają zakłócenia własne



Źródło



Barbara Pióro, Marek Pióro – Podstawy elektroniki 2

czwartek, 25 lutego 2016

7. Kurs Asembler x86: Instrukcje transferu danych

Autor Nauka Programowania  |  w x86  21:28

Typ operandów

Instrukcje mogą przyjmować zero, jeden, dwa lub trzy operandy.

Wyróżnia się trzy podstawowe typy operandów

  • Wartości stałe – wartość ustalona przed tłumaczeniem programu
  • Rejestr – zawartość jednego z rejestrów procesora
  • Adres – odwołuje się do jakiegoś miejsca w pamięci

Instrukcja MOV


Instrukcja MOV kopiuje dane ze źródła do miejsca docelowego. Format tej instrukcji wygląda następująco:

MOV cel, źródło

W językach wysokiego poziomu wyglądałoby to w taki sposób:

Cel = źródło

Instrukcja MOV stawia pewne wymagania

Oba operandy muszą być tego samego rodzaju

Oba operandy nie mogą być jednocześnie adresem w pamięci

Rejestr wskaźnika instrukcji nie może być rejestrem docelowym

Dozwolone kombinacje można zapisać w następujący sposób:

MOV rejestr, rejestr
MOV pamięć, rejestr
MOV rejestr, pamięć
MOV pamięć, stała
MOV rejestr, stała



Pojedyncza instrukcja mov nie może zostać użyta do przeniesienia danych spod jednego adresu do drugiego. Kod, który wykona to działanie wygląda tak:

.data
zmienna1 WORD ?
zmienna2 WORD ?

.code
main PROC
mov ax, zmienna1
mov zmienna2, ax



Kopiowanie mniejszej wartości do większej


Instrukcja MOV nie może bezpośrednio skopiować mniejszego operandu do większeg, jednak istnieje możliwość obejścia tego. Stwórzmy zmienna licznik(bez znaku, 16-bitowa), która musi zostać przeniesiona do rejestru ECX (32-bitowy). Możemy przenieść do ECX zero, w ten sposób kasując jego zawartość i wtedy skopiować do rejestru CX zmienną licznik.

.data
licznik WORD 1
.code
mov ecx, 0
mov cx, count



A co się stanie gdy w podobny sposób spróbujemy skopiować liczbe ze znakiem?

.data
zeZnakiem SWORD -16 ; FFF0h(-16)

.code
mov ecx, 0
mov cx, zeZnakiem   ; ECX = 0000FFF0h (+65520)

Jak widać wartość zmiennej została skopiowana w dosłowny sposób, bez zachowania kodowania U2, przez co w rejestrze ECX znajduje się liczba dodatnia.

Instrukcja MOVZX


MOVZX (move with zero-extend) kopiuje zawartość operanda źródłowego do operanda docelowego I wypełnia zerami rejestr do wartości 16 lub 32 bitowej. Tej instrukcji używa się tylko podczas kopiowania liczb bez znaku.

Format instrukcji

MOVZX reg32, reg/mem8
MOVZX reg32, reg/mem16
MOVZX reg16, reg/mem8



Przykład:

.data
bajt BYTE 10001111b
.code
movzx ax, bajt



Przed wywołaniem instrukcji skopiowania do rejestru, może w nim znajdować się dowolna liczba.

AX
10110011
11101111



Skopiowanie z wypełnieniem zerami, kopiuje mniejszą wartość do dolnej części rejestru a górną wypełnia zerami.

AX
00000000
10001111

Instrukcja MOVSX


MOVSX (move with sign-extend) kopiuje zawartość operandu źródłowego do miejsca docelowego i zachowuje odpowiednie kodowanie dla wypełnianych bitów. Tej instrukcji używa się tylko podczas kopiowania liczb ze znakiem.

Format instrukcji

MOVSX reg32, reg/mem8
MOVSX reg32, reg/mem16
MOVSX reg16, reg/mem8



Przykład:

.data
bajt BYTE 10001111b
.code
movsx ax, bajt



Przed wywołaniem instrukcji skopiowania do rejestru, może w nim znajdować się dowolna liczba.

AX
10110011
11101111



MOVSX zachowuje odpowiednie kodowanie liczb ujemnych podczas kopiowania.

AX
11111111
10001111



Instrukcje LAHF I SAHF


LAHF (Load status flags into AH) kopiuje dolny bajt rejestru EFLAGS do rejestru AH. Kopiowane są następujące flagi: Sign, Zero, Auxilliary Carry, Parity i Carry.

Poniższy kod kopiuje dolny bajt rejestru EFLAGS do rejestru AH a następnie kopiuje zawartość rejestru AH do zmiennej kopiaFlag.

.data
kopiaFlag BYTE ?
.code
lahf
mov kopiaFlag, ah



SAHF (store AH into status flags) kopiuje zawartość rejestru AH do dolnego bajtu rejestru EFLAGS.

mov ah, kopiaFlag
sahf



Wyświetlenie rejestru flag podczas debugowania


Żeby w Visual Studio podczas debugowania programu wyświetlić zawartość rejestru flag należy w oknie Registers kliknąc prawym przyciskiem myszy i wybrać opcję flags.



Instrukcja XCHG


XCHG (exchange data) zamienia zawartość dwóch operandów. Można użyć jej w trzech wariantach:

XCHG reg, reg
XCHG reg, mem
XCHG mem, reg

Zasady dotyczące używania instrukcji XCHG jest taka sama jak w przypadku instrukcji MOV.

Operator przesunięcia


Jak już wcześniej pisałem nazwa jakiejś zmiennej reprezentuje jej adres w pamięci. W przypadku tablicy nazwa jest adresem pierwszego elementu, a kolejne elementy ułozone są po kolei za pierwszym. W związku z tym można się do nich dostać korzystając z adresu pierwszego elementu dodając do niego przesunięcie będące wielokrotnością rozmiaru elementu.

Kod
Wynik
.386
.model flat, stdcall
.stack 4096

include kernel32.inc
includelib kernel32.lib

.data
tablicaB BYTE 10h, 20h, 30h, 40h, 50h

.code
main PROC
    mov eax, 0
    mov al, tablicaB
    mov al, [tablicaB+1]
    mov al, [tablicaB+2]
    mov al, [tablicaB+3]
    mov al, [tablicaB+4]

    invoke ExitProcess, 0
main ENDP
END main










EAX = 0
EAX = 10h
EAX = 20h
EAX = 30h
EAX = 40h



Wyrażenie [tablicaB+1] dodaje do adresu tablicaB jeden bajt, a umieszczenie tego w nawiasach [ ] mówi asemblerowi, żeby pobrał wartość elementu, który znajduje się pod tym adresem.

MASM nie sprawdza czy nie wyszliśmy poza zakres tablicy, więc zapisując [tablicaB+20] odczytam wartość znajdującą się 20 bajtów poza pierwszym adresem w tej tablicy.

W przypadku gdyby tablica przechowywała elementy typu WORD należy przesuwać jej indeks o 2 bajty, ponieważ jest to rozmiar każdego z elementów.

.data
tablicaW WORD 10h, 20h, 30h, 40h, 50h

.code
main PROC
    mov eax, 0
    mov ax, tablicaW
    mov ax, [tablicaW+2]
    mov ax, [tablicaW+4]
    mov ax, [tablicaW+6]
    mov ax, [tablicaW+8]



Gdyby tablica przechowywała dane typu DWORD należałoby przesuwać indeks o 4 bajty, jest to rozmiar każdego z elementów.



Przykładowy program


Kod przykładowego programu pokazującego działanie ostatnio wspomnianych instrukcji

.386
.model flat, stdcall
.stack 4096

include kernel32.inc
includelib kernel32.lib

.data
zmienna1 WORD 1000h
zmienna2 WORD 2000h
tablicaB BYTE 10h, 20h, 30h, 40h, 50h
tablicaW WORD 100h, 200h, 300h
tablicaD DWORD 10000h, 20000h

.code
main PROC
    mov eax, 0
    mov ebx, 0
    mov ecx, 0
    mov edx, 0

    mov bx, 0A69Bh
    movzx eax, bx
    movzx edx, bl
    movzx cx, bl

    mov bx, 0A69Bh
    movsx eax, bx
    movsx edx, bl
    mov bl, 07Bh
    movsx cx, bl

    mov ax, zmienna1
    xchg ax, zmienna2
    mov zmienna1, ax

    mov al, tablicaB
    mov al, [tablicaB+1]
    mov al, [tablicaB+2]

    mov ax, tablicaW
    mov ax, [tablicaW+2]

    mov eax, tablicaD
    mov eax, [tablicaD+4]

    invoke ExitProcess, 0
main ENDP
END main






Proudly Powered by Blogger.