Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
1
Rejestry przesuwne, sumatory
Ernest Jamro Kat. Elektroniki AGH
2
Multiplekser Mux 2:1 Mux 4:1
3
Multiplekser 2:1 na bramkach
Sel\In1, In0 00 01 11 10 1 Out= SelIn0 + Sel In1 Y <= (not Sel and In0) OR (Sel and In1); --VHDL
4
Multiplekser na bramkach – postać ogólna
VHDL Ai <= conv_integer(Sel); Y <= X(Ai); -- Out i In słowa kluczowe Mux 4:1
5
Multiplekser na buforach trójstanowych
VHDL (wewnątrz FPGA): Ch(1)<= In1 when Tn(1)=‘1’ else ‘Z’; Ch(2)<= In2 when Tn(2)=‘1’ else ‘Z’; VHDL (testbench): Y<= ch(1); Y<= ch(2); Aby uniknąć krótkotrwałego zwierania buforów stosuje się krótki czas martwy w którym wszystkie bufory są w stanie wysokiej impedancji. Wymaga to użycia automatu zamiast prostego dekodera kodu binarnego na 1 z n.
6
Multiplekser na bramkach OC
*.ucf NET "ch<1>" LOC = "T3" ; NET "ch<1>" PULLUP; VHDL bramka OD/OC: Ch(1) <= ‘0’ when D0=‘0’ else ‘Z’; Ch(2)<= ‘0’ when D1=‘0’ else ‘Z’; Y= S’D0 + SD multiplekser A + B= (A’B’)’ - prawo De Morgana, (Wired AND) Y= ( (S’D0)’ (SD1)’ )’
7
Demultiplekser
8
Multipleksowanie w czasie
Wyświetlacz 7-segmentowy Tylko jeden wyświetlacz jest aktywny w danej krótkiej chwili czasowej W układach scalonych z reguły bardziej kosztowne jest dodanie dodatkowego wyprowadzenia niż dodatkowej logiki
9
Incrementator (S=A+1) Si Ci si = ai ci-1 ci= ai ci-1 ci-1\ai 1
1 ci-1\ai 1 HA Half Adder si = ai ci-1 ci= ai ci-1
10
Incrementator: Example
A=10112= 1110=0xB S=A+1= 11002=1210=0xC
11
Dodawanie z szeregową propagacją przeniesienia (Ripple Carry) Adder: S= A+B
ai + bi+ci-1 = si + 2·ci si = ai bi ci-1 ci= ai bi + ai ci-1 + bi ci-1= ai bi + ci-1 (ai bi) ci-1\ai,bi 00 01 11 10 1 ci ci-1\ai,bi 00 01 11 10 1 Propagate Generate
12
Odejmowanie / Subtraction (a-b)
Direct Two’s Complement (2C) ai - bi-ci-1 = si - 2·ci si = ai bi ci-1 Add 1 to the LSB (Least Significant Bit) Sign bit negation si Instead of employing dedicated subtraction we can use a standard adder convert B to 2C code Example: 1111 in 2C= 0000+1= (minus one) ci-1\ai,bi 00 01 11 10 1 ci ci-1\ai,bi 00 01 11 10 1 Red color – difference between addition and subtraction
13
Add/Subtract Logic S<= A+B when Sub=‘0’ else A-B;
Convert B to Two’s Complement when Sub=1
14
Dodaj,Odejmij, Przepełnienie, Przykłady
Add: 3+2= 5 0011 = 3 0010 = 2 0111 = 7 Add: 3+5= 8 0011 = 3 0101 = 5 1000 = -8 Overflow Add: -7+6= -1 1001 = -7 0110 = 6 1111 = -1 Overflow= CarryOutN xor CarryOutN-1 Subtract: 6-1= 5 0110 = 6 1111 = -1 = 8 Subtract: -1-2= 1 1111 = -1 1110 = -2 = -3 Subtract: -5-4= -9 1011 = -5 1100 = -4 0111= 7 Overflow
15
Komparator AB A=B not[ (aN xor bN) or ... or (a1 xor b1) or (a0 xor b0) ] A/=B (aN xor bN) or ... or (a1 xor b1) or (a0 xor b0) A<B Sign(A-B) AB not Sign(B-A) AB not Sign(A-B) A>B Sign(B-A)
16
Komparator AConst A=C not( (aN xor cN) or ... or (a1 xor c1) or (a0 xor c0) ) np. C=5: not( aN or ... or not a2 or a1 or not a0 A!=C (aN xor cN) or ... or (a1 xor c1) or (a0 xor c0) A!=0 aN or ... or a1 or a0 A<2i not (aN or ... or ai+1 or ai) A2i aN or ... or ai+1 or ai C – Constant i- integer
17
Counter mod 2N Qn+1= Qn+1 architecture Beh of counter_2N is
signal Q: std_logic_vector(3 downto 0):= "0000"; begin process(clk, reset_asynch) begin if reset_asynch=‘1’ then Q<= (others=>’0’); elsif clk’event and clk=‘1’ then Q<= Q + 1; end if; end process; Count<= Q end Beh; library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity counter_2N is port(clk, reset_asynch: in std_logic; count : out std_logic_vector (3 downto 0)); end counter_2N;
18
Counter mod N architecture Beh of counter_N is
signal Q: std_logic_vector(3 downto 0):= "0000"; begin process(clk) begin if clk’event and clk=‘1’ then if reset_synch=‘1’ or Q=N-1 then Q<= (others=>’0’); else Q<= Q + 1; end if; -- not reset end if; -- clk end process; end Beh;
19
Up/Down Counter mod 2N architecture Beh of counter_up_down is
signal Q: std_logic_vector(3 downto 0); begin process(clk) begin if clk’event and clk=‘1’ then if Up_DownN=‘1’ then Q<= Q + 1; else Q<= Q - 1; end if; -- up / downN end if; -- clk end process; Count <= Q; end Beh;
20
Up/Down Counter mod N process(clk) begin if clk’event and clk=‘1’ then
if Up_DownN=‘1’ then if Q = N-1 then Q<= (others=>’0’) else Q<= Q + 1; end if; else -- counting down if Q = 0 then Q<= conv_std_logic_vector(N-1, vec_width); Q<= Q - 1; end if; -- up / downN end if; -- clk end process;
21
Rotacja, Przesunięcie logiczne i Arytmetyczne
Wejście: a3a2a1a0 W lewo Rot: a2a1a0a3 B<= A(2 downto 0) & A(3); Log: a2a1a00 B<= A(2 downto 0) & ‘0’; Arith: a2a1a00 B<= A(2 downto 0) & ‘0’; W prawo Rot: a0a3a2a1 B<= A(0) & A(3 downto 1); Log: 0a3a2a1 B<= ‘0’ & A(3 downto 1); Arith: a3a3a2a1 B<= A(3) & A(3 downto 1); Logiczne –mnożenie/dzielenie przez 2 dla nieujemnych liczb Arytmetyczne: mnożenie/dzielenie przez 2 dla uzupełnień do dwóch Przykład: –1= 1111; -1/2= 1111= -1
22
Rejestr przesuwny w prawo lub lewo
SLEFT=0 – przesuń w prawo SLEFT=1 – przesuń w lewo
23
Rejestr przesuwny w prawo i w lewo z wpisem równoległym
process(clk) begin if clk’event and clk=‘1’ then if S(1)= ‘1’ then -- load Q<= D; elsif S(0)= ‘0’ then – shift right Q<= Dleft & Q(3 downto 1); else -- shift left Q<= Q(2 downto 0) & Drigth; end if; end if; end process; S= 0 - przesuń w prawo S=1 - przesuń w lewo S=2 - wpis równoległy S=3 - wpis równoległy
24
Rejestr przesuwny: rotujący, logiczny, arytmetyczny
Mnożenie/dzielenie przez 2 Kopiowanie bity znaku przy dzieleniu w kodzie U2
25
Barrel Shifter (szybkie przesunięcie o dowolną liczbę bitów)
Mnożenie Dzielenie (kod U2 - uzupełnień do dwóch)
26
Barrel Shifter - wielopoziomowy
Każdy z n poziomów przesuwa o 0 lub 2i-bitów (i=0..(n-1)) bitów w ten sposób można przesunąć o dowolną liczbę bitów w zakresie od (0..2n-1)-bitów używając prostych multiplekserów 2:1.
27
Serializer: Parallel-In Serial-Out (PISO)
28
Serializer: PISO - VHDL
process(clk) begin if clk'event and clk1=‘1' then if load=‘1’ then Q <= D; else Q(N-1 downto 0)<= Q(N-2 downto 0) & Din; end if; end process; Qout<= Q(N-1);
29
SIPO (Serial-In Parallel-Out) (Deserializer)
process(clk) begin if clk'event and clk=‘1' then Q(N-1 downto 0)<= Q(N-2 downto 0) & Din; end if; end process;
30
SIPO (Clock Enable) – błędne użycie
Przykład taktowania co drugi takt zegara modułu SIPO i złego użycia bramki AND na sygnale zegarowym – powstaje wyścig!!!
31
SIPO (Clock Enable) – poprawne użycie
Przykład taktowania co drugi takt zegara SIPO – sygnał zegarowy jest wyjściem Q przerzutnika (Uwaga wyścig może powstać pomiędzy sygnałem Din a Clk2).
32
SIPO (CE - Clock Enable)
33
SISO (Serial-In Serial-Out)
34
Przesyłanie danych szeregowo SerDeser
Sposób 1 Sposób 2 PISO Clk SIPO D clk takt
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.