kroszkanorber Napisano 16 maja Udostępnij Napisano 16 maja witam Projekt: AGNES — 8‑bitowy procesor na FPGA (wersja poglądowa) Wątek prezentuje kompletną, działającą implementację procesora 8‑bitowego w VHDL. Model obejmuje architekturę jednostki wykonawczej, pamięci RAM/ROM, zestaw instrukcji oraz logikę sterującą. Procesor jest testowany na płytce PCB z układem Xilinx Spartan‑3 mojego autorstwa. Przedstawiona wersja pełni funkcję referencyjną — pokazuje poprawność struktury CPU i organizacji bloków. 1. Architektura pamięci ROM — 16 bit × 2048 Format słowa: 5 bit instrukcji + 11 bit adresu/danych. Tryby: INSADDR, ROMADDR, ROMDATA. RAM — 8 bit × 2048 Pamięć danych, zapis sterowany sygnałem RAMWE. 2. Cykl pracy procesora (4 takty) 00 — pobranie instrukcji z ROM 01 — pobranie danych z RAM 10 — wykonanie operacji 11 — zapis wyników / aktualizacja PC 3. Zestaw instrukcji (skrót) Transfer danych: MOVLB, MOVEB, MOVRB, MOVBR, MOVER, NOP Logika: ANDRB, IORRB, XORRB, COMR Arytmetyka: ADDRB, SUBRB, MULRB Rotacje: RRR, RLR, SWAPR Flagi: SETC, CLRC Skoki warunkowe: SKIPC, SKIPDC, SKIPZ, SKIPE, SKIPU, SKIPL Skoki: GOTO, CALL, ADDPC Przerwania: RETURN, RETLB, RETFIE RAM: SETR, CLRR 4. Jednostka wykonawcza (ALU) Obsługuje operacje logiczne, arytmetyczne, rotacje, flagi oraz zapis wyników. Wynik: 9 bitów (8 danych + CARRY). 5. Rejestry i sygnały B, R, PC, TOS, INTPC, flagi C/DC/Z, sygnały porównania REB/RUB/RLB, sygnały skoków SKIP*. 6. Obsługa przerwań Przerwanie zewnętrzne (INT_KBD), zapis adresu powrotu w ROM (od końca przestrzeni), powrót przez RETURN, RETLB, RETFIE. 7. Status projektu Wersja poglądowa — prezentuje działającą strukturę CPU: ROM → dekoder → ALU → RAM → PC, pełny cykl 4‑taktowy, skoki, przerwania, integracja pamięci. Wątek ma charakter referencyjny; kolejne wersje CPU będą rozwijane osobno. 8. Cel wątku Dokumentacja kompletnej, działającej architektury 8‑bitowego procesora w VHDL. library IEEE; use ieee.std_logic_1164.all; use ieee.std_logic_UNSIGNED.all; entity RAM is Port ( Clk : in STD_LOGIC; WE : in STD_LOGIC; DI : in STD_LOGIC_VECTOR (7 downto 0); ADDR : in STD_LOGIC_VECTOR (10 downto 0); DO : out STD_LOGIC_VECTOR (7 downto 0) ); end RAM; architecture Behavioral of RAM is type ram_type is array (0 to 2047) of std_logic_vector (7 downto 0); signal RAM: ram_type; begin process (Clk) begin if falling_edge (Clk) then if WE = '1' then RAM(conv_integer(ADDR)) <= DI; else DO <= RAM(conv_integer(ADDR)) ; end if; end if; end process; end Behavioral; ----------------------------------------------------------------------------------- -- -- ----------------------------------------------------------------------------------- -- -- pamięć ROM 16b x 2048 -- -- mapa pamięci ROM -- "SEL" + "INSADDR" = "iiiii" + "aaa aaaa aaaa" = pamięć ROM (16 bit) [5bit instrukcje|11bit adres instrukcji] -- "SEL" + "ROMADDR" = "iiiii" + "rrr rrrr rrrr" = pamięć ROM (16 bit) [5bit instrukcje|11bit adres pamięci RAM] -- "SEL" + "ROMDATA" = "iiiii" + "xxx bbbb bbbb" = pamięć ROM (16 bit) [5bit instrukcje|3bit nieużywane|8bit dane] -- -- licznik taktów kontrolera (4 takty na 1 istrukcję) -- Cnt = "00" <- pobieranie instrukcji z pamięci ROM -- Cnt = "01" <- pobieranie danych z pamięci RAM -- Cnt = "10" <- wykonanie instrukcji -- Cnt = "11" <- wykonanie instrukcji, zmiana zawartości licznika instrukcji, zapis danych do pamięci RAM|rejestru B|PORT_O -- ----------------------------------------------------------------------------------- -- -- instrukcje -- -- NOP "00000" -- instrukcja pusta -- MOVLB "00001" -- instrukcja kopiująca dane ROM do rejestru B -- MOVEB "00010" -- instrukcja kopiująca dane prortu zewnętrznego do rejestru B -- MOVRB "00011" -- instrukcja kopiująca dane RAM do rejestru B -- ANDRB "00100" -- instrukcja RAM and B wynik zapisywany w RAM pod tym samym adresem -- IORRB "00101" -- instrukcja RAM or B wynik zapisywany w RAM pod tym samym adresem -- XORRB "00110" -- instrukcja RAM xor B wynik zapisywany w RAM pod tym samym adresem -- COMR "00111" -- instrukcja not RAM wynik zapisywany w RAM pod tym samym adresem -- ADDRB "01000" -- instrukcja (CARRY & RAM) + B -- SUBRB "01001" -- instrukcja (CARRY & RAM) - B -- RRR "01010" -- instrukcja CARRY & RAM rotacja w prawo -- RLR "01011" -- instrukcja CARRY & RAM rotacja w lewo -- SWAPR "01100" -- instrukcja zamiane 4 bit starszych z młodszymi wynik zapisywany w RAM pod tym samym adresem -- MULRB "01101" -- instrukcja monożenie RAM i B wynik (7 downto 0) zapisywany w RAM pod tym samym adresem reszta w B -- SETC "01110" -- instrukcja ustawienie bitu CARY w stanie wysokim i przepisanie zawartości RAM bez zmian -- CLRC "01111" -- instrukcja ustawienie bitu CARY w stanie niskim i przepisanie zawartości RAM bez zmian -- RETLB "10000" -- instrukcja powrotu z przerwania programowego kopiująca dane ROM do rejestru B -- RETURN "10001" -- instrukcja powrotu z przerwania programowego -- RETFIE "10010" -- instrukcja powrotu z przerwania z zewnątrz -- MOVBE "10011" -- instrukcja kopiująca B lub RAM do portu zewnętrznego -- SKIPC "101000" -- instrukcja skoku warunkowego CARRY -- SKIPDC "101001" -- instrukcja skoku warunkowego DIGITAL CARRY -- SKIPZ "101001" -- instrukcja skoku warunkowego ZERO -- SKIPE "101010" -- instrukcja skoku warunkowego R = B -- SKIPU "101011" -- instrukcja skoku warunkowego R > B -- SKIPL "101100" -- instrukcja skoku warunkowego R < B -- GOTO "11000" -- instrukcja skoku do wybranego adresu w programie -- CALL "11001" -- instrukcja skoku do wybranego adresu w programie z zapisem adresu powrotu i zmianą licznika przerwań -- WEEN "11010" -- instrukcje dla urządzeń zewnętrznych (zakodowany sygnał WE dla 1 z 2048 adresów) -- ADDPC "11011" -- instrukcja skoku do tabeli zapisane w pamięci ROM (256 adresów) -- MOVBR "11100" -- instrukcja kopiująca rejestr B do pamięci RAM -- MOVER "11101" -- instrukcja kopiująca port zewnętrzny do pamięci RAM -- SETR "11110" -- instrukcja ustawiająca wszystkie bity w wybranej komórce RAM na 1 -- CLRR "11111" -- instrukcja ustawiająca wszystkie bity w wybranej komórce RAM na 0 -- ------------------------------------------------------------------------- library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity CORE2 is Port ( Clk : in STD_LOGIC; -- 100 MHz Reset : in STD_LOGIC; -- reset aktywny = 0 PROG_WE : in STD_LOGIC; -- sygnał zapisu pamięci programu ROM_WE : in STD_LOGIC; -- sygnał dla programatora zewnętrznego ROM_DI : in STD_LOGIC_VECTOR (15 downto 0); -- dane wysyłane do pamięci ROM ROM_ADDR : in STD_LOGIC_VECTOR (10 downto 0); -- adres pamięci ROM INT_KBD : in STD_LOGIC; -- sygnał przerwania od klawiatury PORT_I : in STD_LOGIC_VECTOR (7 downto 0); -- port zewnętrzny wejściowy PORT_O : out STD_LOGIC_VECTOR (7 downto 0); -- port zewnętrzny wyjściowy INSTR : out STD_LOGIC_VECTOR (10 downto 0) -- instrukcje procesora dla urządzeń zewnętrzych ); end CORE2; architecture Behavioral of CORE2 is signal Cnt : std_logic_vector(1 downto 0); --licznik procesów instrukcji signal Sel : std_logic_vector(4 downto 0); --dekoder instrukcji signal SkipSel: std_logic_vector(5 downto 0); --dekoder instrukcji skoków warunkowych signal PROD : std_logic_vector(15 downto 0);--wynik mnożenia signal PRODL : std_logic_vector(8 downto 0); --wynik mnożenia rejestr pomocniczy signal ADNRB : std_logic_vector(8 downto 0); --wynik AND signal IORRB : std_logic_vector(8 downto 0); --wynik OR signal XORRB : std_logic_vector(8 downto 0); --wynik XOR signal COMR : std_logic_vector(8 downto 0); --wynik NEGACJI BITÓW signal ADDRB : std_logic_vector(8 downto 0); --wynik SUMY signal SUBRB : std_logic_vector(8 downto 0); --wynik RÓŻNICY signal RRR : std_logic_vector(8 downto 0); --wynik PRZESUNIĘCIE W PRAWO + CARRY BIT signal RLR : std_logic_vector(8 downto 0); --wynik PRZESUNIĘCIE W LEWO + CARRY BIT signal SWAPR : std_logic_vector(8 downto 0); --wynik ZAMIANA 4 BITY MŁODSZE Z 4 BITY STARSZE signal SETC : std_logic_vector(8 downto 0); --wynik AND signal CLRC : std_logic_vector(8 downto 0); --wynik AND signal MOVBR : std_logic_vector(8 downto 0); --wynik AND signal MOVER : std_logic_vector(8 downto 0); --wynik AND signal SETR : std_logic_vector(8 downto 0); --wynik AND signal CLRR : std_logic_vector(8 downto 0); --wynik AND signal B : std_logic_vector(7 downto 0); --rejestr B signal R : std_logic_vector(7 downto 0); --rejestr R signal Q : std_logic_vector(8 downto 0); --wynik operacji jednostki ALU signal C : std_logic; --CARRY bit signal CQ : std_logic; signal DC : std_logic; --DIGITAL CARRY bit signal DCQ : std_logic; signal Z : std_logic; --ZERO bit signal REB : std_logic; --R equal B bit signal RUB : std_logic; --R upper B bit signal RLB : std_logic; --R lower B bit signal SKIPC : std_logic; signal SKIPDC: std_logic; signal SKIPZ : std_logic; signal SKIPE : std_logic; signal SKIPU : std_logic; signal SKIPL : std_logic; signal SKIP : std_logic; signal ROMADDR : std_logic_vector(10 downto 0); --adres wysyłany do pamięci ROM signal ROMDI : std_logic_vector(15 downto 0); --dane wysyłane do pamięci ROM signal ROMDO : std_logic_vector(15 downto 0); --dane odczytywane z pamięci ROM signal ROMWE : std_logic; --sygnał zapisu dla pamięci ROM signal RAMWE : std_logic; --sygnał zapisu dla pamięci RAM signal RAMADDR : std_logic_vector(10 downto 0); --adres pamięci RAM signal RAMDI : std_logic_vector(7 downto 0); --dane wysyłane do pamięci RAM signal RAMDO : std_logic_vector(7 downto 0); --dane odczytywane z pamięci RAM signal PC : std_logic_vector(10 downto 0); --licznik programu signal TOS : std_logic_vector(10 downto 0); --adres stosu przerwań signal INTPC : std_logic_vector(10 downto 0); --adres powrotu z przerwania zewnętrznego signal INTEN : std_logic; --sygnał zezwolenia dla przerwania z zewnątrz COMPONENT RAM PORT( Clk : IN std_logic; WE : IN std_logic; DI : IN std_logic_vector(7 downto 0); ADDR : IN std_logic_vector(10 downto 0); DO : OUT std_logic_vector(7 downto 0) ); END COMPONENT; COMPONENT ROM PORT( Clk : IN std_logic; WE : IN std_logic; DI : IN std_logic_vector(15 downto 0); Cnt : IN std_logic_vector(1 downto 0); ADDR : IN std_logic_vector(10 downto 0); PC : IN std_logic_vector(10 downto 0); DO : OUT std_logic_vector(15 downto 0) ); END COMPONENT; begin ------------------------------------------------------------------------- --licznik taktów instrukcji (4 takty na 1 instrukcję) process(Clk, Reset, Cnt, ROM_WE) begin if ((Reset = '0') or (ROM_WE = '1')) then Cnt <= (others => '0'); else if falling_edge (Clk) then Cnt <= Cnt + 1; end if; end if; end process; ------------------------------------------------------------------------- --dekoder poleceń dla urządzeń zewnętrznych INSTR <= ROMDO(10 downto 0) when ((Sel = "11010") and (Cnt = "11")) else (others => '0'); ------------------------------------------------------------------------- --jednostka arytmetyczno logiczna ADNRB <= ('0' & (R and B)) when (Sel = "00100") else (others => '0'); IORRB <= ('0' & (R or B)) when (Sel = "00101") else (others => '0'); XORRB <= ('0' & (R xor B)) when (Sel = "00110") else (others => '0'); COMR <= ('0' & (not R)) when (Sel = "00111") else (others => '0'); ADDRB <= ((C & (R)) + ('0' & (B))) when (Sel = "01000") else (others => '0'); SUBRB <= ((C & (R)) - ('0' & (B))) when (Sel = "01001") else (others => '0'); RRR <= (R(0) & C & R(7 downto 1)) when (Sel = "01010") else (others => '0'); RLR <= (R(7 downto 0) & C) when (Sel = "01011") else (others => '0'); SWAPR <= ('0' & R(3 downto 0) & R(7 downto 4)) when (Sel = "01100") else (others => '0'); PROD <= (R(7 downto 0) * B(7 downto 0)) when (Sel = "01101") else (others => '0'); SETC <= ('1' & R) when (Sel = "01110") else (others => '0'); CLRC <= ('0' & R) when (Sel = "01111") else (others => '0'); MOVBR <= ('0' & B) when (Sel = "11100") else (others => '0'); MOVER <= ('0' & PORT_I) when (Sel = "11101") else (others => '0'); SETR <= ('0' & "11111111") when (Sel = "11110") else (others => '0'); CLRR <= ('0' & "00000000") when (Sel = "11111") else (others => '0'); PRODL <= ('0' & PROD(7 downto 0)); --przypisanie wyników działań do wyjścia Q Q <= ADNRB or IORRB or XORRB or COMR or ADDRB or SUBRB or RRR or RLR or SWAPR or SETC or CLRC or PRODL or MOVBR or MOVER or SETR or CLRR; ------------------------------------------------------------------------- --zapis danych do rejestru B process(Clk, Reset, Sel, Cnt, PORT_I, R, ROMDO, PROD, Sel) begin if Reset = '0' then B <= (others => '0'); else if falling_edge (Clk) then if (Cnt = "11") then if (Sel = "00001") --MOVLB or (Sel = "10000") then --RETLB kopiowanie stałej do rejestru B B <= ROMDO(7 downto 0) ; elsif (Sel = "00010") then --MOVEB kopiowanie danych z portu EXTI do rejetru B B <= PORT_I ; elsif (Sel = "00011") then --MOVRB kopiowanie zawartości pamięci RAM do rejestru B B <= R ; elsif (Sel = "01101") then --MULRB kopiowanie PRODH do rejestru B B <= PROD(15 downto 8) ; end if; end if; end if; end if; end process; ------------------------------------------------------------------------- -- zapis danych z rejestru B lub RAM do portu EXTO. process(Clk, Reset, Cnt, B, Sel, R) begin if Reset = '0' then PORT_O <= (others => '0'); else if falling_edge (Clk) then if (Cnt = "11") then if (Sel = "10011") then PORT_O <= (B or R); end if; end if; end if; end if; end process; ------------------------------------------------------------------------- --dekodery segnałów skoków warunkowych REB <= '1' when (R = B) else '0'; RUB <= '1' when (R > B) else '0'; RLB <= '1' when (R < B) else '0'; Z <= '1' when (R(7 downto 0) = 0) else '0'; DCQ <= '1' when (R(3 downto 0) > 9) else '0'; CQ <= Q(8); --zapis sygnałów skoków warunkowych process(Clk, Reset, CQ, RAMWE, Sel) begin if Reset = '0' then C <= '0'; DC <= '0'; else if falling_edge (Clk) then if (RAMWE = '1') then if ((Sel(4 downto 2) = "010") or (Sel(4 downto 1) = "0111")) then C <= CQ; --wynik dodawania, odejmowania, przesunięcie w lewo i prawo end if; if (Sel(4 downto 1) = "0100") then DC <= DCQ; --wynik dodawania, odejmowania end if; end if; end if; end if; end process; --dekoder skoku warunkowego SKIPC <= '1' when ((C = '1') and (SkipSel = "101000")) else '0'; SKIPDC <= '1' when ((DC = '1') and (SkipSel = "101001")) else '0'; SKIPZ <= '1' when ((Z = '1') and (SkipSel = "101010")) else '0'; SKIPE <= '1' when ((REB = '1') and (SkipSel = "101011")) else '0'; SKIPU <= '1' when ((RUB = '1') and (SkipSel = "101100")) else '0'; SKIPL <= '1' when ((RLB = '1') and (SkipSel = "101101")) else '0'; SKIP <= SKIPC or SKIPDC or SKIPZ or SKIPE or SKIPU or SKIPL; ------------------------------------------------------------------------- --adresy powrotu z przrewań zapisywane są w pamięci ROM --zaczynają się od końca adresowanej pamięci tzn. X"7FF", a zapis adresowany jest licznikiem TOS --licznik TOS jest zmniejszany o 1 w instrukcji CALL (przykład [ przed X"7FF" | po X"7FF" - 1 = X"7FE" ] ) --licznik TOS jest zwiększany o 1 w instrukcji RETURN, RETLB (przykład [ przed X"7F2" | po X"7F2" + 1 = X"7F3" ] ) --licznik programu z instrukcjami skoków, przerwań process(Clk, Reset, Cnt, SKIP, ROMDO, Sel, INT_KBD, R, ROM_WE, TOS) begin if ((Reset = '0') or (ROM_WE = '1'))then PC <= (others => '0'); TOS <= (others => '1'); -- adres powrotu z pierwszego przerwania INTPC <= (others => '0'); INTEN <= '0'; else if falling_edge (Clk) then if (Cnt = "01") then if ((Sel = "10001") or (Sel = "10000")) then -- RETURN, RETLB PC <= TOS; -- adres TOS przypisany do licznika PC TOS <= TOS + 1; -- w celu odczytu adresu przed przerwaniem end if; end if; if (Cnt = "11") then if ((INT_KBD = '1') and (INTEN = '0')) then -- INTERUPT PC <= "00000010000"; -- skok do adresu "10000" INTPC <= PC; INTEN <= '1'; elsif (SKIP = '1') then -- SKIP if (ROMDO(7) = '1') then PC <= PC - ROMDO(6 downto 0); else PC <= PC + ROMDO(6 downto 0); end if; elsif (Sel = "11000") then -- GOTO PC <= ROMDO(10 downto 0); elsif (Sel = "11001") then -- CALL PC <= ROMDO(10 downto 0); TOS <= TOS - 1; -- zmniejszenie adresu licznika przerwań po odczycie instrukcji elsif (Sel = "11011") then -- ADDPC PC <= PC + (ROMDO(10 downto 8) & B); -- tablica w pamięci ROM o długości 256 adresów elsif ((Sel = "10010") and (INTEN = '1')) then -- RETFIE PC <= INTPC; INTEN <= '0'; else PC <= PC + 1; end if; end if; end if; end if; end process; ------------------------------------------------------------------------- ROMADDR <= ROM_ADDR when (ROM_WE = '1') else TOS; --GOTO + PC + 1 zapis instrukcji powrotu z przerwania z adresem następnego polecenia ROMDI <= ROM_DI when (ROM_WE = '1') else ("11000" & (PC + 1)); --CALL dekoder zapisu adresu powrotu z przerwania w pamięci ROM ROMWE <= '1' when ((Sel = "11001") and (Cnt = "10")) else (ROM_WE or PROG_WE); --przypisanie instrukcji zapisanych w pamięci ROM do wskaźnika SEL Sel <= ROMDO(15 downto 11); SkipSel <= ROMDO(15 downto 10); Inst_ROM: ROM PORT MAP( Clk => Clk, -- sygnał taktujący WE => ROMWE, -- sygnał zezwolenia na zapis do pamięci ROM DI => ROMDI, -- dane zapisywane w pamięci ROM Cnt => Cnt, -- zegar systemowy kontrolera ADDR => ROMADDR, -- adres zapisu danych do pamięci ROM PC => PC, -- adres odczytu danych z pamięci ROM DO => ROMDO -- dane odczytywane z pamięci ROM ); ------------------------------------------------------------------------- --dekoder sygnału zapisu dla pamięci RAM RAMWE <= Cnt(0) and Cnt(1) and (((not Sel(4)) and (Sel(3) or Sel(2))) or (Sel(4) and Sel(3) and Sel(2))); --dane do zapisania w pamięci RAM (wynik ALU) RAMDI <= Q(7 downto 0); --adres zapisu i odczytu pamięci RAM RAMADDR <= ROMDO(10 downto 0); -- zapis danych z pamięci RAM do rejestru R process (Clk, RAMDO, Cnt) begin if falling_edge (Clk) then if (Cnt = "10") then R <= RAMDO; end if; end if; end process; Inst_RAM: RAM PORT MAP( Clk => Clk, WE => RAMWE, DI => RAMDI, ADDR => RAMADDR, DO => RAMDO ); end Behavioral; library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity ROM is Port ( Clk : in STD_LOGIC; WE : in STD_LOGIC; DI : in STD_LOGIC_VECTOR (15 downto 0); Cnt : in STD_LOGIC_VECTOR (1 downto 0); ADDR : in STD_LOGIC_VECTOR (10 downto 0); -- Adres zapisu PC : in STD_LOGIC_VECTOR (10 downto 0); -- Adres odczytu DO : out STD_LOGIC_VECTOR (15 downto 0) ); end ROM; architecture Behavioral of ROM is type ram_type is array (0 to 2047) of std_logic_vector (15 downto 0); signal ROM0: ram_type; signal EN : std_logic; begin EN <= '1' when Cnt = "00" else '0'; process (CLK) begin if falling_edge (Clk) then if WE = '1' then ROM0(conv_integer(ADDR)) <= DI; end if; if EN = '1' then DO <= ROM0(conv_integer(PC)) ; end if; end if; end process; end Behavioral;
Popularny post kroszkanorber 18 maja Autor tematu Popularny post Udostępnij 18 maja (edytowany) Dopisałem prosty kompilator w code::blocks w języku cpp, który eneruje kod dla pamięci rom. Kompilator zmienia instrukcje assembler w kod maszynowy jako plik pełny kod vhdl gotowy do wklejenia pod nazwą "ROM". Kompilator ma prosty debuger: wykrywa nazwy niezadeklarowane i zgłasza błąd w pliku BIN. Generuje informacje o przerwaniach, użytej pamięci i zmiennych. Przykład kodu asm dla procesora w wersji poglądowej napisany w notatniku: Przykład zapisu do folderu: Plik exe otwiera okno dialogowe, wczytuje ścieżkę, nazwę pilku który otwieramy do kompilacji. Po naciśnięciu przycisku otwórz zostanie wykonany kod generujący plik vhdl który zostanie zapisany w tym samym folderze z tą samą nazwą o rozszerzeniu bin: Plik bin zawiera wygenerowany kod vhdl który można skopiować do kodu ( ROM) w celu zainicjowania pamięci: -- Zrodlo: C:\projekt\przykład.asm library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity ROM is Port ( Clk : in STD_LOGIC; WE : in STD_LOGIC; DI : in STD_LOGIC_VECTOR (15 downto 0); Cnt : in STD_LOGIC_VECTOR (1 downto 0); TOS : in STD_LOGIC_VECTOR (10 downto 0); PC : in STD_LOGIC_VECTOR (10 downto 0); DO : out STD_LOGIC_VECTOR (15 downto 0)); end ROM; architecture Behavioral of ROM is type rom_type is array (0 to 2047) of std_logic_vector (15 downto 0); signal ROM: rom_type := ( -- definicje RAM = 23 -- adresy przerwan 0 = 0 -- adresy przerwan PRZERWANIE1 = 1 -- adresy przerwan 0 = 1 "0000000000000000", -- ADRES 0000 | NOP 0 "0000100000100001", -- ADRES 0001 | MOVLB 33 "1110000000010111", -- ADRES 0002 | MOVBR RAM "0000100001010101", -- ADRES 0003 | MOVLB B'10101010' "0000100011111111", -- ADRES 0004 | MOVLB H'FF' "1100000000000001", -- ADRES 0005 | GOTO PRZERWANIE1 "0000000000000000", -- ADRES 0006 "0000000000000000", -- ADRES 0007 "0000000000000000", -- ADRES 0008 "0000000000000000", -- ADRES 0009 "0000000000000000", -- ADRES 0010 "0000000000000000", -- ADRES 0011 "0000000000000000", -- ADRES 0012 "0000000000000000", -- ADRES 0013 "0000000000000000", -- ADRES 0014 "0000000000000000", -- ADRES 0015 "0000000000000000", -- ADRES 0016 "0000000000000000", -- ADRES 0017 "0000000000000000", -- ADRES 0018 "0000000000000000", -- ADRES 0019 "0000000000000000", -- ADRES 0020 "0000000000000000", -- ADRES 0021 "0000000000000000", -- ADRES 0022 "0000000000000000", -- ADRES 0023 "0000000000000000", -- ADRES 0024 "0000000000000000", -- ADRES 0025 "0000000000000000", -- ADRES 0026 "0000000000000000", -- ADRES 0027 "0000000000000000", -- ADRES 0028 "0000000000000000", -- ADRES 0029 "0000000000000000", -- ADRES 0030 "0000000000000000", -- ADRES 0031 "0000000000000000", -- ADRES 0032 "0000000000000000", -- ADRES 0033 "0000000000000000", -- ADRES 0034 "0000000000000000", -- ADRES 0035 "0000000000000000", -- ADRES 0036 "0000000000000000", -- ADRES 0037 "0000000000000000", -- ADRES 0038 "0000000000000000", -- ADRES 0039 "0000000000000000", -- ADRES 0040 "0000000000000000", -- ADRES 0041 "0000000000000000", -- ADRES 0042 "0000000000000000", -- ADRES 0043 "0000000000000000", -- ADRES 0044 "0000000000000000", -- ADRES 0045 "0000000000000000", -- ADRES 0046 "0000000000000000", -- ADRES 0047 "0000000000000000", -- ADRES 0048 "0000000000000000", -- ADRES 0049 "0000000000000000", -- ADRES 0050 "0000000000000000", -- ADRES 0051 "0000000000000000", -- ADRES 0052 "0000000000000000", -- ADRES 0053 "0000000000000000", -- ADRES 0054 "0000000000000000", -- ADRES 0055 "0000000000000000", -- ADRES 0056 "0000000000000000", -- ADRES 0057 "0000000000000000", -- ADRES 0058 "0000000000000000", -- ADRES 0059 "0000000000000000", -- ADRES 0060 "0000000000000000", -- ADRES 0061 "0000000000000000", -- ADRES 0062 "0000000000000000", -- ADRES 0063 "0000000000000000", -- ADRES 0064 "0000000000000000", -- ADRES 0065 "0000000000000000", -- ADRES 0066 "0000000000000000", -- ADRES 0067 "0000000000000000", -- ADRES 0068 "0000000000000000", -- ADRES 0069 "0000000000000000", -- ADRES 0070 "0000000000000000", -- ADRES 0071 "0000000000000000", -- ADRES 0072 "0000000000000000", -- ADRES 0073 "0000000000000000", -- ADRES 0074 "0000000000000000", -- ADRES 0075 "0000000000000000", -- ADRES 0076 "0000000000000000", -- ADRES 0077 "0000000000000000", -- ADRES 0078 "0000000000000000", -- ADRES 0079 "0000000000000000", -- ADRES 0080 "0000000000000000", -- ADRES 0081 "0000000000000000", -- ADRES 0082 "0000000000000000", -- ADRES 0083 "0000000000000000", -- ADRES 0084 "0000000000000000", -- ADRES 0085 "0000000000000000", -- ADRES 0086 "0000000000000000", -- ADRES 0087 "0000000000000000", -- ADRES 0088 "0000000000000000", -- ADRES 0089 "0000000000000000", -- ADRES 0090 "0000000000000000", -- ADRES 0091 "0000000000000000", -- ADRES 0092 "0000000000000000", -- ADRES 0093 "0000000000000000", -- ADRES 0094 "0000000000000000", -- ADRES 0095 "0000000000000000", -- ADRES 0096 "0000000000000000", -- ADRES 0097 "0000000000000000", -- ADRES 0098 "0000000000000000", -- ADRES 0099 "0000000000000000", -- ADRES 0100 "0000000000000000", -- ADRES 0101 "0000000000000000", -- ADRES 0102 "0000000000000000", -- ADRES 0103 "0000000000000000", -- ADRES 0104 "0000000000000000", -- ADRES 0105 "0000000000000000", -- ADRES 0106 "0000000000000000", -- ADRES 0107 "0000000000000000", -- ADRES 0108 "0000000000000000", -- ADRES 0109 "0000000000000000", -- ADRES 0110 "0000000000000000", -- ADRES 0111 "0000000000000000", -- ADRES 0112 "0000000000000000", -- ADRES 0113 "0000000000000000", -- ADRES 0114 "0000000000000000", -- ADRES 0115 "0000000000000000", -- ADRES 0116 "0000000000000000", -- ADRES 0117 "0000000000000000", -- ADRES 0118 "0000000000000000", -- ADRES 0119 "0000000000000000", -- ADRES 0120 "0000000000000000", -- ADRES 0121 "0000000000000000", -- ADRES 0122 "0000000000000000", -- ADRES 0123 "0000000000000000", -- ADRES 0124 "0000000000000000", -- ADRES 0125 "0000000000000000", -- ADRES 0126 "0000000000000000", -- ADRES 0127 "0000000000000000", -- ADRES 0128 "0000000000000000", -- ADRES 0129 "0000000000000000", -- ADRES 0130 "0000000000000000", -- ADRES 0131 "0000000000000000", -- ADRES 0132 "0000000000000000", -- ADRES 0133 "0000000000000000", -- ADRES 0134 "0000000000000000", -- ADRES 0135 "0000000000000000", -- ADRES 0136 "0000000000000000", -- ADRES 0137 "0000000000000000", -- ADRES 0138 "0000000000000000", -- ADRES 0139 "0000000000000000", -- ADRES 0140 "0000000000000000", -- ADRES 0141 "0000000000000000", -- ADRES 0142 "0000000000000000", -- ADRES 0143 "0000000000000000", -- ADRES 0144 "0000000000000000", -- ADRES 0145 "0000000000000000", -- ADRES 0146 "0000000000000000", -- ADRES 0147 "0000000000000000", -- ADRES 0148 "0000000000000000", -- ADRES 0149 "0000000000000000", -- ADRES 0150 "0000000000000000", -- ADRES 0151 "0000000000000000", -- ADRES 0152 "0000000000000000", -- ADRES 0153 "0000000000000000", -- ADRES 0154 "0000000000000000", -- ADRES 0155 "0000000000000000", -- ADRES 0156 "0000000000000000", -- ADRES 0157 "0000000000000000", -- ADRES 0158 "0000000000000000", -- ADRES 0159 "0000000000000000", -- ADRES 0160 "0000000000000000", -- ADRES 0161 "0000000000000000", -- ADRES 0162 "0000000000000000", -- ADRES 0163 "0000000000000000", -- ADRES 0164 "0000000000000000", -- ADRES 0165 "0000000000000000", -- ADRES 0166 "0000000000000000", -- ADRES 0167 "0000000000000000", -- ADRES 0168 "0000000000000000", -- ADRES 0169 "0000000000000000", -- ADRES 0170 "0000000000000000", -- ADRES 0171 "0000000000000000", -- ADRES 0172 "0000000000000000", -- ADRES 0173 "0000000000000000", -- ADRES 0174 "0000000000000000", -- ADRES 0175 "0000000000000000", -- ADRES 0176 "0000000000000000", -- ADRES 0177 "0000000000000000", -- ADRES 0178 "0000000000000000", -- ADRES 0179 "0000000000000000", -- ADRES 0180 "0000000000000000", -- ADRES 0181 "0000000000000000", -- ADRES 0182 "0000000000000000", -- ADRES 0183 "0000000000000000", -- ADRES 0184 "0000000000000000", -- ADRES 0185 "0000000000000000", -- ADRES 0186 "0000000000000000", -- ADRES 0187 "0000000000000000", -- ADRES 0188 "0000000000000000", -- ADRES 0189 "0000000000000000", -- ADRES 0190 "0000000000000000", -- ADRES 0191 "0000000000000000", -- ADRES 0192 "0000000000000000", -- ADRES 0193 "0000000000000000", -- ADRES 0194 "0000000000000000", -- ADRES 0195 "0000000000000000", -- ADRES 0196 "0000000000000000", -- ADRES 0197 "0000000000000000", -- ADRES 0198 "0000000000000000", -- ADRES 0199 "0000000000000000", -- ADRES 0200 "0000000000000000", -- ADRES 0201 "0000000000000000", -- ADRES 0202 "0000000000000000", -- ADRES 0203 "0000000000000000", -- ADRES 0204 "0000000000000000", -- ADRES 0205 "0000000000000000", -- ADRES 0206 "0000000000000000", -- ADRES 0207 "0000000000000000", -- ADRES 0208 "0000000000000000", -- ADRES 0209 "0000000000000000", -- ADRES 0210 "0000000000000000", -- ADRES 0211 "0000000000000000", -- ADRES 0212 "0000000000000000", -- ADRES 0213 "0000000000000000", -- ADRES 0214 "0000000000000000", -- ADRES 0215 "0000000000000000", -- ADRES 0216 "0000000000000000", -- ADRES 0217 "0000000000000000", -- ADRES 0218 "0000000000000000", -- ADRES 0219 "0000000000000000", -- ADRES 0220 "0000000000000000", -- ADRES 0221 "0000000000000000", -- ADRES 0222 "0000000000000000", -- ADRES 0223 "0000000000000000", -- ADRES 0224 "0000000000000000", -- ADRES 0225 "0000000000000000", -- ADRES 0226 "0000000000000000", -- ADRES 0227 "0000000000000000", -- ADRES 0228 "0000000000000000", -- ADRES 0229 "0000000000000000", -- ADRES 0230 "0000000000000000", -- ADRES 0231 "0000000000000000", -- ADRES 0232 "0000000000000000", -- ADRES 0233 "0000000000000000", -- ADRES 0234 "0000000000000000", -- ADRES 0235 "0000000000000000", -- ADRES 0236 "0000000000000000", -- ADRES 0237 "0000000000000000", -- ADRES 0238 "0000000000000000", -- ADRES 0239 "0000000000000000", -- ADRES 0240 "0000000000000000", -- ADRES 0241 "0000000000000000", -- ADRES 0242 "0000000000000000", -- ADRES 0243 "0000000000000000", -- ADRES 0244 "0000000000000000", -- ADRES 0245 "0000000000000000", -- ADRES 0246 "0000000000000000", -- ADRES 0247 "0000000000000000", -- ADRES 0248 "0000000000000000", -- ADRES 0249 "0000000000000000", -- ADRES 0250 "0000000000000000", -- ADRES 0251 "0000000000000000", -- ADRES 0252 "0000000000000000", -- ADRES 0253 "0000000000000000", -- ADRES 0254 "0000000000000000", -- ADRES 0255 "0000000000000000", -- ADRES 0256 "0000000000000000", -- ADRES 0257 "0000000000000000", -- ADRES 0258 "0000000000000000", -- ADRES 0259 "0000000000000000", -- ADRES 0260 "0000000000000000", -- ADRES 0261 "0000000000000000", -- ADRES 0262 "0000000000000000", -- ADRES 0263 "0000000000000000", -- ADRES 0264 "0000000000000000", -- ADRES 0265 "0000000000000000", -- ADRES 0266 "0000000000000000", -- ADRES 0267 "0000000000000000", -- ADRES 0268 "0000000000000000", -- ADRES 0269 "0000000000000000", -- ADRES 0270 "0000000000000000", -- ADRES 0271 "0000000000000000", -- ADRES 0272 "0000000000000000", -- ADRES 0273 "0000000000000000", -- ADRES 0274 "0000000000000000", -- ADRES 0275 "0000000000000000", -- ADRES 0276 "0000000000000000", -- ADRES 0277 "0000000000000000", -- ADRES 0278 "0000000000000000", -- ADRES 0279 "0000000000000000", -- ADRES 0280 "0000000000000000", -- ADRES 0281 "0000000000000000", -- ADRES 0282 "0000000000000000", -- ADRES 0283 "0000000000000000", -- ADRES 0284 "0000000000000000", -- ADRES 0285 "0000000000000000", -- ADRES 0286 "0000000000000000", -- ADRES 0287 "0000000000000000", -- ADRES 0288 "0000000000000000", -- ADRES 0289 "0000000000000000", -- ADRES 0290 "0000000000000000", -- ADRES 0291 "0000000000000000", -- ADRES 0292 "0000000000000000", -- ADRES 0293 "0000000000000000", -- ADRES 0294 "0000000000000000", -- ADRES 0295 "0000000000000000", -- ADRES 0296 "0000000000000000", -- ADRES 0297 "0000000000000000", -- ADRES 0298 "0000000000000000", -- ADRES 0299 "0000000000000000", -- ADRES 0300 "0000000000000000", -- ADRES 0301 "0000000000000000", -- ADRES 0302 "0000000000000000", -- ADRES 0303 "0000000000000000", -- ADRES 0304 "0000000000000000", -- ADRES 0305 "0000000000000000", -- ADRES 0306 "0000000000000000", -- ADRES 0307 "0000000000000000", -- ADRES 0308 "0000000000000000", -- ADRES 0309 "0000000000000000", -- ADRES 0310 "0000000000000000", -- ADRES 0311 "0000000000000000", -- ADRES 0312 "0000000000000000", -- ADRES 0313 "0000000000000000", -- ADRES 0314 "0000000000000000", -- ADRES 0315 "0000000000000000", -- ADRES 0316 "0000000000000000", -- ADRES 0317 "0000000000000000", -- ADRES 0318 "0000000000000000", -- ADRES 0319 "0000000000000000", -- ADRES 0320 "0000000000000000", -- ADRES 0321 "0000000000000000", -- ADRES 0322 "0000000000000000", -- ADRES 0323 "0000000000000000", -- ADRES 0324 "0000000000000000", -- ADRES 0325 "0000000000000000", -- ADRES 0326 "0000000000000000", -- ADRES 0327 "0000000000000000", -- ADRES 0328 "0000000000000000", -- ADRES 0329 "0000000000000000", -- ADRES 0330 "0000000000000000", -- ADRES 0331 "0000000000000000", -- ADRES 0332 "0000000000000000", -- ADRES 0333 "0000000000000000", -- ADRES 0334 "0000000000000000", -- ADRES 0335 "0000000000000000", -- ADRES 0336 "0000000000000000", -- ADRES 0337 "0000000000000000", -- ADRES 0338 "0000000000000000", -- ADRES 0339 "0000000000000000", -- ADRES 0340 "0000000000000000", -- ADRES 0341 "0000000000000000", -- ADRES 0342 "0000000000000000", -- ADRES 0343 "0000000000000000", -- ADRES 0344 "0000000000000000", -- ADRES 0345 "0000000000000000", -- ADRES 0346 "0000000000000000", -- ADRES 0347 "0000000000000000", -- ADRES 0348 "0000000000000000", -- ADRES 0349 "0000000000000000", -- ADRES 0350 "0000000000000000", -- ADRES 0351 "0000000000000000", -- ADRES 0352 "0000000000000000", -- ADRES 0353 "0000000000000000", -- ADRES 0354 "0000000000000000", -- ADRES 0355 "0000000000000000", -- ADRES 0356 "0000000000000000", -- ADRES 0357 "0000000000000000", -- ADRES 0358 "0000000000000000", -- ADRES 0359 "0000000000000000", -- ADRES 0360 "0000000000000000", -- ADRES 0361 "0000000000000000", -- ADRES 0362 "0000000000000000", -- ADRES 0363 "0000000000000000", -- ADRES 0364 "0000000000000000", -- ADRES 0365 "0000000000000000", -- ADRES 0366 "0000000000000000", -- ADRES 0367 "0000000000000000", -- ADRES 0368 "0000000000000000", -- ADRES 0369 "0000000000000000", -- ADRES 0370 "0000000000000000", -- ADRES 0371 "0000000000000000", -- ADRES 0372 "0000000000000000", -- ADRES 0373 "0000000000000000", -- ADRES 0374 "0000000000000000", -- ADRES 0375 "0000000000000000", -- ADRES 0376 "0000000000000000", -- ADRES 0377 "0000000000000000", -- ADRES 0378 "0000000000000000", -- ADRES 0379 "0000000000000000", -- ADRES 0380 "0000000000000000", -- ADRES 0381 "0000000000000000", -- ADRES 0382 "0000000000000000", -- ADRES 0383 "0000000000000000", -- ADRES 0384 "0000000000000000", -- ADRES 0385 "0000000000000000", -- ADRES 0386 "0000000000000000", -- ADRES 0387 "0000000000000000", -- ADRES 0388 "0000000000000000", -- ADRES 0389 "0000000000000000", -- ADRES 0390 "0000000000000000", -- ADRES 0391 "0000000000000000", -- ADRES 0392 "0000000000000000", -- ADRES 0393 "0000000000000000", -- ADRES 0394 "0000000000000000", -- ADRES 0395 "0000000000000000", -- ADRES 0396 "0000000000000000", -- ADRES 0397 "0000000000000000", -- ADRES 0398 "0000000000000000", -- ADRES 0399 "0000000000000000", -- ADRES 0400 "0000000000000000", -- ADRES 0401 "0000000000000000", -- ADRES 0402 "0000000000000000", -- ADRES 0403 "0000000000000000", -- ADRES 0404 "0000000000000000", -- ADRES 0405 "0000000000000000", -- ADRES 0406 "0000000000000000", -- ADRES 0407 "0000000000000000", -- ADRES 0408 "0000000000000000", -- ADRES 0409 "0000000000000000", -- ADRES 0410 "0000000000000000", -- ADRES 0411 "0000000000000000", -- ADRES 0412 "0000000000000000", -- ADRES 0413 "0000000000000000", -- ADRES 0414 "0000000000000000", -- ADRES 0415 "0000000000000000", -- ADRES 0416 "0000000000000000", -- ADRES 0417 "0000000000000000", -- ADRES 0418 "0000000000000000", -- ADRES 0419 "0000000000000000", -- ADRES 0420 "0000000000000000", -- ADRES 0421 "0000000000000000", -- ADRES 0422 "0000000000000000", -- ADRES 0423 "0000000000000000", -- ADRES 0424 "0000000000000000", -- ADRES 0425 "0000000000000000", -- ADRES 0426 "0000000000000000", -- ADRES 0427 "0000000000000000", -- ADRES 0428 "0000000000000000", -- ADRES 0429 "0000000000000000", -- ADRES 0430 "0000000000000000", -- ADRES 0431 "0000000000000000", -- ADRES 0432 "0000000000000000", -- ADRES 0433 "0000000000000000", -- ADRES 0434 "0000000000000000", -- ADRES 0435 "0000000000000000", -- ADRES 0436 "0000000000000000", -- ADRES 0437 "0000000000000000", -- ADRES 0438 "0000000000000000", -- ADRES 0439 "0000000000000000", -- ADRES 0440 "0000000000000000", -- ADRES 0441 "0000000000000000", -- ADRES 0442 "0000000000000000", -- ADRES 0443 "0000000000000000", -- ADRES 0444 "0000000000000000", -- ADRES 0445 "0000000000000000", -- ADRES 0446 "0000000000000000", -- ADRES 0447 "0000000000000000", -- ADRES 0448 "0000000000000000", -- ADRES 0449 "0000000000000000", -- ADRES 0450 "0000000000000000", -- ADRES 0451 "0000000000000000", -- ADRES 0452 "0000000000000000", -- ADRES 0453 "0000000000000000", -- ADRES 0454 "0000000000000000", -- ADRES 0455 "0000000000000000", -- ADRES 0456 "0000000000000000", -- ADRES 0457 "0000000000000000", -- ADRES 0458 "0000000000000000", -- ADRES 0459 "0000000000000000", -- ADRES 0460 "0000000000000000", -- ADRES 0461 "0000000000000000", -- ADRES 0462 "0000000000000000", -- ADRES 0463 "0000000000000000", -- ADRES 0464 "0000000000000000", -- ADRES 0465 "0000000000000000", -- ADRES 0466 "0000000000000000", -- ADRES 0467 "0000000000000000", -- ADRES 0468 "0000000000000000", -- ADRES 0469 "0000000000000000", -- ADRES 0470 "0000000000000000", -- ADRES 0471 "0000000000000000", -- ADRES 0472 "0000000000000000", -- ADRES 0473 "0000000000000000", -- ADRES 0474 "0000000000000000", -- ADRES 0475 "0000000000000000", -- ADRES 0476 "0000000000000000", -- ADRES 0477 "0000000000000000", -- ADRES 0478 "0000000000000000", -- ADRES 0479 "0000000000000000", -- ADRES 0480 "0000000000000000", -- ADRES 0481 "0000000000000000", -- ADRES 0482 "0000000000000000", -- ADRES 0483 "0000000000000000", -- ADRES 0484 "0000000000000000", -- ADRES 0485 "0000000000000000", -- ADRES 0486 "0000000000000000", -- ADRES 0487 "0000000000000000", -- ADRES 0488 "0000000000000000", -- ADRES 0489 "0000000000000000", -- ADRES 0490 "0000000000000000", -- ADRES 0491 "0000000000000000", -- ADRES 0492 "0000000000000000", -- ADRES 0493 "0000000000000000", -- ADRES 0494 "0000000000000000", -- ADRES 0495 "0000000000000000", -- ADRES 0496 "0000000000000000", -- ADRES 0497 "0000000000000000", -- ADRES 0498 "0000000000000000", -- ADRES 0499 "0000000000000000", -- ADRES 0500 "0000000000000000", -- ADRES 0501 "0000000000000000", -- ADRES 0502 "0000000000000000", -- ADRES 0503 "0000000000000000", -- ADRES 0504 "0000000000000000", -- ADRES 0505 "0000000000000000", -- ADRES 0506 "0000000000000000", -- ADRES 0507 "0000000000000000", -- ADRES 0508 "0000000000000000", -- ADRES 0509 "0000000000000000", -- ADRES 0510 "0000000000000000", -- ADRES 0511 "0000000000000000", -- ADRES 0512 "0000000000000000", -- ADRES 0513 "0000000000000000", -- ADRES 0514 "0000000000000000", -- ADRES 0515 "0000000000000000", -- ADRES 0516 "0000000000000000", -- ADRES 0517 "0000000000000000", -- ADRES 0518 "0000000000000000", -- ADRES 0519 "0000000000000000", -- ADRES 0520 "0000000000000000", -- ADRES 0521 "0000000000000000", -- ADRES 0522 "0000000000000000", -- ADRES 0523 "0000000000000000", -- ADRES 0524 "0000000000000000", -- ADRES 0525 "0000000000000000", -- ADRES 0526 "0000000000000000", -- ADRES 0527 "0000000000000000", -- ADRES 0528 "0000000000000000", -- ADRES 0529 "0000000000000000", -- ADRES 0530 "0000000000000000", -- ADRES 0531 "0000000000000000", -- ADRES 0532 "0000000000000000", -- ADRES 0533 "0000000000000000", -- ADRES 0534 "0000000000000000", -- ADRES 0535 "0000000000000000", -- ADRES 0536 "0000000000000000", -- ADRES 0537 "0000000000000000", -- ADRES 0538 "0000000000000000", -- ADRES 0539 "0000000000000000", -- ADRES 0540 "0000000000000000", -- ADRES 0541 "0000000000000000", -- ADRES 0542 "0000000000000000", -- ADRES 0543 "0000000000000000", -- ADRES 0544 "0000000000000000", -- ADRES 0545 "0000000000000000", -- ADRES 0546 "0000000000000000", -- ADRES 0547 "0000000000000000", -- ADRES 0548 "0000000000000000", -- ADRES 0549 "0000000000000000", -- ADRES 0550 "0000000000000000", -- ADRES 0551 "0000000000000000", -- ADRES 0552 "0000000000000000", -- ADRES 0553 "0000000000000000", -- ADRES 0554 "0000000000000000", -- ADRES 0555 "0000000000000000", -- ADRES 0556 "0000000000000000", -- ADRES 0557 "0000000000000000", -- ADRES 0558 "0000000000000000", -- ADRES 0559 "0000000000000000", -- ADRES 0560 "0000000000000000", -- ADRES 0561 "0000000000000000", -- ADRES 0562 "0000000000000000", -- ADRES 0563 "0000000000000000", -- ADRES 0564 "0000000000000000", -- ADRES 0565 "0000000000000000", -- ADRES 0566 "0000000000000000", -- ADRES 0567 "0000000000000000", -- ADRES 0568 "0000000000000000", -- ADRES 0569 "0000000000000000", -- ADRES 0570 "0000000000000000", -- ADRES 0571 "0000000000000000", -- ADRES 0572 "0000000000000000", -- ADRES 0573 "0000000000000000", -- ADRES 0574 "0000000000000000", -- ADRES 0575 "0000000000000000", -- ADRES 0576 "0000000000000000", -- ADRES 0577 "0000000000000000", -- ADRES 0578 "0000000000000000", -- ADRES 0579 "0000000000000000", -- ADRES 0580 "0000000000000000", -- ADRES 0581 "0000000000000000", -- ADRES 0582 "0000000000000000", -- ADRES 0583 "0000000000000000", -- ADRES 0584 "0000000000000000", -- ADRES 0585 "0000000000000000", -- ADRES 0586 "0000000000000000", -- ADRES 0587 "0000000000000000", -- ADRES 0588 "0000000000000000", -- ADRES 0589 "0000000000000000", -- ADRES 0590 "0000000000000000", -- ADRES 0591 "0000000000000000", -- ADRES 0592 "0000000000000000", -- ADRES 0593 "0000000000000000", -- ADRES 0594 "0000000000000000", -- ADRES 0595 "0000000000000000", -- ADRES 0596 "0000000000000000", -- ADRES 0597 "0000000000000000", -- ADRES 0598 "0000000000000000", -- ADRES 0599 "0000000000000000", -- ADRES 0600 "0000000000000000", -- ADRES 0601 "0000000000000000", -- ADRES 0602 "0000000000000000", -- ADRES 0603 "0000000000000000", -- ADRES 0604 "0000000000000000", -- ADRES 0605 "0000000000000000", -- ADRES 0606 "0000000000000000", -- ADRES 0607 "0000000000000000", -- ADRES 0608 "0000000000000000", -- ADRES 0609 "0000000000000000", -- ADRES 0610 "0000000000000000", -- ADRES 0611 "0000000000000000", -- ADRES 0612 "0000000000000000", -- ADRES 0613 "0000000000000000", -- ADRES 0614 "0000000000000000", -- ADRES 0615 "0000000000000000", -- ADRES 0616 "0000000000000000", -- ADRES 0617 "0000000000000000", -- ADRES 0618 "0000000000000000", -- ADRES 0619 "0000000000000000", -- ADRES 0620 "0000000000000000", -- ADRES 0621 "0000000000000000", -- ADRES 0622 "0000000000000000", -- ADRES 0623 "0000000000000000", -- ADRES 0624 "0000000000000000", -- ADRES 0625 "0000000000000000", -- ADRES 0626 "0000000000000000", -- ADRES 0627 "0000000000000000", -- ADRES 0628 "0000000000000000", -- ADRES 0629 "0000000000000000", -- ADRES 0630 "0000000000000000", -- ADRES 0631 "0000000000000000", -- ADRES 0632 "0000000000000000", -- ADRES 0633 "0000000000000000", -- ADRES 0634 "0000000000000000", -- ADRES 0635 "0000000000000000", -- ADRES 0636 "0000000000000000", -- ADRES 0637 "0000000000000000", -- ADRES 0638 "0000000000000000", -- ADRES 0639 "0000000000000000", -- ADRES 0640 "0000000000000000", -- ADRES 0641 "0000000000000000", -- ADRES 0642 "0000000000000000", -- ADRES 0643 "0000000000000000", -- ADRES 0644 "0000000000000000", -- ADRES 0645 "0000000000000000", -- ADRES 0646 "0000000000000000", -- ADRES 0647 "0000000000000000", -- ADRES 0648 "0000000000000000", -- ADRES 0649 "0000000000000000", -- ADRES 0650 "0000000000000000", -- ADRES 0651 "0000000000000000", -- ADRES 0652 "0000000000000000", -- ADRES 0653 "0000000000000000", -- ADRES 0654 "0000000000000000", -- ADRES 0655 "0000000000000000", -- ADRES 0656 "0000000000000000", -- ADRES 0657 "0000000000000000", -- ADRES 0658 "0000000000000000", -- ADRES 0659 "0000000000000000", -- ADRES 0660 "0000000000000000", -- ADRES 0661 "0000000000000000", -- ADRES 0662 "0000000000000000", -- ADRES 0663 "0000000000000000", -- ADRES 0664 "0000000000000000", -- ADRES 0665 "0000000000000000", -- ADRES 0666 "0000000000000000", -- ADRES 0667 "0000000000000000", -- ADRES 0668 "0000000000000000", -- ADRES 0669 "0000000000000000", -- ADRES 0670 "0000000000000000", -- ADRES 0671 "0000000000000000", -- ADRES 0672 "0000000000000000", -- ADRES 0673 "0000000000000000", -- ADRES 0674 "0000000000000000", -- ADRES 0675 "0000000000000000", -- ADRES 0676 "0000000000000000", -- ADRES 0677 "0000000000000000", -- ADRES 0678 "0000000000000000", -- ADRES 0679 "0000000000000000", -- ADRES 0680 "0000000000000000", -- ADRES 0681 "0000000000000000", -- ADRES 0682 "0000000000000000", -- ADRES 0683 "0000000000000000", -- ADRES 0684 "0000000000000000", -- ADRES 0685 "0000000000000000", -- ADRES 0686 "0000000000000000", -- ADRES 0687 "0000000000000000", -- ADRES 0688 "0000000000000000", -- ADRES 0689 "0000000000000000", -- ADRES 0690 "0000000000000000", -- ADRES 0691 "0000000000000000", -- ADRES 0692 "0000000000000000", -- ADRES 0693 "0000000000000000", -- ADRES 0694 "0000000000000000", -- ADRES 0695 "0000000000000000", -- ADRES 0696 "0000000000000000", -- ADRES 0697 "0000000000000000", -- ADRES 0698 "0000000000000000", -- ADRES 0699 "0000000000000000", -- ADRES 0700 "0000000000000000", -- ADRES 0701 "0000000000000000", -- ADRES 0702 "0000000000000000", -- ADRES 0703 "0000000000000000", -- ADRES 0704 "0000000000000000", -- ADRES 0705 "0000000000000000", -- ADRES 0706 "0000000000000000", -- ADRES 0707 "0000000000000000", -- ADRES 0708 "0000000000000000", -- ADRES 0709 "0000000000000000", -- ADRES 0710 "0000000000000000", -- ADRES 0711 "0000000000000000", -- ADRES 0712 "0000000000000000", -- ADRES 0713 "0000000000000000", -- ADRES 0714 "0000000000000000", -- ADRES 0715 "0000000000000000", -- ADRES 0716 "0000000000000000", -- ADRES 0717 "0000000000000000", -- ADRES 0718 "0000000000000000", -- ADRES 0719 "0000000000000000", -- ADRES 0720 "0000000000000000", -- ADRES 0721 "0000000000000000", -- ADRES 0722 "0000000000000000", -- ADRES 0723 "0000000000000000", -- ADRES 0724 "0000000000000000", -- ADRES 0725 "0000000000000000", -- ADRES 0726 "0000000000000000", -- ADRES 0727 "0000000000000000", -- ADRES 0728 "0000000000000000", -- ADRES 0729 "0000000000000000", -- ADRES 0730 "0000000000000000", -- ADRES 0731 "0000000000000000", -- ADRES 0732 "0000000000000000", -- ADRES 0733 "0000000000000000", -- ADRES 0734 "0000000000000000", -- ADRES 0735 "0000000000000000", -- ADRES 0736 "0000000000000000", -- ADRES 0737 "0000000000000000", -- ADRES 0738 "0000000000000000", -- ADRES 0739 "0000000000000000", -- ADRES 0740 "0000000000000000", -- ADRES 0741 "0000000000000000", -- ADRES 0742 "0000000000000000", -- ADRES 0743 "0000000000000000", -- ADRES 0744 "0000000000000000", -- ADRES 0745 "0000000000000000", -- ADRES 0746 "0000000000000000", -- ADRES 0747 "0000000000000000", -- ADRES 0748 "0000000000000000", -- ADRES 0749 "0000000000000000", -- ADRES 0750 "0000000000000000", -- ADRES 0751 "0000000000000000", -- ADRES 0752 "0000000000000000", -- ADRES 0753 "0000000000000000", -- ADRES 0754 "0000000000000000", -- ADRES 0755 "0000000000000000", -- ADRES 0756 "0000000000000000", -- ADRES 0757 "0000000000000000", -- ADRES 0758 "0000000000000000", -- ADRES 0759 "0000000000000000", -- ADRES 0760 "0000000000000000", -- ADRES 0761 "0000000000000000", -- ADRES 0762 "0000000000000000", -- ADRES 0763 "0000000000000000", -- ADRES 0764 "0000000000000000", -- ADRES 0765 "0000000000000000", -- ADRES 0766 "0000000000000000", -- ADRES 0767 "0000000000000000", -- ADRES 0768 "0000000000000000", -- ADRES 0769 "0000000000000000", -- ADRES 0770 "0000000000000000", -- ADRES 0771 "0000000000000000", -- ADRES 0772 "0000000000000000", -- ADRES 0773 "0000000000000000", -- ADRES 0774 "0000000000000000", -- ADRES 0775 "0000000000000000", -- ADRES 0776 "0000000000000000", -- ADRES 0777 "0000000000000000", -- ADRES 0778 "0000000000000000", -- ADRES 0779 "0000000000000000", -- ADRES 0780 "0000000000000000", -- ADRES 0781 "0000000000000000", -- ADRES 0782 "0000000000000000", -- ADRES 0783 "0000000000000000", -- ADRES 0784 "0000000000000000", -- ADRES 0785 "0000000000000000", -- ADRES 0786 "0000000000000000", -- ADRES 0787 "0000000000000000", -- ADRES 0788 "0000000000000000", -- ADRES 0789 "0000000000000000", -- ADRES 0790 "0000000000000000", -- ADRES 0791 "0000000000000000", -- ADRES 0792 "0000000000000000", -- ADRES 0793 "0000000000000000", -- ADRES 0794 "0000000000000000", -- ADRES 0795 "0000000000000000", -- ADRES 0796 "0000000000000000", -- ADRES 0797 "0000000000000000", -- ADRES 0798 "0000000000000000", -- ADRES 0799 "0000000000000000", -- ADRES 0800 "0000000000000000", -- ADRES 0801 "0000000000000000", -- ADRES 0802 "0000000000000000", -- ADRES 0803 "0000000000000000", -- ADRES 0804 "0000000000000000", -- ADRES 0805 "0000000000000000", -- ADRES 0806 "0000000000000000", -- ADRES 0807 "0000000000000000", -- ADRES 0808 "0000000000000000", -- ADRES 0809 "0000000000000000", -- ADRES 0810 "0000000000000000", -- ADRES 0811 "0000000000000000", -- ADRES 0812 "0000000000000000", -- ADRES 0813 "0000000000000000", -- ADRES 0814 "0000000000000000", -- ADRES 0815 "0000000000000000", -- ADRES 0816 "0000000000000000", -- ADRES 0817 "0000000000000000", -- ADRES 0818 "0000000000000000", -- ADRES 0819 "0000000000000000", -- ADRES 0820 "0000000000000000", -- ADRES 0821 "0000000000000000", -- ADRES 0822 "0000000000000000", -- ADRES 0823 "0000000000000000", -- ADRES 0824 "0000000000000000", -- ADRES 0825 "0000000000000000", -- ADRES 0826 "0000000000000000", -- ADRES 0827 "0000000000000000", -- ADRES 0828 "0000000000000000", -- ADRES 0829 "0000000000000000", -- ADRES 0830 "0000000000000000", -- ADRES 0831 "0000000000000000", -- ADRES 0832 "0000000000000000", -- ADRES 0833 "0000000000000000", -- ADRES 0834 "0000000000000000", -- ADRES 0835 "0000000000000000", -- ADRES 0836 "0000000000000000", -- ADRES 0837 "0000000000000000", -- ADRES 0838 "0000000000000000", -- ADRES 0839 "0000000000000000", -- ADRES 0840 "0000000000000000", -- ADRES 0841 "0000000000000000", -- ADRES 0842 "0000000000000000", -- ADRES 0843 "0000000000000000", -- ADRES 0844 "0000000000000000", -- ADRES 0845 "0000000000000000", -- ADRES 0846 "0000000000000000", -- ADRES 0847 "0000000000000000", -- ADRES 0848 "0000000000000000", -- ADRES 0849 "0000000000000000", -- ADRES 0850 "0000000000000000", -- ADRES 0851 "0000000000000000", -- ADRES 0852 "0000000000000000", -- ADRES 0853 "0000000000000000", -- ADRES 0854 "0000000000000000", -- ADRES 0855 "0000000000000000", -- ADRES 0856 "0000000000000000", -- ADRES 0857 "0000000000000000", -- ADRES 0858 "0000000000000000", -- ADRES 0859 "0000000000000000", -- ADRES 0860 "0000000000000000", -- ADRES 0861 "0000000000000000", -- ADRES 0862 "0000000000000000", -- ADRES 0863 "0000000000000000", -- ADRES 0864 "0000000000000000", -- ADRES 0865 "0000000000000000", -- ADRES 0866 "0000000000000000", -- ADRES 0867 "0000000000000000", -- ADRES 0868 "0000000000000000", -- ADRES 0869 "0000000000000000", -- ADRES 0870 "0000000000000000", -- ADRES 0871 "0000000000000000", -- ADRES 0872 "0000000000000000", -- ADRES 0873 "0000000000000000", -- ADRES 0874 "0000000000000000", -- ADRES 0875 "0000000000000000", -- ADRES 0876 "0000000000000000", -- ADRES 0877 "0000000000000000", -- ADRES 0878 "0000000000000000", -- ADRES 0879 "0000000000000000", -- ADRES 0880 "0000000000000000", -- ADRES 0881 "0000000000000000", -- ADRES 0882 "0000000000000000", -- ADRES 0883 "0000000000000000", -- ADRES 0884 "0000000000000000", -- ADRES 0885 "0000000000000000", -- ADRES 0886 "0000000000000000", -- ADRES 0887 "0000000000000000", -- ADRES 0888 "0000000000000000", -- ADRES 0889 "0000000000000000", -- ADRES 0890 "0000000000000000", -- ADRES 0891 "0000000000000000", -- ADRES 0892 "0000000000000000", -- ADRES 0893 "0000000000000000", -- ADRES 0894 "0000000000000000", -- ADRES 0895 "0000000000000000", -- ADRES 0896 "0000000000000000", -- ADRES 0897 "0000000000000000", -- ADRES 0898 "0000000000000000", -- ADRES 0899 "0000000000000000", -- ADRES 0900 "0000000000000000", -- ADRES 0901 "0000000000000000", -- ADRES 0902 "0000000000000000", -- ADRES 0903 "0000000000000000", -- ADRES 0904 "0000000000000000", -- ADRES 0905 "0000000000000000", -- ADRES 0906 "0000000000000000", -- ADRES 0907 "0000000000000000", -- ADRES 0908 "0000000000000000", -- ADRES 0909 "0000000000000000", -- ADRES 0910 "0000000000000000", -- ADRES 0911 "0000000000000000", -- ADRES 0912 "0000000000000000", -- ADRES 0913 "0000000000000000", -- ADRES 0914 "0000000000000000", -- ADRES 0915 "0000000000000000", -- ADRES 0916 "0000000000000000", -- ADRES 0917 "0000000000000000", -- ADRES 0918 "0000000000000000", -- ADRES 0919 "0000000000000000", -- ADRES 0920 "0000000000000000", -- ADRES 0921 "0000000000000000", -- ADRES 0922 "0000000000000000", -- ADRES 0923 "0000000000000000", -- ADRES 0924 "0000000000000000", -- ADRES 0925 "0000000000000000", -- ADRES 0926 "0000000000000000", -- ADRES 0927 "0000000000000000", -- ADRES 0928 "0000000000000000", -- ADRES 0929 "0000000000000000", -- ADRES 0930 "0000000000000000", -- ADRES 0931 "0000000000000000", -- ADRES 0932 "0000000000000000", -- ADRES 0933 "0000000000000000", -- ADRES 0934 "0000000000000000", -- ADRES 0935 "0000000000000000", -- ADRES 0936 "0000000000000000", -- ADRES 0937 "0000000000000000", -- ADRES 0938 "0000000000000000", -- ADRES 0939 "0000000000000000", -- ADRES 0940 "0000000000000000", -- ADRES 0941 "0000000000000000", -- ADRES 0942 "0000000000000000", -- ADRES 0943 "0000000000000000", -- ADRES 0944 "0000000000000000", -- ADRES 0945 "0000000000000000", -- ADRES 0946 "0000000000000000", -- ADRES 0947 "0000000000000000", -- ADRES 0948 "0000000000000000", -- ADRES 0949 "0000000000000000", -- ADRES 0950 "0000000000000000", -- ADRES 0951 "0000000000000000", -- ADRES 0952 "0000000000000000", -- ADRES 0953 "0000000000000000", -- ADRES 0954 "0000000000000000", -- ADRES 0955 "0000000000000000", -- ADRES 0956 "0000000000000000", -- ADRES 0957 "0000000000000000", -- ADRES 0958 "0000000000000000", -- ADRES 0959 "0000000000000000", -- ADRES 0960 "0000000000000000", -- ADRES 0961 "0000000000000000", -- ADRES 0962 "0000000000000000", -- ADRES 0963 "0000000000000000", -- ADRES 0964 "0000000000000000", -- ADRES 0965 "0000000000000000", -- ADRES 0966 "0000000000000000", -- ADRES 0967 "0000000000000000", -- ADRES 0968 "0000000000000000", -- ADRES 0969 "0000000000000000", -- ADRES 0970 "0000000000000000", -- ADRES 0971 "0000000000000000", -- ADRES 0972 "0000000000000000", -- ADRES 0973 "0000000000000000", -- ADRES 0974 "0000000000000000", -- ADRES 0975 "0000000000000000", -- ADRES 0976 "0000000000000000", -- ADRES 0977 "0000000000000000", -- ADRES 0978 "0000000000000000", -- ADRES 0979 "0000000000000000", -- ADRES 0980 "0000000000000000", -- ADRES 0981 "0000000000000000", -- ADRES 0982 "0000000000000000", -- ADRES 0983 "0000000000000000", -- ADRES 0984 "0000000000000000", -- ADRES 0985 "0000000000000000", -- ADRES 0986 "0000000000000000", -- ADRES 0987 "0000000000000000", -- ADRES 0988 "0000000000000000", -- ADRES 0989 "0000000000000000", -- ADRES 0990 "0000000000000000", -- ADRES 0991 "0000000000000000", -- ADRES 0992 "0000000000000000", -- ADRES 0993 "0000000000000000", -- ADRES 0994 "0000000000000000", -- ADRES 0995 "0000000000000000", -- ADRES 0996 "0000000000000000", -- ADRES 0997 "0000000000000000", -- ADRES 0998 "0000000000000000", -- ADRES 0999 "0000000000000000", -- ADRES 1000 "0000000000000000", -- ADRES 1001 "0000000000000000", -- ADRES 1002 "0000000000000000", -- ADRES 1003 "0000000000000000", -- ADRES 1004 "0000000000000000", -- ADRES 1005 "0000000000000000", -- ADRES 1006 "0000000000000000", -- ADRES 1007 "0000000000000000", -- ADRES 1008 "0000000000000000", -- ADRES 1009 "0000000000000000", -- ADRES 1010 "0000000000000000", -- ADRES 1011 "0000000000000000", -- ADRES 1012 "0000000000000000", -- ADRES 1013 "0000000000000000", -- ADRES 1014 "0000000000000000", -- ADRES 1015 "0000000000000000", -- ADRES 1016 "0000000000000000", -- ADRES 1017 "0000000000000000", -- ADRES 1018 "0000000000000000", -- ADRES 1019 "0000000000000000", -- ADRES 1020 "0000000000000000", -- ADRES 1021 "0000000000000000", -- ADRES 1022 "0000000000000000", -- ADRES 1023 "0000000000000000", -- ADRES 1024 "0000000000000000", -- ADRES 1025 "0000000000000000", -- ADRES 1026 "0000000000000000", -- ADRES 1027 "0000000000000000", -- ADRES 1028 "0000000000000000", -- ADRES 1029 "0000000000000000", -- ADRES 1030 "0000000000000000", -- ADRES 1031 "0000000000000000", -- ADRES 1032 "0000000000000000", -- ADRES 1033 "0000000000000000", -- ADRES 1034 "0000000000000000", -- ADRES 1035 "0000000000000000", -- ADRES 1036 "0000000000000000", -- ADRES 1037 "0000000000000000", -- ADRES 1038 "0000000000000000", -- ADRES 1039 "0000000000000000", -- ADRES 1040 "0000000000000000", -- ADRES 1041 "0000000000000000", -- ADRES 1042 "0000000000000000", -- ADRES 1043 "0000000000000000", -- ADRES 1044 "0000000000000000", -- ADRES 1045 "0000000000000000", -- ADRES 1046 "0000000000000000", -- ADRES 1047 "0000000000000000", -- ADRES 1048 "0000000000000000", -- ADRES 1049 "0000000000000000", -- ADRES 1050 "0000000000000000", -- ADRES 1051 "0000000000000000", -- ADRES 1052 "0000000000000000", -- ADRES 1053 "0000000000000000", -- ADRES 1054 "0000000000000000", -- ADRES 1055 "0000000000000000", -- ADRES 1056 "0000000000000000", -- ADRES 1057 "0000000000000000", -- ADRES 1058 "0000000000000000", -- ADRES 1059 "0000000000000000", -- ADRES 1060 "0000000000000000", -- ADRES 1061 "0000000000000000", -- ADRES 1062 "0000000000000000", -- ADRES 1063 "0000000000000000", -- ADRES 1064 "0000000000000000", -- ADRES 1065 "0000000000000000", -- ADRES 1066 "0000000000000000", -- ADRES 1067 "0000000000000000", -- ADRES 1068 "0000000000000000", -- ADRES 1069 "0000000000000000", -- ADRES 1070 "0000000000000000", -- ADRES 1071 "0000000000000000", -- ADRES 1072 "0000000000000000", -- ADRES 1073 "0000000000000000", -- ADRES 1074 "0000000000000000", -- ADRES 1075 "0000000000000000", -- ADRES 1076 "0000000000000000", -- ADRES 1077 "0000000000000000", -- ADRES 1078 "0000000000000000", -- ADRES 1079 "0000000000000000", -- ADRES 1080 "0000000000000000", -- ADRES 1081 "0000000000000000", -- ADRES 1082 "0000000000000000", -- ADRES 1083 "0000000000000000", -- ADRES 1084 "0000000000000000", -- ADRES 1085 "0000000000000000", -- ADRES 1086 "0000000000000000", -- ADRES 1087 "0000000000000000", -- ADRES 1088 "0000000000000000", -- ADRES 1089 "0000000000000000", -- ADRES 1090 "0000000000000000", -- ADRES 1091 "0000000000000000", -- ADRES 1092 "0000000000000000", -- ADRES 1093 "0000000000000000", -- ADRES 1094 "0000000000000000", -- ADRES 1095 "0000000000000000", -- ADRES 1096 "0000000000000000", -- ADRES 1097 "0000000000000000", -- ADRES 1098 "0000000000000000", -- ADRES 1099 "0000000000000000", -- ADRES 1100 "0000000000000000", -- ADRES 1101 "0000000000000000", -- ADRES 1102 "0000000000000000", -- ADRES 1103 "0000000000000000", -- ADRES 1104 "0000000000000000", -- ADRES 1105 "0000000000000000", -- ADRES 1106 "0000000000000000", -- ADRES 1107 "0000000000000000", -- ADRES 1108 "0000000000000000", -- ADRES 1109 "0000000000000000", -- ADRES 1110 "0000000000000000", -- ADRES 1111 "0000000000000000", -- ADRES 1112 "0000000000000000", -- ADRES 1113 "0000000000000000", -- ADRES 1114 "0000000000000000", -- ADRES 1115 "0000000000000000", -- ADRES 1116 "0000000000000000", -- ADRES 1117 "0000000000000000", -- ADRES 1118 "0000000000000000", -- ADRES 1119 "0000000000000000", -- ADRES 1120 "0000000000000000", -- ADRES 1121 "0000000000000000", -- ADRES 1122 "0000000000000000", -- ADRES 1123 "0000000000000000", -- ADRES 1124 "0000000000000000", -- ADRES 1125 "0000000000000000", -- ADRES 1126 "0000000000000000", -- ADRES 1127 "0000000000000000", -- ADRES 1128 "0000000000000000", -- ADRES 1129 "0000000000000000", -- ADRES 1130 "0000000000000000", -- ADRES 1131 "0000000000000000", -- ADRES 1132 "0000000000000000", -- ADRES 1133 "0000000000000000", -- ADRES 1134 "0000000000000000", -- ADRES 1135 "0000000000000000", -- ADRES 1136 "0000000000000000", -- ADRES 1137 "0000000000000000", -- ADRES 1138 "0000000000000000", -- ADRES 1139 "0000000000000000", -- ADRES 1140 "0000000000000000", -- ADRES 1141 "0000000000000000", -- ADRES 1142 "0000000000000000", -- ADRES 1143 "0000000000000000", -- ADRES 1144 "0000000000000000", -- ADRES 1145 "0000000000000000", -- ADRES 1146 "0000000000000000", -- ADRES 1147 "0000000000000000", -- ADRES 1148 "0000000000000000", -- ADRES 1149 "0000000000000000", -- ADRES 1150 "0000000000000000", -- ADRES 1151 "0000000000000000", -- ADRES 1152 "0000000000000000", -- ADRES 1153 "0000000000000000", -- ADRES 1154 "0000000000000000", -- ADRES 1155 "0000000000000000", -- ADRES 1156 "0000000000000000", -- ADRES 1157 "0000000000000000", -- ADRES 1158 "0000000000000000", -- ADRES 1159 "0000000000000000", -- ADRES 1160 "0000000000000000", -- ADRES 1161 "0000000000000000", -- ADRES 1162 "0000000000000000", -- ADRES 1163 "0000000000000000", -- ADRES 1164 "0000000000000000", -- ADRES 1165 "0000000000000000", -- ADRES 1166 "0000000000000000", -- ADRES 1167 "0000000000000000", -- ADRES 1168 "0000000000000000", -- ADRES 1169 "0000000000000000", -- ADRES 1170 "0000000000000000", -- ADRES 1171 "0000000000000000", -- ADRES 1172 "0000000000000000", -- ADRES 1173 "0000000000000000", -- ADRES 1174 "0000000000000000", -- ADRES 1175 "0000000000000000", -- ADRES 1176 "0000000000000000", -- ADRES 1177 "0000000000000000", -- ADRES 1178 "0000000000000000", -- ADRES 1179 "0000000000000000", -- ADRES 1180 "0000000000000000", -- ADRES 1181 "0000000000000000", -- ADRES 1182 "0000000000000000", -- ADRES 1183 "0000000000000000", -- ADRES 1184 "0000000000000000", -- ADRES 1185 "0000000000000000", -- ADRES 1186 "0000000000000000", -- ADRES 1187 "0000000000000000", -- ADRES 1188 "0000000000000000", -- ADRES 1189 "0000000000000000", -- ADRES 1190 "0000000000000000", -- ADRES 1191 "0000000000000000", -- ADRES 1192 "0000000000000000", -- ADRES 1193 "0000000000000000", -- ADRES 1194 "0000000000000000", -- ADRES 1195 "0000000000000000", -- ADRES 1196 "0000000000000000", -- ADRES 1197 "0000000000000000", -- ADRES 1198 "0000000000000000", -- ADRES 1199 "0000000000000000", -- ADRES 1200 "0000000000000000", -- ADRES 1201 "0000000000000000", -- ADRES 1202 "0000000000000000", -- ADRES 1203 "0000000000000000", -- ADRES 1204 "0000000000000000", -- ADRES 1205 "0000000000000000", -- ADRES 1206 "0000000000000000", -- ADRES 1207 "0000000000000000", -- ADRES 1208 "0000000000000000", -- ADRES 1209 "0000000000000000", -- ADRES 1210 "0000000000000000", -- ADRES 1211 "0000000000000000", -- ADRES 1212 "0000000000000000", -- ADRES 1213 "0000000000000000", -- ADRES 1214 "0000000000000000", -- ADRES 1215 "0000000000000000", -- ADRES 1216 "0000000000000000", -- ADRES 1217 "0000000000000000", -- ADRES 1218 "0000000000000000", -- ADRES 1219 "0000000000000000", -- ADRES 1220 "0000000000000000", -- ADRES 1221 "0000000000000000", -- ADRES 1222 "0000000000000000", -- ADRES 1223 "0000000000000000", -- ADRES 1224 "0000000000000000", -- ADRES 1225 "0000000000000000", -- ADRES 1226 "0000000000000000", -- ADRES 1227 "0000000000000000", -- ADRES 1228 "0000000000000000", -- ADRES 1229 "0000000000000000", -- ADRES 1230 "0000000000000000", -- ADRES 1231 "0000000000000000", -- ADRES 1232 "0000000000000000", -- ADRES 1233 "0000000000000000", -- ADRES 1234 "0000000000000000", -- ADRES 1235 "0000000000000000", -- ADRES 1236 "0000000000000000", -- ADRES 1237 "0000000000000000", -- ADRES 1238 "0000000000000000", -- ADRES 1239 "0000000000000000", -- ADRES 1240 "0000000000000000", -- ADRES 1241 "0000000000000000", -- ADRES 1242 "0000000000000000", -- ADRES 1243 "0000000000000000", -- ADRES 1244 "0000000000000000", -- ADRES 1245 "0000000000000000", -- ADRES 1246 "0000000000000000", -- ADRES 1247 "0000000000000000", -- ADRES 1248 "0000000000000000", -- ADRES 1249 "0000000000000000", -- ADRES 1250 "0000000000000000", -- ADRES 1251 "0000000000000000", -- ADRES 1252 "0000000000000000", -- ADRES 1253 "0000000000000000", -- ADRES 1254 "0000000000000000", -- ADRES 1255 "0000000000000000", -- ADRES 1256 "0000000000000000", -- ADRES 1257 "0000000000000000", -- ADRES 1258 "0000000000000000", -- ADRES 1259 "0000000000000000", -- ADRES 1260 "0000000000000000", -- ADRES 1261 "0000000000000000", -- ADRES 1262 "0000000000000000", -- ADRES 1263 "0000000000000000", -- ADRES 1264 "0000000000000000", -- ADRES 1265 "0000000000000000", -- ADRES 1266 "0000000000000000", -- ADRES 1267 "0000000000000000", -- ADRES 1268 "0000000000000000", -- ADRES 1269 "0000000000000000", -- ADRES 1270 "0000000000000000", -- ADRES 1271 "0000000000000000", -- ADRES 1272 "0000000000000000", -- ADRES 1273 "0000000000000000", -- ADRES 1274 "0000000000000000", -- ADRES 1275 "0000000000000000", -- ADRES 1276 "0000000000000000", -- ADRES 1277 "0000000000000000", -- ADRES 1278 "0000000000000000", -- ADRES 1279 "0000000000000000", -- ADRES 1280 "0000000000000000", -- ADRES 1281 "0000000000000000", -- ADRES 1282 "0000000000000000", -- ADRES 1283 "0000000000000000", -- ADRES 1284 "0000000000000000", -- ADRES 1285 "0000000000000000", -- ADRES 1286 "0000000000000000", -- ADRES 1287 "0000000000000000", -- ADRES 1288 "0000000000000000", -- ADRES 1289 "0000000000000000", -- ADRES 1290 "0000000000000000", -- ADRES 1291 "0000000000000000", -- ADRES 1292 "0000000000000000", -- ADRES 1293 "0000000000000000", -- ADRES 1294 "0000000000000000", -- ADRES 1295 "0000000000000000", -- ADRES 1296 "0000000000000000", -- ADRES 1297 "0000000000000000", -- ADRES 1298 "0000000000000000", -- ADRES 1299 "0000000000000000", -- ADRES 1300 "0000000000000000", -- ADRES 1301 "0000000000000000", -- ADRES 1302 "0000000000000000", -- ADRES 1303 "0000000000000000", -- ADRES 1304 "0000000000000000", -- ADRES 1305 "0000000000000000", -- ADRES 1306 "0000000000000000", -- ADRES 1307 "0000000000000000", -- ADRES 1308 "0000000000000000", -- ADRES 1309 "0000000000000000", -- ADRES 1310 "0000000000000000", -- ADRES 1311 "0000000000000000", -- ADRES 1312 "0000000000000000", -- ADRES 1313 "0000000000000000", -- ADRES 1314 "0000000000000000", -- ADRES 1315 "0000000000000000", -- ADRES 1316 "0000000000000000", -- ADRES 1317 "0000000000000000", -- ADRES 1318 "0000000000000000", -- ADRES 1319 "0000000000000000", -- ADRES 1320 "0000000000000000", -- ADRES 1321 "0000000000000000", -- ADRES 1322 "0000000000000000", -- ADRES 1323 "0000000000000000", -- ADRES 1324 "0000000000000000", -- ADRES 1325 "0000000000000000", -- ADRES 1326 "0000000000000000", -- ADRES 1327 "0000000000000000", -- ADRES 1328 "0000000000000000", -- ADRES 1329 "0000000000000000", -- ADRES 1330 "0000000000000000", -- ADRES 1331 "0000000000000000", -- ADRES 1332 "0000000000000000", -- ADRES 1333 "0000000000000000", -- ADRES 1334 "0000000000000000", -- ADRES 1335 "0000000000000000", -- ADRES 1336 "0000000000000000", -- ADRES 1337 "0000000000000000", -- ADRES 1338 "0000000000000000", -- ADRES 1339 "0000000000000000", -- ADRES 1340 "0000000000000000", -- ADRES 1341 "0000000000000000", -- ADRES 1342 "0000000000000000", -- ADRES 1343 "0000000000000000", -- ADRES 1344 "0000000000000000", -- ADRES 1345 "0000000000000000", -- ADRES 1346 "0000000000000000", -- ADRES 1347 "0000000000000000", -- ADRES 1348 "0000000000000000", -- ADRES 1349 "0000000000000000", -- ADRES 1350 "0000000000000000", -- ADRES 1351 "0000000000000000", -- ADRES 1352 "0000000000000000", -- ADRES 1353 "0000000000000000", -- ADRES 1354 "0000000000000000", -- ADRES 1355 "0000000000000000", -- ADRES 1356 "0000000000000000", -- ADRES 1357 "0000000000000000", -- ADRES 1358 "0000000000000000", -- ADRES 1359 "0000000000000000", -- ADRES 1360 "0000000000000000", -- ADRES 1361 "0000000000000000", -- ADRES 1362 "0000000000000000", -- ADRES 1363 "0000000000000000", -- ADRES 1364 "0000000000000000", -- ADRES 1365 "0000000000000000", -- ADRES 1366 "0000000000000000", -- ADRES 1367 "0000000000000000", -- ADRES 1368 "0000000000000000", -- ADRES 1369 "0000000000000000", -- ADRES 1370 "0000000000000000", -- ADRES 1371 "0000000000000000", -- ADRES 1372 "0000000000000000", -- ADRES 1373 "0000000000000000", -- ADRES 1374 "0000000000000000", -- ADRES 1375 "0000000000000000", -- ADRES 1376 "0000000000000000", -- ADRES 1377 "0000000000000000", -- ADRES 1378 "0000000000000000", -- ADRES 1379 "0000000000000000", -- ADRES 1380 "0000000000000000", -- ADRES 1381 "0000000000000000", -- ADRES 1382 "0000000000000000", -- ADRES 1383 "0000000000000000", -- ADRES 1384 "0000000000000000", -- ADRES 1385 "0000000000000000", -- ADRES 1386 "0000000000000000", -- ADRES 1387 "0000000000000000", -- ADRES 1388 "0000000000000000", -- ADRES 1389 "0000000000000000", -- ADRES 1390 "0000000000000000", -- ADRES 1391 "0000000000000000", -- ADRES 1392 "0000000000000000", -- ADRES 1393 "0000000000000000", -- ADRES 1394 "0000000000000000", -- ADRES 1395 "0000000000000000", -- ADRES 1396 "0000000000000000", -- ADRES 1397 "0000000000000000", -- ADRES 1398 "0000000000000000", -- ADRES 1399 "0000000000000000", -- ADRES 1400 "0000000000000000", -- ADRES 1401 "0000000000000000", -- ADRES 1402 "0000000000000000", -- ADRES 1403 "0000000000000000", -- ADRES 1404 "0000000000000000", -- ADRES 1405 "0000000000000000", -- ADRES 1406 "0000000000000000", -- ADRES 1407 "0000000000000000", -- ADRES 1408 "0000000000000000", -- ADRES 1409 "0000000000000000", -- ADRES 1410 "0000000000000000", -- ADRES 1411 "0000000000000000", -- ADRES 1412 "0000000000000000", -- ADRES 1413 "0000000000000000", -- ADRES 1414 "0000000000000000", -- ADRES 1415 "0000000000000000", -- ADRES 1416 "0000000000000000", -- ADRES 1417 "0000000000000000", -- ADRES 1418 "0000000000000000", -- ADRES 1419 "0000000000000000", -- ADRES 1420 "0000000000000000", -- ADRES 1421 "0000000000000000", -- ADRES 1422 "0000000000000000", -- ADRES 1423 "0000000000000000", -- ADRES 1424 "0000000000000000", -- ADRES 1425 "0000000000000000", -- ADRES 1426 "0000000000000000", -- ADRES 1427 "0000000000000000", -- ADRES 1428 "0000000000000000", -- ADRES 1429 "0000000000000000", -- ADRES 1430 "0000000000000000", -- ADRES 1431 "0000000000000000", -- ADRES 1432 "0000000000000000", -- ADRES 1433 "0000000000000000", -- ADRES 1434 "0000000000000000", -- ADRES 1435 "0000000000000000", -- ADRES 1436 "0000000000000000", -- ADRES 1437 "0000000000000000", -- ADRES 1438 "0000000000000000", -- ADRES 1439 "0000000000000000", -- ADRES 1440 "0000000000000000", -- ADRES 1441 "0000000000000000", -- ADRES 1442 "0000000000000000", -- ADRES 1443 "0000000000000000", -- ADRES 1444 "0000000000000000", -- ADRES 1445 "0000000000000000", -- ADRES 1446 "0000000000000000", -- ADRES 1447 "0000000000000000", -- ADRES 1448 "0000000000000000", -- ADRES 1449 "0000000000000000", -- ADRES 1450 "0000000000000000", -- ADRES 1451 "0000000000000000", -- ADRES 1452 "0000000000000000", -- ADRES 1453 "0000000000000000", -- ADRES 1454 "0000000000000000", -- ADRES 1455 "0000000000000000", -- ADRES 1456 "0000000000000000", -- ADRES 1457 "0000000000000000", -- ADRES 1458 "0000000000000000", -- ADRES 1459 "0000000000000000", -- ADRES 1460 "0000000000000000", -- ADRES 1461 "0000000000000000", -- ADRES 1462 "0000000000000000", -- ADRES 1463 "0000000000000000", -- ADRES 1464 "0000000000000000", -- ADRES 1465 "0000000000000000", -- ADRES 1466 "0000000000000000", -- ADRES 1467 "0000000000000000", -- ADRES 1468 "0000000000000000", -- ADRES 1469 "0000000000000000", -- ADRES 1470 "0000000000000000", -- ADRES 1471 "0000000000000000", -- ADRES 1472 "0000000000000000", -- ADRES 1473 "0000000000000000", -- ADRES 1474 "0000000000000000", -- ADRES 1475 "0000000000000000", -- ADRES 1476 "0000000000000000", -- ADRES 1477 "0000000000000000", -- ADRES 1478 "0000000000000000", -- ADRES 1479 "0000000000000000", -- ADRES 1480 "0000000000000000", -- ADRES 1481 "0000000000000000", -- ADRES 1482 "0000000000000000", -- ADRES 1483 "0000000000000000", -- ADRES 1484 "0000000000000000", -- ADRES 1485 "0000000000000000", -- ADRES 1486 "0000000000000000", -- ADRES 1487 "0000000000000000", -- ADRES 1488 "0000000000000000", -- ADRES 1489 "0000000000000000", -- ADRES 1490 "0000000000000000", -- ADRES 1491 "0000000000000000", -- ADRES 1492 "0000000000000000", -- ADRES 1493 "0000000000000000", -- ADRES 1494 "0000000000000000", -- ADRES 1495 "0000000000000000", -- ADRES 1496 "0000000000000000", -- ADRES 1497 "0000000000000000", -- ADRES 1498 "0000000000000000", -- ADRES 1499 "0000000000000000", -- ADRES 1500 "0000000000000000", -- ADRES 1501 "0000000000000000", -- ADRES 1502 "0000000000000000", -- ADRES 1503 "0000000000000000", -- ADRES 1504 "0000000000000000", -- ADRES 1505 "0000000000000000", -- ADRES 1506 "0000000000000000", -- ADRES 1507 "0000000000000000", -- ADRES 1508 "0000000000000000", -- ADRES 1509 "0000000000000000", -- ADRES 1510 "0000000000000000", -- ADRES 1511 "0000000000000000", -- ADRES 1512 "0000000000000000", -- ADRES 1513 "0000000000000000", -- ADRES 1514 "0000000000000000", -- ADRES 1515 "0000000000000000", -- ADRES 1516 "0000000000000000", -- ADRES 1517 "0000000000000000", -- ADRES 1518 "0000000000000000", -- ADRES 1519 "0000000000000000", -- ADRES 1520 "0000000000000000", -- ADRES 1521 "0000000000000000", -- ADRES 1522 "0000000000000000", -- ADRES 1523 "0000000000000000", -- ADRES 1524 "0000000000000000", -- ADRES 1525 "0000000000000000", -- ADRES 1526 "0000000000000000", -- ADRES 1527 "0000000000000000", -- ADRES 1528 "0000000000000000", -- ADRES 1529 "0000000000000000", -- ADRES 1530 "0000000000000000", -- ADRES 1531 "0000000000000000", -- ADRES 1532 "0000000000000000", -- ADRES 1533 "0000000000000000", -- ADRES 1534 "0000000000000000", -- ADRES 1535 "0000000000000000", -- ADRES 1536 "0000000000000000", -- ADRES 1537 "0000000000000000", -- ADRES 1538 "0000000000000000", -- ADRES 1539 "0000000000000000", -- ADRES 1540 "0000000000000000", -- ADRES 1541 "0000000000000000", -- ADRES 1542 "0000000000000000", -- ADRES 1543 "0000000000000000", -- ADRES 1544 "0000000000000000", -- ADRES 1545 "0000000000000000", -- ADRES 1546 "0000000000000000", -- ADRES 1547 "0000000000000000", -- ADRES 1548 "0000000000000000", -- ADRES 1549 "0000000000000000", -- ADRES 1550 "0000000000000000", -- ADRES 1551 "0000000000000000", -- ADRES 1552 "0000000000000000", -- ADRES 1553 "0000000000000000", -- ADRES 1554 "0000000000000000", -- ADRES 1555 "0000000000000000", -- ADRES 1556 "0000000000000000", -- ADRES 1557 "0000000000000000", -- ADRES 1558 "0000000000000000", -- ADRES 1559 "0000000000000000", -- ADRES 1560 "0000000000000000", -- ADRES 1561 "0000000000000000", -- ADRES 1562 "0000000000000000", -- ADRES 1563 "0000000000000000", -- ADRES 1564 "0000000000000000", -- ADRES 1565 "0000000000000000", -- ADRES 1566 "0000000000000000", -- ADRES 1567 "0000000000000000", -- ADRES 1568 "0000000000000000", -- ADRES 1569 "0000000000000000", -- ADRES 1570 "0000000000000000", -- ADRES 1571 "0000000000000000", -- ADRES 1572 "0000000000000000", -- ADRES 1573 "0000000000000000", -- ADRES 1574 "0000000000000000", -- ADRES 1575 "0000000000000000", -- ADRES 1576 "0000000000000000", -- ADRES 1577 "0000000000000000", -- ADRES 1578 "0000000000000000", -- ADRES 1579 "0000000000000000", -- ADRES 1580 "0000000000000000", -- ADRES 1581 "0000000000000000", -- ADRES 1582 "0000000000000000", -- ADRES 1583 "0000000000000000", -- ADRES 1584 "0000000000000000", -- ADRES 1585 "0000000000000000", -- ADRES 1586 "0000000000000000", -- ADRES 1587 "0000000000000000", -- ADRES 1588 "0000000000000000", -- ADRES 1589 "0000000000000000", -- ADRES 1590 "0000000000000000", -- ADRES 1591 "0000000000000000", -- ADRES 1592 "0000000000000000", -- ADRES 1593 "0000000000000000", -- ADRES 1594 "0000000000000000", -- ADRES 1595 "0000000000000000", -- ADRES 1596 "0000000000000000", -- ADRES 1597 "0000000000000000", -- ADRES 1598 "0000000000000000", -- ADRES 1599 "0000000000000000", -- ADRES 1600 "0000000000000000", -- ADRES 1601 "0000000000000000", -- ADRES 1602 "0000000000000000", -- ADRES 1603 "0000000000000000", -- ADRES 1604 "0000000000000000", -- ADRES 1605 "0000000000000000", -- ADRES 1606 "0000000000000000", -- ADRES 1607 "0000000000000000", -- ADRES 1608 "0000000000000000", -- ADRES 1609 "0000000000000000", -- ADRES 1610 "0000000000000000", -- ADRES 1611 "0000000000000000", -- ADRES 1612 "0000000000000000", -- ADRES 1613 "0000000000000000", -- ADRES 1614 "0000000000000000", -- ADRES 1615 "0000000000000000", -- ADRES 1616 "0000000000000000", -- ADRES 1617 "0000000000000000", -- ADRES 1618 "0000000000000000", -- ADRES 1619 "0000000000000000", -- ADRES 1620 "0000000000000000", -- ADRES 1621 "0000000000000000", -- ADRES 1622 "0000000000000000", -- ADRES 1623 "0000000000000000", -- ADRES 1624 "0000000000000000", -- ADRES 1625 "0000000000000000", -- ADRES 1626 "0000000000000000", -- ADRES 1627 "0000000000000000", -- ADRES 1628 "0000000000000000", -- ADRES 1629 "0000000000000000", -- ADRES 1630 "0000000000000000", -- ADRES 1631 "0000000000000000", -- ADRES 1632 "0000000000000000", -- ADRES 1633 "0000000000000000", -- ADRES 1634 "0000000000000000", -- ADRES 1635 "0000000000000000", -- ADRES 1636 "0000000000000000", -- ADRES 1637 "0000000000000000", -- ADRES 1638 "0000000000000000", -- ADRES 1639 "0000000000000000", -- ADRES 1640 "0000000000000000", -- ADRES 1641 "0000000000000000", -- ADRES 1642 "0000000000000000", -- ADRES 1643 "0000000000000000", -- ADRES 1644 "0000000000000000", -- ADRES 1645 "0000000000000000", -- ADRES 1646 "0000000000000000", -- ADRES 1647 "0000000000000000", -- ADRES 1648 "0000000000000000", -- ADRES 1649 "0000000000000000", -- ADRES 1650 "0000000000000000", -- ADRES 1651 "0000000000000000", -- ADRES 1652 "0000000000000000", -- ADRES 1653 "0000000000000000", -- ADRES 1654 "0000000000000000", -- ADRES 1655 "0000000000000000", -- ADRES 1656 "0000000000000000", -- ADRES 1657 "0000000000000000", -- ADRES 1658 "0000000000000000", -- ADRES 1659 "0000000000000000", -- ADRES 1660 "0000000000000000", -- ADRES 1661 "0000000000000000", -- ADRES 1662 "0000000000000000", -- ADRES 1663 "0000000000000000", -- ADRES 1664 "0000000000000000", -- ADRES 1665 "0000000000000000", -- ADRES 1666 "0000000000000000", -- ADRES 1667 "0000000000000000", -- ADRES 1668 "0000000000000000", -- ADRES 1669 "0000000000000000", -- ADRES 1670 "0000000000000000", -- ADRES 1671 "0000000000000000", -- ADRES 1672 "0000000000000000", -- ADRES 1673 "0000000000000000", -- ADRES 1674 "0000000000000000", -- ADRES 1675 "0000000000000000", -- ADRES 1676 "0000000000000000", -- ADRES 1677 "0000000000000000", -- ADRES 1678 "0000000000000000", -- ADRES 1679 "0000000000000000", -- ADRES 1680 "0000000000000000", -- ADRES 1681 "0000000000000000", -- ADRES 1682 "0000000000000000", -- ADRES 1683 "0000000000000000", -- ADRES 1684 "0000000000000000", -- ADRES 1685 "0000000000000000", -- ADRES 1686 "0000000000000000", -- ADRES 1687 "0000000000000000", -- ADRES 1688 "0000000000000000", -- ADRES 1689 "0000000000000000", -- ADRES 1690 "0000000000000000", -- ADRES 1691 "0000000000000000", -- ADRES 1692 "0000000000000000", -- ADRES 1693 "0000000000000000", -- ADRES 1694 "0000000000000000", -- ADRES 1695 "0000000000000000", -- ADRES 1696 "0000000000000000", -- ADRES 1697 "0000000000000000", -- ADRES 1698 "0000000000000000", -- ADRES 1699 "0000000000000000", -- ADRES 1700 "0000000000000000", -- ADRES 1701 "0000000000000000", -- ADRES 1702 "0000000000000000", -- ADRES 1703 "0000000000000000", -- ADRES 1704 "0000000000000000", -- ADRES 1705 "0000000000000000", -- ADRES 1706 "0000000000000000", -- ADRES 1707 "0000000000000000", -- ADRES 1708 "0000000000000000", -- ADRES 1709 "0000000000000000", -- ADRES 1710 "0000000000000000", -- ADRES 1711 "0000000000000000", -- ADRES 1712 "0000000000000000", -- ADRES 1713 "0000000000000000", -- ADRES 1714 "0000000000000000", -- ADRES 1715 "0000000000000000", -- ADRES 1716 "0000000000000000", -- ADRES 1717 "0000000000000000", -- ADRES 1718 "0000000000000000", -- ADRES 1719 "0000000000000000", -- ADRES 1720 "0000000000000000", -- ADRES 1721 "0000000000000000", -- ADRES 1722 "0000000000000000", -- ADRES 1723 "0000000000000000", -- ADRES 1724 "0000000000000000", -- ADRES 1725 "0000000000000000", -- ADRES 1726 "0000000000000000", -- ADRES 1727 "0000000000000000", -- ADRES 1728 "0000000000000000", -- ADRES 1729 "0000000000000000", -- ADRES 1730 "0000000000000000", -- ADRES 1731 "0000000000000000", -- ADRES 1732 "0000000000000000", -- ADRES 1733 "0000000000000000", -- ADRES 1734 "0000000000000000", -- ADRES 1735 "0000000000000000", -- ADRES 1736 "0000000000000000", -- ADRES 1737 "0000000000000000", -- ADRES 1738 "0000000000000000", -- ADRES 1739 "0000000000000000", -- ADRES 1740 "0000000000000000", -- ADRES 1741 "0000000000000000", -- ADRES 1742 "0000000000000000", -- ADRES 1743 "0000000000000000", -- ADRES 1744 "0000000000000000", -- ADRES 1745 "0000000000000000", -- ADRES 1746 "0000000000000000", -- ADRES 1747 "0000000000000000", -- ADRES 1748 "0000000000000000", -- ADRES 1749 "0000000000000000", -- ADRES 1750 "0000000000000000", -- ADRES 1751 "0000000000000000", -- ADRES 1752 "0000000000000000", -- ADRES 1753 "0000000000000000", -- ADRES 1754 "0000000000000000", -- ADRES 1755 "0000000000000000", -- ADRES 1756 "0000000000000000", -- ADRES 1757 "0000000000000000", -- ADRES 1758 "0000000000000000", -- ADRES 1759 "0000000000000000", -- ADRES 1760 "0000000000000000", -- ADRES 1761 "0000000000000000", -- ADRES 1762 "0000000000000000", -- ADRES 1763 "0000000000000000", -- ADRES 1764 "0000000000000000", -- ADRES 1765 "0000000000000000", -- ADRES 1766 "0000000000000000", -- ADRES 1767 "0000000000000000", -- ADRES 1768 "0000000000000000", -- ADRES 1769 "0000000000000000", -- ADRES 1770 "0000000000000000", -- ADRES 1771 "0000000000000000", -- ADRES 1772 "0000000000000000", -- ADRES 1773 "0000000000000000", -- ADRES 1774 "0000000000000000", -- ADRES 1775 "0000000000000000", -- ADRES 1776 "0000000000000000", -- ADRES 1777 "0000000000000000", -- ADRES 1778 "0000000000000000", -- ADRES 1779 "0000000000000000", -- ADRES 1780 "0000000000000000", -- ADRES 1781 "0000000000000000", -- ADRES 1782 "0000000000000000", -- ADRES 1783 "0000000000000000", -- ADRES 1784 "0000000000000000", -- ADRES 1785 "0000000000000000", -- ADRES 1786 "0000000000000000", -- ADRES 1787 "0000000000000000", -- ADRES 1788 "0000000000000000", -- ADRES 1789 "0000000000000000", -- ADRES 1790 "0000000000000000", -- ADRES 1791 "0000000000000000", -- ADRES 1792 "0000000000000000", -- ADRES 1793 "0000000000000000", -- ADRES 1794 "0000000000000000", -- ADRES 1795 "0000000000000000", -- ADRES 1796 "0000000000000000", -- ADRES 1797 "0000000000000000", -- ADRES 1798 "0000000000000000", -- ADRES 1799 "0000000000000000", -- ADRES 1800 "0000000000000000", -- ADRES 1801 "0000000000000000", -- ADRES 1802 "0000000000000000", -- ADRES 1803 "0000000000000000", -- ADRES 1804 "0000000000000000", -- ADRES 1805 "0000000000000000", -- ADRES 1806 "0000000000000000", -- ADRES 1807 "0000000000000000", -- ADRES 1808 "0000000000000000", -- ADRES 1809 "0000000000000000", -- ADRES 1810 "0000000000000000", -- ADRES 1811 "0000000000000000", -- ADRES 1812 "0000000000000000", -- ADRES 1813 "0000000000000000", -- ADRES 1814 "0000000000000000", -- ADRES 1815 "0000000000000000", -- ADRES 1816 "0000000000000000", -- ADRES 1817 "0000000000000000", -- ADRES 1818 "0000000000000000", -- ADRES 1819 "0000000000000000", -- ADRES 1820 "0000000000000000", -- ADRES 1821 "0000000000000000", -- ADRES 1822 "0000000000000000", -- ADRES 1823 "0000000000000000", -- ADRES 1824 "0000000000000000", -- ADRES 1825 "0000000000000000", -- ADRES 1826 "0000000000000000", -- ADRES 1827 "0000000000000000", -- ADRES 1828 "0000000000000000", -- ADRES 1829 "0000000000000000", -- ADRES 1830 "0000000000000000", -- ADRES 1831 "0000000000000000", -- ADRES 1832 "0000000000000000", -- ADRES 1833 "0000000000000000", -- ADRES 1834 "0000000000000000", -- ADRES 1835 "0000000000000000", -- ADRES 1836 "0000000000000000", -- ADRES 1837 "0000000000000000", -- ADRES 1838 "0000000000000000", -- ADRES 1839 "0000000000000000", -- ADRES 1840 "0000000000000000", -- ADRES 1841 "0000000000000000", -- ADRES 1842 "0000000000000000", -- ADRES 1843 "0000000000000000", -- ADRES 1844 "0000000000000000", -- ADRES 1845 "0000000000000000", -- ADRES 1846 "0000000000000000", -- ADRES 1847 "0000000000000000", -- ADRES 1848 "0000000000000000", -- ADRES 1849 "0000000000000000", -- ADRES 1850 "0000000000000000", -- ADRES 1851 "0000000000000000", -- ADRES 1852 "0000000000000000", -- ADRES 1853 "0000000000000000", -- ADRES 1854 "0000000000000000", -- ADRES 1855 "0000000000000000", -- ADRES 1856 "0000000000000000", -- ADRES 1857 "0000000000000000", -- ADRES 1858 "0000000000000000", -- ADRES 1859 "0000000000000000", -- ADRES 1860 "0000000000000000", -- ADRES 1861 "0000000000000000", -- ADRES 1862 "0000000000000000", -- ADRES 1863 "0000000000000000", -- ADRES 1864 "0000000000000000", -- ADRES 1865 "0000000000000000", -- ADRES 1866 "0000000000000000", -- ADRES 1867 "0000000000000000", -- ADRES 1868 "0000000000000000", -- ADRES 1869 "0000000000000000", -- ADRES 1870 "0000000000000000", -- ADRES 1871 "0000000000000000", -- ADRES 1872 "0000000000000000", -- ADRES 1873 "0000000000000000", -- ADRES 1874 "0000000000000000", -- ADRES 1875 "0000000000000000", -- ADRES 1876 "0000000000000000", -- ADRES 1877 "0000000000000000", -- ADRES 1878 "0000000000000000", -- ADRES 1879 "0000000000000000", -- ADRES 1880 "0000000000000000", -- ADRES 1881 "0000000000000000", -- ADRES 1882 "0000000000000000", -- ADRES 1883 "0000000000000000", -- ADRES 1884 "0000000000000000", -- ADRES 1885 "0000000000000000", -- ADRES 1886 "0000000000000000", -- ADRES 1887 "0000000000000000", -- ADRES 1888 "0000000000000000", -- ADRES 1889 "0000000000000000", -- ADRES 1890 "0000000000000000", -- ADRES 1891 "0000000000000000", -- ADRES 1892 "0000000000000000", -- ADRES 1893 "0000000000000000", -- ADRES 1894 "0000000000000000", -- ADRES 1895 "0000000000000000", -- ADRES 1896 "0000000000000000", -- ADRES 1897 "0000000000000000", -- ADRES 1898 "0000000000000000", -- ADRES 1899 "0000000000000000", -- ADRES 1900 "0000000000000000", -- ADRES 1901 "0000000000000000", -- ADRES 1902 "0000000000000000", -- ADRES 1903 "0000000000000000", -- ADRES 1904 "0000000000000000", -- ADRES 1905 "0000000000000000", -- ADRES 1906 "0000000000000000", -- ADRES 1907 "0000000000000000", -- ADRES 1908 "0000000000000000", -- ADRES 1909 "0000000000000000", -- ADRES 1910 "0000000000000000", -- ADRES 1911 "0000000000000000", -- ADRES 1912 "0000000000000000", -- ADRES 1913 "0000000000000000", -- ADRES 1914 "0000000000000000", -- ADRES 1915 "0000000000000000", -- ADRES 1916 "0000000000000000", -- ADRES 1917 "0000000000000000", -- ADRES 1918 "0000000000000000", -- ADRES 1919 "0000000000000000", -- ADRES 1920 "0000000000000000", -- ADRES 1921 "0000000000000000", -- ADRES 1922 "0000000000000000", -- ADRES 1923 "0000000000000000", -- ADRES 1924 "0000000000000000", -- ADRES 1925 "0000000000000000", -- ADRES 1926 "0000000000000000", -- ADRES 1927 "0000000000000000", -- ADRES 1928 "0000000000000000", -- ADRES 1929 "0000000000000000", -- ADRES 1930 "0000000000000000", -- ADRES 1931 "0000000000000000", -- ADRES 1932 "0000000000000000", -- ADRES 1933 "0000000000000000", -- ADRES 1934 "0000000000000000", -- ADRES 1935 "0000000000000000", -- ADRES 1936 "0000000000000000", -- ADRES 1937 "0000000000000000", -- ADRES 1938 "0000000000000000", -- ADRES 1939 "0000000000000000", -- ADRES 1940 "0000000000000000", -- ADRES 1941 "0000000000000000", -- ADRES 1942 "0000000000000000", -- ADRES 1943 "0000000000000000", -- ADRES 1944 "0000000000000000", -- ADRES 1945 "0000000000000000", -- ADRES 1946 "0000000000000000", -- ADRES 1947 "0000000000000000", -- ADRES 1948 "0000000000000000", -- ADRES 1949 "0000000000000000", -- ADRES 1950 "0000000000000000", -- ADRES 1951 "0000000000000000", -- ADRES 1952 "0000000000000000", -- ADRES 1953 "0000000000000000", -- ADRES 1954 "0000000000000000", -- ADRES 1955 "0000000000000000", -- ADRES 1956 "0000000000000000", -- ADRES 1957 "0000000000000000", -- ADRES 1958 "0000000000000000", -- ADRES 1959 "0000000000000000", -- ADRES 1960 "0000000000000000", -- ADRES 1961 "0000000000000000", -- ADRES 1962 "0000000000000000", -- ADRES 1963 "0000000000000000", -- ADRES 1964 "0000000000000000", -- ADRES 1965 "0000000000000000", -- ADRES 1966 "0000000000000000", -- ADRES 1967 "0000000000000000", -- ADRES 1968 "0000000000000000", -- ADRES 1969 "0000000000000000", -- ADRES 1970 "0000000000000000", -- ADRES 1971 "0000000000000000", -- ADRES 1972 "0000000000000000", -- ADRES 1973 "0000000000000000", -- ADRES 1974 "0000000000000000", -- ADRES 1975 "0000000000000000", -- ADRES 1976 "0000000000000000", -- ADRES 1977 "0000000000000000", -- ADRES 1978 "0000000000000000", -- ADRES 1979 "0000000000000000", -- ADRES 1980 "0000000000000000", -- ADRES 1981 "0000000000000000", -- ADRES 1982 "0000000000000000", -- ADRES 1983 "0000000000000000", -- ADRES 1984 "0000000000000000", -- ADRES 1985 "0000000000000000", -- ADRES 1986 "0000000000000000", -- ADRES 1987 "0000000000000000", -- ADRES 1988 "0000000000000000", -- ADRES 1989 "0000000000000000", -- ADRES 1990 "0000000000000000", -- ADRES 1991 "0000000000000000", -- ADRES 1992 "0000000000000000", -- ADRES 1993 "0000000000000000", -- ADRES 1994 "0000000000000000", -- ADRES 1995 "0000000000000000", -- ADRES 1996 "0000000000000000", -- ADRES 1997 "0000000000000000", -- ADRES 1998 "0000000000000000", -- ADRES 1999 "0000000000000000", -- ADRES 2000 "0000000000000000", -- ADRES 2001 "0000000000000000", -- ADRES 2002 "0000000000000000", -- ADRES 2003 "0000000000000000", -- ADRES 2004 "0000000000000000", -- ADRES 2005 "0000000000000000", -- ADRES 2006 "0000000000000000", -- ADRES 2007 "0000000000000000", -- ADRES 2008 "0000000000000000", -- ADRES 2009 "0000000000000000", -- ADRES 2010 "0000000000000000", -- ADRES 2011 "0000000000000000", -- ADRES 2012 "0000000000000000", -- ADRES 2013 "0000000000000000", -- ADRES 2014 "0000000000000000", -- ADRES 2015 "0000000000000000", -- ADRES 2016 "0000000000000000", -- ADRES 2017 "0000000000000000", -- ADRES 2018 "0000000000000000", -- ADRES 2019 "0000000000000000", -- ADRES 2020 "0000000000000000", -- ADRES 2021 "0000000000000000", -- ADRES 2022 "0000000000000000", -- ADRES 2023 "0000000000000000", -- ADRES 2024 "0000000000000000", -- ADRES 2025 "0000000000000000", -- ADRES 2026 "0000000000000000", -- ADRES 2027 "0000000000000000", -- ADRES 2028 "0000000000000000", -- ADRES 2029 "0000000000000000", -- ADRES 2030 "0000000000000000", -- ADRES 2031 "0000000000000000", -- ADRES 2032 "0000000000000000", -- ADRES 2033 "0000000000000000", -- ADRES 2034 "0000000000000000", -- ADRES 2035 "0000000000000000", -- ADRES 2036 "0000000000000000", -- ADRES 2037 "0000000000000000", -- ADRES 2038 "0000000000000000", -- ADRES 2039 "0000000000000000", -- ADRES 2040 "0000000000000000", -- ADRES 2041 "0000000000000000", -- ADRES 2042 "0000000000000000", -- ADRES 2043 "0000000000000000", -- ADRES 2044 "0000000000000000", -- ADRES 2045 "0000000000000000", -- ADRES 2046 "0000000000000000" -- ADRES 2047 ); -- Informacja o wykorzystanej pamieci: -- Wykorzystano 12 bajtow z 4096. -- Pozostalo 4084 bajtow z 4096. begin process (Clk, WE, Cnt) begin if Clk'event and Clk = '0' then if WE = '1' then ROM(conv_integer(TOS)) <= DI; end if; if Cnt = "00" then DO <= ROM(conv_integer(PC)) ; end if; end if; end process; end Behavioral; Nie jest to właściwe miejsce, ale program kompilatora napisany w cpp jest powiązany z procesorem i dla tego udostępniam go tutaj: #include <iostream> #include <string> #include <algorithm> #include <fstream> #include <cstdlib> #include <windows.h> #include <vector> #include <sstream> #include <cctype> #include <cstring> #include <commdlg.h> using namespace std; string dec2p(int liczba, int podstawa) { string wynik = ""; int reszta; if (liczba == 0) wynik = "00000"; while (liczba > 0) { reszta = liczba % podstawa; if (reszta < 10) wynik = char(reszta + 48) + wynik; else wynik = char(reszta + 48 + 7) + wynik; liczba = liczba / podstawa; } return wynik; } bool jestLiczba(const std::string& str){ std::stringstream ss(str); int liczba; ss>> std::noskipws >> liczba; return ss.eof() && !ss.fail(); } bool poczatekHApostrof(const std::string &str){ return str.length() >= 2 && str[0] == 'H' && str[1] == '\''; } bool poczatekBApostrof(const std::string &str){ return str.length() >= 2 && str[0] == 'B' && str[1] == '\''; } void usunPierwszeZnaki (std::string &str) { if (str.length() >= 2) { str.erase(0, 2); } } void usunOstatniZnak (std::string &str) { if (!str.empty()) { str.erase(str.size() - 1); } } std::string hexToDec(const std::string &hexStr) { unsigned int liczbaDziesietna; std::stringstream ss; ss << std::hex <<hexStr; ss >> liczbaDziesietna; std::stringstream wynikStream; wynikStream << liczbaDziesietna; return wynikStream.str(); } // kopiujemy nazwę pliku asm std::string nazwaPlikuBezSciezki(const std::string& sciezka) { size_t pos = sciezka.find_last_of("\\/"); if (pos == std::string::npos) return sciezka; return sciezka.substr(pos + 1); } // zamieniamy rozszerzenie asm na bin std::string zamienRozszerzenieNaBIN(const std::string& sciezka) { size_t pos = sciezka.find_last_of('.'); if (pos == std::string::npos) return sciezka + ".bin"; return sciezka.substr(0, pos) + ".bin"; } // okno dialogowe wyboru pliku dla kompilatora std::string wybierzPlikASM() { OPENFILENAME ofn; char nazwaPliku[MAX_PATH] = ""; ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = NULL; ofn.lpstrFilter = "Pliki ASM\0*.asm\0Wszystkie pliki\0*.*\0"; ofn.lpstrFile = nazwaPliku; ofn.nMaxFile = MAX_PATH; ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST; ofn.lpstrDefExt = "asm"; if (GetOpenFileName(&ofn)) { return std::string(nazwaPliku); } return ""; } std::string binToDec(const std::string &binStr) { int decValue = 0; int base = 1; for (int i = binStr.length() - 2; i >= 0; i--) { if (binStr[i] == '1') { decValue += base; } base *= 2; } std::stringstream ss; ss << decValue; return ss.str(); } int main() { std::fstream bin; std::fstream plik_tekstowy_asm; std::string linia; std::string slowoAsm1; std::string slowoAsm2; std::string slowoAsm3; std::string slowo11; std::string slowo12; std::string slowo21; std::string slowo13; std::string slowo1 [4096]; std::string slowo2 [4096]; std::string slowo3 [4096]; std::string defineSlowo [4096]; std::string defineIndeks [4096]; std::string interuptSlowo [4096]; std::string interuptIndeks [4096]; std::stringstream ss; int in = 0; int inDefine = 0; int inInterupt = 0; int adresInterupt = 0; int indeks = 0; int liczbaInstrukcje; int liczbaWartosc; int adresKodu = 0; int adresKodu0 = 0; std::string liczbabin = ""; std::string liczbaadd = ""; std::string adresRom; std::string instrukcje[] = { "NOP" , "MOVLB", "MOVEB", "MOVRB", "ANDRB", "IORRB", "XORRB", "COMR" , "ADDRB", "SUBRB", "RRR" , "RLR" , "SWAPR", "MULRB", "SETC" , "CLRC" , "RETLB", "RETURN" , "RETFIE" , "MOVRE", "SKIPC", "SKIPZ", "SKIPDC", "SKIPE", "GOTO" , "CALL" , "WEEN" , "ADDPC", "MOVBR", "MOVER", "SETR" , "CLRR" }; //odczytujemy plik tekstowy ASM std::string sciezkaASM = wybierzPlikASM(); if (sciezkaASM == "") { cout << "Nie wybrano pliku ASM.\n"; return 0; } // Tworzymy ścieżkę BIN na podstawie ścieżki ASM std::string sciezkaBIN = zamienRozszerzenieNaBIN(sciezkaASM); // Otwieramy plik ASM plik_tekstowy_asm.open(sciezkaASM, ios::in); // Dodajemy komentarz z nazwą źródła bin << "-- Zrodlo ASM: " << sciezkaASM << endl << endl; if (!plik_tekstowy_asm.good()) { plik_tekstowy_asm.close(); goto indeks1; } while (getline(plik_tekstowy_asm, linia)) { if (!linia.empty()) { transform(linia.begin(), linia.end(), linia.begin(), ::toupper); istringstream iss(linia); iss >> slowoAsm1; if (slowoAsm1 == "") slowoAsm1 = "0"; iss >> slowoAsm2; if (slowoAsm2 == "") slowoAsm2 = "0"; iss >> slowoAsm3; if (slowoAsm3 == "") slowoAsm3 = "0"; slowo1[in] = slowoAsm1; slowo2[in] = slowoAsm2; slowo3[in] = slowoAsm3; slowoAsm1 = ""; slowoAsm2 = ""; slowoAsm3 = ""; in = in + 1; } } indeks1: // Otwieramy plik BIN w tej samej lokalizacji bin.open(sciezkaBIN, ios::out | ios::trunc); bin << endl; bin << "-- Zrodlo: " << sciezkaASM << endl << endl; bin << "library IEEE;" << endl; bin << "use IEEE.STD_LOGIC_1164.ALL;" << endl; bin << "use IEEE.STD_LOGIC_ARITH.ALL;" << endl; bin << "use IEEE.STD_LOGIC_UNSIGNED.ALL;" << endl; bin << endl; bin << "entity ROM is" << endl; bin << " Port ( Clk : in STD_LOGIC;" << endl; bin << " WE : in STD_LOGIC;" << endl; bin << " DI : in STD_LOGIC_VECTOR (15 downto 0);" << endl; bin << " Cnt : in STD_LOGIC_VECTOR (1 downto 0);" << endl; bin << " TOS : in STD_LOGIC_VECTOR (10 downto 0);" << endl; bin << " PC : in STD_LOGIC_VECTOR (10 downto 0);" << endl; bin << " DO : out STD_LOGIC_VECTOR (15 downto 0));" << endl; bin << endl; bin << "end ROM;" << endl; bin << endl; bin << "architecture Behavioral of ROM is" << endl; bin << endl; bin << "type rom_type is array (0 to 2047) of std_logic_vector (15 downto 0);" << endl; bin << "signal ROM: rom_type := (" << endl; bin << endl; for (int i = 0; i < in; i++) { slowo11 = slowo1[i]; slowo12 = slowo2[i]; slowo21 = slowo2[i]; slowo13 = slowo3[i]; if (poczatekHApostrof(slowo12)) { usunPierwszeZnaki(slowo12); usunOstatniZnak(slowo12); slowo12 = hexToDec(slowo12); } if (poczatekBApostrof(slowo12)) { usunPierwszeZnaki(slowo12); usunOstatniZnak(slowo12); slowo12 = binToDec(slowo12); } if (poczatekHApostrof(slowo13)) { usunPierwszeZnaki(slowo13); usunOstatniZnak(slowo13); slowo13 = hexToDec(slowo13); } if (poczatekBApostrof(slowo13)) { usunPierwszeZnaki(slowo13); usunOstatniZnak(slowo13); slowo13 = binToDec(slowo13); } if (indeks == 0) { if (slowo11 == "END") { bin << endl; indeks = indeks + 1; i = 0; } else if (slowo11 == "#DEFINE") { defineSlowo[inDefine] = slowo12; defineIndeks[inDefine] = slowo13; bin << "-- " << "definicje" << " " << slowo12 << " = " << slowo3[i] << endl; inDefine = inDefine + 1; } } else if (indeks == 1) { if (slowo11 == "END") { bin << endl; indeks = indeks + 1; i = 0; } else { for (int i = 0; i <= sizeof(instrukcje) / sizeof(instrukcje[0]); ++i) { if (i == 32) { if (slowo11 != "#DEFINE") { if (slowo11 != "//") { interuptSlowo[inInterupt] = slowo11; ss.str(""); ss << adresInterupt; interuptIndeks[inInterupt] = ss.str(); bin << "-- " << "adresy przerwan" << " " << slowo11 << " = " << adresInterupt << endl; inInterupt = inInterupt + 1; break; } } break; } else if (instrukcje[i] == slowo11) { adresInterupt = adresInterupt + 1; break; } } } } else if (indeks == 2) { for (int i = 0; i <= sizeof(instrukcje) / sizeof(instrukcje[0]); ++i) { if (i == 32) { break; } else if (instrukcje[i] == slowo11) { liczbaInstrukcje = i; liczbaWartosc = 4095; if (jestLiczba(slowo12)) { liczbaWartosc = std::atoi(slowo12.c_str()); } else { for (int i = 0; i < (inDefine + 1) ; i++) { if (i == inDefine) { break; } else if (defineSlowo[i] == slowo12) { liczbaWartosc = std::atoi(defineIndeks[i].c_str()); break; } } for (int i = 0; i < (adresInterupt + 1) ; i++) { if (i == adresInterupt) { break; } else if (interuptSlowo[i] == slowo12) { liczbaWartosc = std::atoi(interuptIndeks[i].c_str()); break; } } } if (liczbaWartosc < 4095) { liczbabin = dec2p(liczbaInstrukcje, 2); int liczbabinLength = 5; if (liczbabin.length() < liczbabinLength) { liczbabin.insert(0, liczbabinLength - liczbabin.length(), '0'); } liczbaadd = dec2p(liczbaWartosc, 2); int liczbaaddLength = 11; if (liczbaadd.length() < liczbaaddLength) { liczbaadd.insert(0, liczbaaddLength - liczbaadd.length(), '0'); } ss.str(""); ss << adresKodu; adresRom = ss.str(); int adresLegth = 4; if (adresRom.length() < adresLegth) { adresRom.insert(0, adresLegth - adresRom.length(), '0'); } bin << '"' <<liczbabin << liczbaadd << '"' << ',' << " -- " << "ADRES " << adresRom << " | " << slowo11 << " " << slowo21 << endl; adresKodu = adresKodu + 1; break; } else if (liczbaWartosc == 4095) { bin << "-- BLAD POLECENIA ! (" << slowo11 << " " << slowo12 << ") ???" << endl; break; } } } } } adresKodu0 = adresKodu; for (adresKodu; adresKodu < 2047; ++adresKodu) { ss.str(""); ss << adresKodu; adresRom = ss.str(); int adresLegth = 4; if (adresRom.length() < adresLegth) { adresRom.insert(0, adresLegth - adresRom.length(), '0'); } bin << '"' << "0000000000000000" << '"' << ',' << " -- " << "ADRES " << adresRom << endl; } bin << '"' << "0000000000000000" << '"' << " -- " << "ADRES " << adresKodu << endl; bin << " );" << endl; bin << endl; bin << "-- Informacja o wykorzystanej pamieci:" << endl; bin << "-- Wykorzystano " << (adresKodu0 * 2) << " bajtow z 4096." << endl; bin << "-- Pozostalo " << (4096 - (adresKodu0 * 2)) << " bajtow z 4096." << endl; bin << endl; bin << "begin" << endl; bin << endl; bin << "process (Clk, WE, Cnt)" << endl; bin << "begin" << endl; bin << " if Clk'event and Clk = '0' then" << endl; bin << " if WE = '1' then" << endl; bin << " ROM(conv_integer(TOS)) <= DI;" << endl; bin << " end if;" << endl; bin << " if Cnt = " << '"' << "00" << '"' << " then" << endl; bin << " DO <= ROM(conv_integer(PC)) ;" << endl; bin << " end if;" << endl; bin << " end if;" << endl; bin << "end process;" << endl; bin << endl; bin << endl; bin << "end Behavioral;" ; bin.close(); return 0; } dla ciekawych dodałem skompresowany plik kompilatora AGNES_1 exe. AGNES_1.zip Edytowano 18 maja przez kroszkanorber 3
kroszkanorber 18 maja Autor tematu Udostępnij 18 maja (edytowany) W następnym wpisie podam przykłady poprawnego używania języka assembler w moim procesorze. Edytowano 18 maja przez kroszkanorber
Sylba 18 maja Udostępnij 18 maja Projekt zapewne ambitny, ale prezentacja kompletnie niezrozumiała. Nie wystarczy coś stworzyć, na koniec trzeba to sprzedać. 1
kroszkanorber 18 maja Autor tematu Udostępnij 18 maja @Sylbaw kolejnych wpisach wytłumaczę jak działa kod i jak jest skonstruowany. Rozłożę kod na małe bloki (funkcje) które będą bardziej zrozumiałe. 1
kroszkanorber 18 maja Autor tematu Udostępnij 18 maja witam. Opis architektury układu: Działanie procesora jest powiązane z kodem zapisanym w pamięci ROM. Pamięć ROM ma zapisany kod wykonujący się w układzie. Procesor pobiera dane na podstawie sygnałów elektrycznych występujących na wyjściu danych pamięci ROM. Czyli pamięć ROM nie wpływa na działanie procesora a jedynie wysyła "bezmyślnie" dane. Pamięć ROM można zapisać dowolnie i nie ma to znaczenia dla użytkownika dopóki procesor robi co mu się każe. Wielu się na pewno nie zgodzi z moim tokiem myślenia, ale moim celem jest postawienie granicy między kodem a architekturą procesora. Chcę wykazać, że kody nie są własnością procesora, ale twórczością programisty i tak chcę być zrozumiany. Umiejętność kodowania dla mnie jest porównywalna do operowania obcym językiem. Trzeba zrozumieć zasady, metodę wyrażania intencji i sposób w jaki możemy przekazać to dla odbiorcy by zinterpretował to tak jak tego oczekujemy. Procesor ma 5 bitowe instrukcje. w 5 bitach można zapisać 32 różne stany i są one instrukcjami procesora. (Procesor posiada 32 instrukcje, a suma wszystkich instrukcji jest produktem "SEL"). W procesorze jedno słowo instrukcji ma długość 16 bitów. Po odjęciu 5 bitów na instrukcję dla dekodera SEL zostaje 11 bitów. Te ostanie bity są używane dla adresu (np. skoki, wywołania, zapis do pamięci ram). Wyjątkiem są operacje kopiowania danych z pamięci ROM gdzie wykorzystujemy tylko 8 bitów a pozostałe zapisuję zerami. Procesor ma cykl wykonania instrukcji = 4 tkty. W pierwszym takcie pobiera dane, w następnych przetwarza, a w 4 takcie zapisuje wynik i inkrementuje PC(Licznik programu), lub wykonuje skok warunkowy, lub odpowiada na przerwanie z zewnątrz, w zależności od instrukcji i stanu procesora. To co piszę może wydawać się skomplikowane, ale tak nie jest. Myśląc o procesorze należy zwrócić uwagę na zależność (akcja-reakcja). Procesor nie myśli, tylko reaguje na prąd na liniach adresowych i danych. Zapewniam że nic więcej nie potrafi... Podsumowując. Budowę procesora można zrozumieć tylko, gdy poznamy budowę bramek logicznych. Zrozumienie jak przepływają sygnały w bramkach logicznych odtajni zrozumienie kodów nawet w cpp i innych językach wyższego poziomu. Na początek podaje zestaw instrukcji. W następnych postach wyjaśnię jak zaimplementowałem te instrukcje. ----------------------------------------------------------------------------------- -- -- ----------------------------------------------------------------------------------- -- -- pamięć ROM 16b x 2048 -- -- mapa pamięci ROM -- "SEL" + "INSADDR" = "iiiii" + "aaa aaaa aaaa" = pamięć ROM (16 bit) [5bit instrukcje|11bit adres instrukcji] -- "SEL" + "ROMADDR" = "iiiii" + "rrr rrrr rrrr" = pamięć ROM (16 bit) [5bit instrukcje|11bit adres pamięci RAM] -- "SEL" + "ROMDATA" = "iiiii" + "xxx bbbb bbbb" = pamięć ROM (16 bit) [5bit instrukcje|3bit nieużywane|8bit dane] -- -- licznik taktów kontrolera (4 takty na 1 istrukcję) -- Cnt = "00" <- pobieranie instrukcji z pamięci ROM -- Cnt = "01" <- pobieranie danych z pamięci RAM -- Cnt = "10" <- wykonanie instrukcji -- Cnt = "11" <- wykonanie instrukcji, zmiana zawartości licznika instrukcji, zapis danych do pamięci RAM|rejestru B|PORT_O -- ----------------------------------------------------------------------------------- -- -- instrukcje -- -- NOP "00000" -- instrukcja pusta -- MOVLB "00001" -- instrukcja kopiująca dane ROM do rejestru B -- MOVEB "00010" -- instrukcja kopiująca dane prortu zewnętrznego do rejestru B -- MOVRB "00011" -- instrukcja kopiująca dane RAM do rejestru B -- ANDRB "00100" -- instrukcja RAM and B wynik zapisywany w RAM pod tym samym adresem -- IORRB "00101" -- instrukcja RAM or B wynik zapisywany w RAM pod tym samym adresem -- XORRB "00110" -- instrukcja RAM xor B wynik zapisywany w RAM pod tym samym adresem -- COMR "00111" -- instrukcja not RAM wynik zapisywany w RAM pod tym samym adresem -- ADDRB "01000" -- instrukcja (CARRY & RAM) + B -- SUBRB "01001" -- instrukcja (CARRY & RAM) - B -- RRR "01010" -- instrukcja CARRY & RAM rotacja w prawo -- RLR "01011" -- instrukcja CARRY & RAM rotacja w lewo -- SWAPR "01100" -- instrukcja zamiane 4 bit starszych z młodszymi wynik zapisywany w RAM pod tym samym adresem -- MULRB "01101" -- instrukcja monożenie RAM i B wynik (7 downto 0) zapisywany w RAM pod tym samym adresem reszta w B -- SETC "01110" -- instrukcja ustawienie bitu CARY w stanie wysokim i przepisanie zawartości RAM bez zmian -- CLRC "01111" -- instrukcja ustawienie bitu CARY w stanie niskim i przepisanie zawartości RAM bez zmian -- RETLB "10000" -- instrukcja powrotu z przerwania programowego kopiująca dane ROM do rejestru B -- RETURN "10001" -- instrukcja powrotu z przerwania programowego -- RETFIE "10010" -- instrukcja powrotu z przerwania z zewnątrz -- MOVBE "10011" -- instrukcja kopiująca B lub RAM do portu zewnętrznego -- SKIPC "101000" -- instrukcja skoku warunkowego CARRY -- SKIPDC "101001" -- instrukcja skoku warunkowego DIGITAL CARRY -- SKIPZ "101001" -- instrukcja skoku warunkowego ZERO -- SKIPE "101010" -- instrukcja skoku warunkowego R = B -- SKIPU "101011" -- instrukcja skoku warunkowego R > B -- SKIPL "101100" -- instrukcja skoku warunkowego R < B -- GOTO "11000" -- instrukcja skoku do wybranego adresu w programie -- CALL "11001" -- instrukcja skoku do wybranego adresu w programie z zapisem adresu powrotu i zmianą licznika przerwań -- WEEN "11010" -- instrukcje dla urządzeń zewnętrznych (zakodowany sygnał WE dla 1 z 2048 adresów) -- ADDPC "11011" -- instrukcja skoku do "tabeli" zapisanej w pamięci ROM (256 adresów) -- MOVBR "11100" -- instrukcja kopiująca rejestr B do pamięci RAM -- MOVER "11101" -- instrukcja kopiująca port zewnętrzny do pamięci RAM -- SETR "11110" -- instrukcja ustawiająca wszystkie bity w wybranej komórce RAM na 1 -- CLRR "11111" -- instrukcja ustawiająca wszystkie bity w wybranej komórce RAM na 0 -- ------------------------------------------------------------------------- pozdrawiam. 2
kroszkanorber 18 maja Autor tematu Udostępnij 18 maja Czuje się zobowiązany wyjaśnić co to jest właściwie FPGA zanim wyjaśnię strukturę kodów. Ogólna budowa FPGA FPGA to matryca powtarzalnych bloków logicznych, połączonych ze sobą programowalną siecią routingu. Każdy blok logiczny (CLB) składa się z: LUT — programowalnych tablic prawdy rejestrów D — do przechowywania stanu carry‑chain — sprzętowego toru przeniesienia multiplekserów — do wyboru ścieżek sygnału Dodatkowo FPGA zawiera bloki specjalne: BRAM — pamięci blokowe DSP — szybkie mnożniki i akumulatory PLL/MMCM — generatory i modyfikatory zegara Najważniejsze jest zrozumienie, że FPGA to układ programowalny, a nie zestaw gotowych bramek logicznych. LUT — programowalna tablica prawdy LUT (Look‑Up Table) to mała pamięć SRAM, która implementuje dowolną funkcję logiczną. Wejścia LUT są adresami, a wyjście to 1‑bitowa wartość odczytana z pamięci. Przykład: LUT o 4 wejściach ma 16 komórek pamięci: Kod adres = ABCD dane = wynik funkcji logicznej Jeśli chcemy zbudować bramkę AND: programujemy komórkę 1111 = 1 wszystkie pozostałe komórki = 0 To wszystko. FPGA nie liczy funkcji logicznych — FPGA odczytuje wynik z pamięci. Dlatego LUT może być: AND, OR, XOR, NAND, NOR, dowolną kombinacją powyższych, fragmentem dekodera, fragmentem ALU To jest fundament działania całego FPGA. Carry‑chain — sprzętowy tor przeniesienia To jeden z najważniejszych elementów FPGA. Carry‑chain to dedykowana, sprzętowa ścieżka, która realizuje: dodawanie, odejmowanie, rotacje z przeniesieniem, operacje na flagach I robi to szybciej niż LUT, bo: ma własne połączenia, omija sieć routingu, działa równolegle, jest zoptymalizowany sprzętowo Dlatego: W FPGA dodawanie nie jest realizowane przez LUT, tylko przez sprzętowy carry‑chain. Wystarczy w VHDL napisać A + B, a syntezator sam użyje carry‑chain. Nie trzeba budować sumatora ręcznie. Rejestry D — pamięć stanu Każdy CLB zawiera rejestry D. Służą one do: przechowywania wyników, synchronizacji sygnałów, budowania pipeline, stabilizacji logiki sekwencyjnej Rejestry są integralną częścią FPGA — nie są opcjonalne. To one decydują o: szybkości układu, stabilności czasowej, poprawności działania logiki W AGNES rejestry odpowiadają m.in. za: licznik programu, rejestr B, rejestry RAM, rejestry stanu (CARRY, ZERO itd.) CLB — kompletny blok logiczny CLB to „kafelek”, z którego zbudowane jest FPGA. CLB = LUT + rejestry + carry‑chain + mux CLB potrafi: realizować logikę kombinacyjną (LUT) realizować logikę sekwencyjną (rejestry) wykonywać szybkie operacje arytmetyczne (carry‑chain) przełączać ścieżki sygnałów (mux) To właśnie CLB jest podstawą implementacji: dekodera instrukcji, ALU, logiki sterującej, liczników, rejestrów, magistral danych Routing — programowalne połączenia Routing to najbardziej wrażliwy element FPGA. To on decyduje o: czasie propagacji sygnału, opóźnieniach, stabilności czasowej, zużyciu zasobów Kod napisany nieumiejętnie może: wymusić długie ścieżki sygnału, przeciążyć sieć routingu, spowodować błędy czasowe, wygenerować komunikat „brak zasobów”, mimo że LUT są wolne Dlatego styl pisania VHDL ma ogromne znaczenie. Podsumowanie FPGA to nie procesor i nie układ TTL. To programowalna matryca logiczna, która: działa równolegle, jest szybka, jest elastyczna, pozwala tworzyć własne architektury CPU, pozwala implementować logikę dokładnie tak, jak chcemy Zrozumienie LUT, carry‑chain, rejestrów i CLB jest konieczne, zanim przejdziemy do: struktury kodu VHDL, budowy ALU, implementacji instrukcji AGNES Informacje które podałem nie są pełne, ale wystarczają dla większości projektów. Świadomość co programuje pozwala mi szybciej zdiagnozować błędy w kodzie. pozdrawiam.
kroszkanorber 20 maja Autor tematu Udostępnij 20 maja (edytowany) Witam. Instrukcje ALU mojego procesora. ------------------------------------------------------------------------- -- jednostka arytmetyczno logiczna ADNRB <= ('0' & (R and B)) when (Sel = "00100") else (others => '0'); IORRB <= ('0' & (R or B)) when (Sel = "00101") else (others => '0'); XORRB <= ('0' & (R xor B)) when (Sel = "00110") else (others => '0'); COMR <= ('0' & (not R)) when (Sel = "00111") else (others => '0'); ADDRB <= ((C & (R)) + ('0' & (B))) when (Sel = "01000") else (others => '0'); SUBRB <= ((C & (R)) - ('0' & (B))) when (Sel = "01001") else (others => '0'); RRR <= (R(0) & C & R(7 downto 1)) when (Sel = "01010") else (others => '0'); RLR <= (R(7 downto 0) & C) when (Sel = "01011") else (others => '0'); SWAPR <= ('0' & R(3 downto 0) & R(7 downto 4)) when (Sel = "01100") else (others => '0'); PROD <= (R(7 downto 0) * B(7 downto 0)) when (Sel = "01101") else (others => '0'); SETC <= ('1' & R) when (Sel = "01110") else (others => '0'); CLRC <= ('0' & R) when (Sel = "01111") else (others => '0'); MOVBR <= ('0' & B) when (Sel = "11100") else (others => '0'); MOVER <= ('0' & PORT_I) when (Sel = "11101") else (others => '0'); SETR <= ('0' & "11111111") when (Sel = "11110") else (others => '0'); CLRR <= ('0' & "00000000") when (Sel = "11111") else (others => '0'); PRODL <= ('0' & PROD(7 downto 0)); --przypisanie wyników działań do wyjścia Q Q <= ADNRB or IORRB or XORRB or COMR or ADDRB or SUBRB or RRR or RLR or SWAPR or SETC or CLRC or PRODL or MOVBR or MOVER or SETR or CLRR; ------------------------------------------------------------------------- Jednostka ALU jest sercem operacji każdego procesora. W nim wykonywane są obliczenia a wynik ALU jest ostatecznie podawany na wyjściu Q. ALU nie posiada rejestrów i składa się z sygnałów o nazwach instrukcji (poprawia czytelność). wszystkie sygnały są połączone równolegle bramkami OR. Przykład: Q <= ANDRB or IORRB; oznacza dla Q = 9 bit, ANDRB = 9 bit, IORRB = 9 bit : Q(0) <= ANDRB(0) or IORRB(0); -- zerowy bit na wyjściu Q jest sumą zerowego bitu na wyjściu ANDRB i IORRB. . . Q(8) <= ANDRB(8) or IORRB(8); funkcja OR (Q) daje na wyjściu 1 gdy jeden lub więcej bitów zadanych w tej funkcji jest = 1. Czyli wyjście OR jest sumą wszystkich sygnałów wchodzących do funkcji. Zajmijmy się zapisem wyboru z maskowaniem sygnału. R i B są sygnałami dla jednostki ALU. Są to dwa słowa na których wykonujemy operacje. Operacje można też wykonać na większej liczbie elementów, ale nigdy na jednym, ponieważ wynik się nie zmieni. na jednym argumencie nie widziałem operacji przykład: ADNRB <= ('0' & (R and B)) when (Sel = "00100") else (others => '0'); zapis ten oznacza że mamy funkcję AND, dekoder(Sel) i maskę sygnału. Sygnał R i B są = 8 bit. by na wyjściu otrzymać wynik 9 bitowy potrzebny w dalszej części kodu dokleiłem jeden bit o wartości 0 ('0' &) i dodałem funkcję AND dla R i B. fukcja z doklejonym bitem ma taką postać '0' & (R and B). dekoder Sel ma za zadanie maskowanie sygnału funkcji. Sel jest złożony z 5 bitów. Mozna go zapisać też w inny sposób: ANDRB_EN <= not Sel(4) and not Sel(3) and Sel(2) and not Sel(1) and not Sel(0), albo tak: ANDRB_EN <= (not (Sel(4) or Sel(3) or Sel(1) or Sel(0)) and Sel(2);. Pokazałem inny zapis dekodera Sel by wytłumaczyć maskowanie sygnału. Maskowanie sygnału jest wykonywane funkcją AND. Funkcja ta daje wynik = 1 gdy wszystkie sygnały są też = 1. W ten sposób uzyskujemy wynik na wyjściu. Przykład: Wynik(10101010) and Maska(11111111) = Wyjście(10101010). Wynik(10101010) and Maska(00000000) = Wyjście(00000000). To jest MUX zrealizowany przez maskowanie + OR., synteza robi korzystniejsze połączenia (routing). Czyli kod jest optymalnie syntezowany pod układ i jest szybszy niż bym użył case. Kod przepisywałem parę razy i za każdym razem otrzymuje lepsze wyniki pisząc w tym stylu. Ostatni wyjątek to PROD. Jest to 16 bitowy wynik mnożenia i dolne 8 bitów wyniku jest podłączone do wyjścia ALU pod nazwą PRODL a górne jest zapisywane w innym rejestrze. Musiałem zachować pełny wynik mnożenia, a ze względu na 8 bitową architekturę i możliwość przetworzenia danych 8 bit jednocześnie, podzieliłem wynik mnożenia na dwie połowy. Dlaczego 9 bit gdy przetważam tylko 8? Na początku to mylące ale w 9 bicie używam Carry(przeniesienie). Czyli operacje dodawania, odejmowania i rotacji dla pozostałych bitów wpisuje 0. Tak działa w mojej interpretacji jednostka arytmetyczno-logiczna. W następnych wpisach przejdziemy do kolejnej części kodu. Opiszę działanie rejestrów i jak dane trafiają do ALU. pozdrawiam. Edytowano 20 maja przez kroszkanorber 1
kroszkanorber 21 maja Autor tematu Udostępnij 21 maja Witam. Przepływ sygnałów (rejestry). W tym wpisie opiszę, jak dane przechodzą przez rejestry i pamięci w trakcie 4‑taktowego cyklu procesora. Przepływ sygnałów jest w moim procesorze synchroniczny. Przepływem sygnałów steruje licznik 2 bitowy o nazwie Cnt. -- Cnt = "00" <- pobieranie instrukcji z pamięci ROM -- Cnt = "01" <- pobieranie danych z pamięci RAM -- Cnt = "10" <- wykonanie instrukcji -- Cnt = "11" <- wykonanie instrukcji, zmiana zawartości licznika instrukcji, zapis danych do pamięci RAM|rejestru B|PORT_O Pamięć programu i danych jest zaimplementowana w wbudowanej pamięci BRAM w układzie FPGA. Mój układ posiada 16 banków pamięci, którą możemy konfigurować (pamięć BRAM nie jest dowolnie konfigurowalna i najważniejsze jest użycie zegara ponieważ jest synchroniczna). BRAM nie dopuszcza konfiguracji jako pamięć statyczna ponieważ nie będzie użyta, a konsekwencją takiej konfiguracji będzie zużycie LUT. Pamięć BRAM można interpretować jako pole kwadratu z małymi pamięciami 1 bit (tylko przykład). W tym kwadracie są zaimplementowane pamięci 1 bitowe o stałej liczbie w osi X i osi Y. To wymusza konfigurację X * Y. Czyli w moim przypadku 1 BRAM = 2048 adresów * 8 bitów = 16384. Jeśli wpisałbym inne wartości, pamięć nie zostałaby rozpoznana jako BRAM i synteza utworzy połączenia LUT + Rejestry D. Pamięć BRAM w mojej architekturze wymusza odstęp 1 taktu zegara między pobraniem kodu w którym jest zapisany adres RAM, a odczytem zaadresowanej komórki pamięci RAM. Drugi takt zatrzaskuje dane wysłane z komórek pamięci RAM do rejestru RAMDO. W trzecim takcie RAMDO jest kopiowany do rejestru R. Rejestr R łapie dane z RAM tylko w trzecim takcie, dzięki czemu ALU zawsze dostaje stabilne dane. -- zapis danych z pamięci RAM do rejestru R process (Clk, RAMDO, Cnt) begin if falling_edge (Clk) then if (Cnt = "10") then R <= RAMDO; end if; end if; end process; Rejestr R jest połączony do wejścia ALU. Drugie wejście ALU jest połączone z rejestrem B (rejestr roboczy 8 bitowy). Między trzecim i czwartym taktem przez ALU przepływają dane, a wszystkie operacje wykonywane są równolegle. Wynik jednej z tych operacji jest podawany na wyjście Q, O tym, który wynik ma być wybrany decyduje MUX którego działanie opisałem w poprzednim poście. W czwartym takcie dane wystawione na wyjściu Q są zapisywane w rejestrze B, lub pamięci BRAM, lub na wyjściu EXTO w zależności od użytej instrukcji. Instrukcje kopiujące pozwalają mi dostać się do rejestrów. To nie jest idealne rozwiązanie, ale działa i na pierwszy procesor wystarcza. --zapis danych do rejestru B process(Clk, Reset, Sel, Cnt, PORT_I, R, ROMDO, PROD, Sel) begin if Reset = '0' then (Globalny sygnał RESET kasuje rejestr ustawiając zera dla wszystkich bitów) B <= (others => '0'); else if falling_edge (Clk) then if (Cnt = "11") then (Zapis tylko w czwartym takcie) if (Sel = "00001") --MOVLB or (Sel = "10000") then --RETLB kopiowanie stałej do rejestru B (Stała to liczba zapisana w pamięci ROM) B <= ROMDO(7 downto 0) ; elsif (Sel = "00010") then --MOVEB kopiowanie danych z portu EXTI do rejetru B (Port EXTI to dane z zewnątrz) B <= PORT_I ; elsif (Sel = "00011") then --MOVRB kopiowanie zawartości pamięci RAM do rejestru B (Bez użycia ALU) B <= R ; elsif (Sel = "01101") then --MULRB kopiowanie PRODH do rejestru B (Pisałem w poprzednim poście że wynik mnożenia podzieliłem na pół a górna połowa zapisywana jest właśnie tutaj czyli do rejestru roboczego) B <= PROD(15 downto 0) ; end if; end if; end if; end if; end process; Poprawiłem jedną rzecz: PRODH to bity 15..8, nie 15..0. elsif (Sel = "01101") then -- MULRB B <= PROD(15 downto 8); Pamięć programu (ROM). Wykorzystuję możliwość jednoczesnego zapisu i odczytu BRAM. Adres zapisu i odczytu mogą być różne. Ważne: nie wolno czytać i pisać tej samej komórki w tym samym takcie. architecture Behavioral of ROM is type ram_type is array (0 to 2047) of std_logic_vector (15 downto 0); (Zostaną wykorzystane dwa bloki BRAM) signal ROM0: ram_type; signal EN : std_logic; begin EN <= '1' when Cnt = "00" else '0'; process (CLK) begin if falling_edge (Clk) then if WE = '1' then (Zezwolenie na zapis do pamięci) ROM0(conv_integer(ADDR)) <= DI; (Adres BRAM to sygnał 11 bitowy o nazwie ADDR) end if; if EN = '1' then (Zezwolenie na odczyt) DO <= ROM0(conv_integer(PC)) ; (Adres BRAM to sygnał 11 bitowy o nazwie PC) end if; end if; end process; end Behavioral; Sygnał EN blokuje odczyt w trakcie wykonywania instrukcji. pozdrawiam 2
ethanak 22 maja Udostępnij 22 maja Czytam sobie trochę wybiórczo bo tylko część mnie interesuje (nie znam się na FPGA ale o procesorach coś tam słyszałem). Ciekawe. 1
kroszkanorber 22 maja Autor tematu Udostępnij 22 maja 9 godzin temu, ethanak napisał: Czytam sobie trochę wybiórczo bo tylko część mnie interesuje (nie znam się na FPGA ale o procesorach coś tam słyszałem). Ciekawe. Od młodych lat fascynowała mnie elektronika. Niestety miałem możliwości rozwijać swojej pasji zawodowo, więc postanowiłem wziąć sprawy w swoje ręce. Jestem pasjonatem i hobbystą. Moje formy wypowiedzi mogą z tego powodu być niezrozumiałe ludziom po studiach, ponieważ nie kształciłem się w tym kierunku. Wiedzę pozyskuję z wielu źródeł i przekazuję tak jak ją rozumiem. O procesorach i ich funkcjonowaniu dowiedziałem się czytając książkę w niemieckim wydaniu o procesorze 8051 Francisa. Później poznałem mikrochip i stronę sprut.de na której opisane są te kontrolery z przykładami. Następnie próbowałem moich sił z układami cpld i finalnie fpga. Chcę przez to powiedzieć że nie jestem znawcą FPGA i napewno nie wiem więcej niż inni. Wrzucam posty by przybliżyć uniwersalność układów FPGA w ich zastosowaniach. 1
kroszkanorber 22 maja Autor tematu Udostępnij 22 maja Witam. W tym poście opiszę działanie stosu przerwań. Na początek wyjaśnię jak działa mój stos adresów przerwań, co to są przerwania i po co to komu... Stos przerwań jest używany w celu weryfikacji danych. Działanie ma cel nawiązania połączenia z urządzeniem które do nas chce przesłać dane, lub obliczeniem funkcji... Przykład: Klawiatura komputera chce przekazać procesorowi, że został wciśnięty klawisz. Procesor jest zajęty nie zna tego urządzenia, ponieważ kod który wykonuje przetwarza inne procesy. Procesor jest jak pociąg jadący po szynach w jedną stronę. Przerwanie może przekierować taki pociąg na inny tor, zapisuje adres, z którego został przekierowany, a po zakończonej akcji kieruje go w to samo miejsce przed przerwaniem. Takie przerwanie jest nazywane INTERRUPT. Inną formą przerwań jest przerwanie programowe. Przerwanie programowe jest przerwaniem wywołującym funkcję. Przykład: dobrze znana pętla for. for (int i = 0; i < 7; i++). Gdy program odnajdzie takie polecenie oznacza to skok pod adres, pod którym procesor wykonuje tę instrukcję (instrukcja ta jest zapisana w formie Assebler dla procesora o stałym adresie do którego się odwołujemy) ze składnikami, czyli liczbą dla "i" w tym przypadku i zapisze na stosie adres powrotu z przerwania programowego. Magia przerwania programowego polega na tym że procesor ma zmienną do której się odwołuje i wykonuje tą operację dopóki wynik będzie prawdziwy "i < 7". Gdy wynik w naszym przykładzie osiągnie liczbę 8 to procesor wróci do adresu w którym przerwał wykonywanie instrukcji main(kod główny). Takie przerwania opisujemy w procesorach microchip instrukcją CALL ( Wykonuję pracę. Dzwonię do znajomego i pytam się o wynik 2+2. Odkładam telefon. Wracam do pracy i zapisuję wynik 4 który mi podał znajomy). Różnica między przerwaniami z zewnątrz i programowymi jest następująca. Przerwania programowe są zaplanowane w kodzie, a przerwania z zewnątrz są nieprzewidywalne dla procesora. Przerwania z zewnątrz moim zdaniem mimo, że są nieprzewidywalne są łatwiejsze do zrozumienia niż przerwania programowe. Obsługa przerwania z zewnątrz w mim procesorze: if ((INT_KBD = '1') and (INTEN = '0')) then -- INTERUPT PC <= "00000010000"; -- skok do adresu "10000" INTPC <= PC; INTEN <= '1'; Przerwanie z zewnątrz jest sygnałem elektrycznym, który wymusza w liczniku programu (PC) zapisanie stałej wartości (skok do adresu "10000"). To wszystko. Zadaniem programisty jest napisanie kodu obsługującego te urządzenie, dla którego przypisaliśmy ten sygnał w programie zaczynającym się pod tym adresem. Wydaje się proste i tak jest. W takich przerwaniach ważny jest hardware, a software to kod obsługujący przerwania z zewnątrz. Adres powrotu w moim procesorze zapisywany jest automatycznie w rejestrze i wywoływany jest instrukcją powrotu z przerwania z zewnątrz: elsif ((Sel = "10010") and (INTEN = '1')) then -- RETFIE PC <= INTPC; INTEN <= '0'; INTPC jest rejestrem w którym przechowywany jest adres powrotu z przerwania z zewnątrz. Instrukcja wymusza zapis adresu zawartego w rejestrze do licznika programu (PC). Przerwania programowe opiszę w następnym wątku, ponieważ zastosowałem mechanizm zapisu adresów stosu przerwań mojego autorstwa. To wymaga obszerniejszego wyjaśnienia które mogło by być nadmiarowe w tym wpisie.. pozdrawiam 1
Sylba 23 maja Udostępnij 23 maja (edytowany) 6 godzin temu, kroszkanorber napisał: Niestety miałem możliwości rozwijać swojej pasji zawodowo, więc postanowiłem wziąć sprawy w swoje ręce. Brzmi niejednoznacznie. Zakładam, że nie miałeś możliwości łączenia hobby z pracą zawodową. 6 godzin temu, kroszkanorber napisał: Jestem pasjonatem i hobbystą. Moje formy wypowiedzi mogą z tego powodu być niezrozumiałe ludziom po studiach Pasja i hobby nie mają nic wspólnego z formą wypowiadania się. Piszesz obszerne posty, wyjaśniasz co robisz, a to rzadkość. Cenne są informacje w jaki sposób pozyskujesz wiedzę. Dla mnie brakuje tylko wstępu, w którym byłoby opisane co jest celem prezentacji tego projektu. Po co realizujesz ten projekt? Czy jest to tylko etap nauki technologii FPGA i chcesz się pochwalić ile już osiągnąłeś, czy może jest to etap realizacji większego projektu, który masz już w głowie? Edytowano 23 maja przez Sylba 1
kroszkanorber 23 maja Autor tematu Udostępnij 23 maja 7 godzin temu, Sylba napisał: Dla mnie brakuje tylko wstępu, w którym byłoby opisane co jest celem prezentacji tego projektu. Po co realizujesz ten projekt? Czy jest to tylko etap nauki technologii FPGA i chcesz się pochwalić ile już osiągnąłeś, czy może jest to etap realizacji większego projektu, który masz już w głowie? Widzę zainteresowanie projektem i wasze odpowiedzi zobowiązują mnie do wyjaśnień. Kod procesora, który podałem, jest kodem referencyjnym i nie jest celem tego postu. Wrzuciłem go i wyjaśniam jego działanie, ponieważ niektóre rozwiązania przeniosę do projektu docelowego. Opisany procesor w VHDL (konfiguracja układu) jest relatywnie prosty i dla wielu czytelników może być dobrym wstępem do mojej architektury, nad którą pracuję. Podsumowując — moje wpisy są wprowadzeniem do projektu docelowego. Przypuszczam, że tak niskopoziomowe podejście nie jest oczywiste dla wszystkich. Dlatego staram się wyjaśniać działanie mojego procesora obszernie, nie zakładając, że wszyscy wszystko rozumieją. Procesor opisywany w poście ma swoje słabe strony, głównie ze względu na ubogą liczbę instrukcji. Kod assemblera dla tego procesora posiada dużo instrukcji pomocniczych, co utrudnia pisanie oprogramowania. To jest główny powód, dla którego rozwijam i przebudowuję kod konfiguracyjny. Celem projektu jest stworzenie procesora przyjaznego w obsłudze, napisanie małego IDE/kompilatora (aplikacja okienkowa w C++), programowanie przez złącze RS232 oraz dopisanie modułów VGA i KBC. Czyli — mały mini‑komputer do zabawy. 1
kroszkanorber 23 maja Autor tematu Udostępnij 23 maja (edytowany) Witam. Przerwania programowe. Przerwania programowe działają podobnie do przerwań od urządzeń zewnętrznych. Przerwania programowe są zaimplementowane w kodzie w celu wywołania funkcji zapisanej pod adresem w którym się zaczyna. Przerwanie programowe wywołujemy instrukcją CALL. Instrukcja posiada ukryte działanie które polega na zapisaniu adresu powrotu na stosie przerwań, a następnie skoku pod podany adres w kodzie. Przypisanie adresu zapisanego w instrukcji do licznika programu (PC) jest wykonywane w 4 takcie. Przy okazji zmniejszamy licznik adresów stosu przerwań (adresy stosu nie są adresami powrotu z przerwania, a adresem kolejnej komórki pamięci w której zapisany jest adres powrotu). elsif (Sel = "11001") then -- CALL PC <= ROMDO(10 downto 0); TOS <= TOS - 1; -- zmniejszenie adresu licznika przerwań po odczycie instrukcji. Po uruchomieniu procesora lub po użyciu sygnału Reset, licznik TOS jest ustawiany na adres ostatniej komórki pamięci programu ROM. Pamięć programu jest zapisywana instrukcjami od początku (PC = 0 po uruchomieniu), a stos przerwań jest zapisywany od końca pamięci programu (ROMADDR = TOS = 2047). Za każdym razem gdy wywołujemy polecenie CALL, wskaźnik TOS wskazuje na aktualną komórkę pamięci w której zapisujemy adres powrotu i w 4 takcie wykonuje skok pod podany adres, równocześnie zmniejszając licznik TOS.. By przed zmianami zapisać adres powrotu z przerwania w komórce pamięci wymagane jest przetworzenie sygnałów we wcześniejszych taktach. Tutaj przypisany jest wskaźnik do adresu zapisu w pamięci programu ROMADDR <= TOS; W następnej linijce kodu zastosowałem trick zapisu adresu powrotu który powiązałem z instrukcją GOTO. Instrukcja GOTO jest poleceniem skoku do następnego adresu wskazanego w tej instrukcji i po wywołaniu wykona skok bez adresu powrotu. --GOTO + PC + 1 zapis instrukcji powrotu z przerwania z adresem następnego polecenia ROMDI <= "11000" & (PC + 1); W kolejnej linijce kodu steruję sygnałem zapisu ROMWE. Zapis jest aktywny tylko gdy wywołujemy instrukcję CALL (Sel = "11001") i licznik cyklu pokazuje 3 takt (Cnt = "10"). Czyli zapis adresu powrotu jest wykonywany 1 takt przed wykonaniem instrukcji CALL. --CALL dekoder zapisu adresu powrotu z przerwania w pamięci ROM ROMWE <= '1' when ((Sel = "11001") and (Cnt = "10")) else '0'; Powrót z przerwania programowego wykonywany jest instrukcją RETURN, RETLB. if (Cnt = "01") then if ((Sel = "10001") or (Sel = "10000")) then -- RETURN, RETLB PC <= TOS; -- adres TOS przypisany do licznika PC TOS <= TOS + 1; end if; end if; Po wykryciu polecenia powrotu z przerwania w 2 takcie, przypisany zostaje adres wskaźnika do licznika programu, który odpowiada za adres, pod którym odczytujemy pamięć programu. Jednocześnie zwiększony zostaje licznik TOS (wskaźnik). W 3 takcie wykrywane jest polecenie GOTO z adresem powrotu z przerwania a w 4 takcie jest wykonane. Podsumowując - TOS jest wskaźnikiem adresów powrotu z przerwań, Adresy są zapisywane w pamięci programu od końca. Możemy wywoływać instrukcję CALL wiele razy bez obawy, że zabraknie nam kolejnego poziomu w naszym drzewie programu. Możemy zrobić tyle poziomów przerwań na ile nam pozwoli wolne miejsce w pamięci programu (dopóki stos nie nadpisze instrukcji zawartej w pamięci programu). Moim zdaniem jest to najmocniejsza strona mojego procesora. Daje pełną swobodę tworzenia głębokich wywołań funkcji bez ograniczeń sprzętowych. Edytowano 23 maja przez kroszkanorber 1
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »