PUCY Kolos 2: Reloaded 1) Narysować schemat układu mikroprogramowalnego z licznikiem rozkazów. 2) Narysować schemat elementu ścieżki cyklicznej dla sygnału kombinacyjnego 3) Narysować schemat elementu ścieżki cyklicznej dla sygnału synchronicznego
4) Narysuj schemat układu konfigurującego ukkład FPGA w trybie pasywnym szeregowo 5) Narysuj schemat układu konfigurującego układ FPGA w trybie aktywnym szeregowo. 7) Automat analogiczny do tego na pierwszym kolokwium, tyle że do opisania w VHDL - automat synchroniczny licznik rewersyjny modulo 5 w NKB library ieee; use iee.std_logic_1164.all; use iee.std_logic_arith.all; entity licznik_rewersyjny is generic ( n:natural := 3 port ( WE: in std_ulogic_vector (n-1 downto 0 CLK, CLR, ENA, DIR: in std_ulogic; WY: out std_ulogic_vector (n-1 downto 0 end entity licznik_rewersyjny; architecture licznik of licznik_rewersyjny is e0: process (CK) is variable licz: unsigned (n-1 downto 0 if (CLR = '0') then licz := (others => '0' elsif rising_edge(ck) then if (ENA = '0') then licz := unsigned(we elsif (DIR = '0') then if (licz = '000') then licz := '100'; else licz := licz 1; else
if (licz = '100') then licz := '000'; else licz := licz + 1; WY <= std_ulogic_vector(licz end process e0; end architecture licznik; 8) Zaprojektować mikroprogramowany zespół funkcjonalny wyposażony w ścieżkę cykliczną i zawierający bloki funkcjonalne realizujące następujące operacje na liczbach w kodzie U2: CK Operacja x RA <= 0 rise rise x x x rise RA <= WE RA <= AF AF <= RA + WE AF <= RA - WE AF <= WE v RA RA <= SHL(RA,0) a) projekt układu - 3 punkty (schemat blokowy) b) mikroprogramowanie - 5 punktów (realizacja mikroprogramowania w bloku funkcjonalnym) c) język VHDL - 11 punktów (opis projektu) d) ścieżka cykliczna - 6 punktów (realizacja w VHDL) Struktura rozkazu ( razem 3 bity ) Kod operacji [3b] 2 1 0 Kody operacji: Operacja Przypisany kod RA <= 0 000 RA <= WE 001 RA <= AF 010 RA <= SHL(RA,0) 011 AF <= RA + WE 100 AF <= RA - WE 101 AF <= WE v RA 110
a) schemat układu WERSJA A c) library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity uklwyk is generic( n: natural := 8 port( WE: in std_logic_vector(n-1 downto 0 SEL, F: in std_logic_vector(1 downto 0 CLR, CLK: in std_logic; RA_W, AF_W: out std_logic_vector(n-1 downto 0) end entity; architecture wykonawczy of uklwyk is signal RA, AF, RAn: std_logic_vector(n-1 downto 0 with F select AF <= signed(we) + signed(ra) when "00", signed(we) - signed(ra) when "01", WE or RA when others; with SEL select RAn <= AF when "00", WE when "01", (RA(n-2 downto 0) & '0') when others; RA_W <= RA; AF_W <= AF; e0: process(clk, CLR) is if CLR = '0' then
RA <= (others => '0' elsif rising_edge(clk) then RA <= RAn; end process; end architecture; WERSJA B b) mikroprogramowanie WIDTH=3; DEPTH=16; ADDRESS_RADIX = HEX; DATA_RADIX = BIN; CONTENT BEGIN 0 : 000; 1 : 010; -- tutaj siekamy rozkazy END ; c) implementacja w VHDLu library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; library lpm; use lpm.lpm_components.all; entity mi_prog is generic( n : natural := 8; a : natural := 4 -- długość adresu port( CK, CLR : in std_logic; X : in std_logic_vector (n-1 downto 0 Y_RA, Y_AF : out std_logic_vector (n-1 downto 0) end entity mi_prog; architecture mi_prog_a of mi_prog is signal NEXT_ADDR : std_logic_vector(a-1 downto 0 signal COMMAND : std_logic_vector(2 downto 0 signal RA, AF : std_logic_vector (n-1 downto 0 RA_block: process(ck, CLR) is variable R : std_logic_vector (n-1 downto 0 if COMMAND = "000" then R := (others => '0' elsif COMMAND = "001" then R := X; elsif COMMAND = "010" then R := AF; elsif COMMAND = "011" then R := R(n-2 downto 0) & '0'; else R := R; if CLR = '0' then R := (others => '0' if rising_edge(ck) then RA <= R;
end process RA_block; AF_block: process(ck, CLR) is variable R : std_logic_vector (n-1 downto 0 if COMMAND = "100" then R := unsigned(ra) + unsigned(x elsif COMMAND = "101" then R := unsigned(ra)-unsigned(x elsif COMMAND = "110" then R := RA or X; else R := R; if CLR = '0' then R := (others => '0' if rising_edge(ck) then AF <= R; end process AF_block; ADDR_block: process (CK, CLR) is variable R : std_logic_vector(a-1 downto 0 if rising_edge(ck) then R := unsigned(r)+1; if CLR = '0' then R := (others => '0' NEXT_ADDR <= R; end process ADDR_block; Y_RA <= RA; Y_AF <= AF; rom : lpm_rom generic map (LPM_WIDTH=>3, LPM_WIDTHAD=>a, LPM_NUMWORDS=>16, LPM_FILE=>"MIKRO_PROGRAM.mif", LPM_ADDRESS_CONTROL=>"REGISTERED", LPM_OUTDATA=>"REGISTERED", LPM_HINT=>"UNUSED") port map (address => NEXT_ADDR, inclock => CK, outclock => CK, q => COMMAND end architecture mi_prog_a; WERSJA C b) mikroprogramowanie WORD 3 KOD.RA.0 EQU B#000 KOD.RA.WE EQU B#001 KOD.RA.AF EQU B#010 KOD.RA.SHL EQU B#011 KOD.AF.PLUS EQU B#100 KOD.AF.MINUS EQU B#101 KOD.AF.OR EQU B#110 RA.CLEAR DEF 2X, KOD.RA.0, 4V% RA.SET.WE DEF 2X, KOD.RA.WE, 4V% RA.SET.AF DEF 2X, KOD.RA.AF, 4V%
RA.SHL DEF 2X, KOD.RA.SHL, 4V% AF.DODAJ DEF 2X, KOD.AF.PLUS, 4V% AF.ODEJMIJ DEF 2X, KOD.AF.MINUS, 4V% AF.LUB DEF 2X, KOD.AF.OR, 4V% M00: RA.CLEAR M01: AF.DODAJ c) implementacja w VHDLu use iee.std_logic_1164.all; use iee.std_logic_arith.all; entity uklad is generic ( n:natural := 16 port ( WE: in std_ulogic_vector (n-1 downto 0 CLK, CLR, ENA, DIR: in std_ulogic; N, Z: out std_ulogic; KOD: in std_ulogic_vector (2 downto 0 WY_RA, WY_AF: out std_ulogic_vector (n-1 downto 0 end entity uklad; architecture uklad of uklad is signal ZERO: std_ulogic_vector (n-1 downto 0 BLOK_RA: proc_ra: process (CLK, CLR) is variable REG: unsigned (n-1 downto 0 if (CLR = '0' OR KOD == '000') then REG <= (others=>'0' elsif rising_edge(clk) then if (KOD == '001') then REG <= WE; elsif (KOD == '010') then REG <= AF; elsif (KOD == '011') then REG <= (RA (n-2 downto 0) & '0') RA <= REG; end; BLOK_AF: proc_af: process (CLK, CLR) is variable REG: unsigned (n-1 downto 0 if (CLR = '0') then REG <= (others=>'0' elsif rising_edge(clk) then if (KOD == '100') then REG <= unsigned(af)+unsigned(we elsif (KOD == '101') then REG<=unsigned(AF)-unsigned(WE elsif (KOD == '110') then REG<=unsigned(AF) or unsigned(we AF <= REG; end; end; end architekture uklad;