Rejestry przesuwne, sumatory Ernest Jamro Kat. Elektroniki AGH
Multiplekser Mux 2:1 Mux 4:1
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
Multiplekser na bramkach – postać ogólna VHDL Ai <= conv_integer(Sel); Y <= X(Ai); -- Out i In słowa kluczowe Mux 4:1
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.
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 + SD1 - multiplekser A + B= (A’B’)’ - prawo De Morgana, (Wired AND) Y= ( (S’D0)’ (SD1)’ )’
Demultiplekser
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
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
Incrementator: Example A=10112= 1110=0xB S=A+1= 11002=1210=0xC
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
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= 0001 (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
Add/Subtract Logic S<= A+B when Sub=‘0’ else A-B; Convert B to Two’s Complement when Sub=1
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 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 Overflow= CarryOutN xor CarryOutN-1 Subtract: 6-1= 5 0110 = 6 1111 = -1 0101 = 8 Subtract: -1-2= 1 1111 = -1 1110 = -2 1101 = -3 Subtract: -5-4= -9 1011 = -5 1100 = -4 0111= 7 Overflow 1 1 1 0 0 1 1 1 0 0 1 0 0 0 0
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)
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
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;
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;
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;
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;
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
Rejestr przesuwny w prawo lub lewo SLEFT=0 – przesuń w prawo SLEFT=1 – przesuń w lewo
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
Rejestr przesuwny: rotujący, logiczny, arytmetyczny Mnożenie/dzielenie przez 2 Kopiowanie bity znaku przy dzieleniu w kodzie U2
Barrel Shifter (szybkie przesunięcie o dowolną liczbę bitów) Mnożenie Dzielenie (kod U2 - uzupełnień do dwóch)
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.
Serializer: Parallel-In Serial-Out (PISO)
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);
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;
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!!!
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).
SIPO (CE - Clock Enable)
SISO (Serial-In Serial-Out)
Przesyłanie danych szeregowo SerDeser Sposób 1 Sposób 2 PISO Clk SIPO D clk takt