RAM és ROM Mind RAM, mind ROM beépíthető ASIC vagy FPGA/EPLD tervbe Mind RAM, mind ROM beépíthető ASIC vagy FPGA/EPLD tervbe A következőkben a szükséges VHDL leírás megtervezéséről lesz szó A következőkben a szükséges VHDL leírás megtervezéséről lesz szó Két mód van ROM meghatározására a VHDL-ben: Két mód van ROM meghatározására a VHDL-ben: Tömb állandó használata Technológiára jellemző ROM beültetése
ROM meghatározása tömb állandóval I. Ezzel a módszerrel a ROM meghatározása akkor terület-hatékony, ha a ROM viszonylag kicsi Ezzel a módszerrel a ROM meghatározása akkor terület-hatékony, ha a ROM viszonylag kicsi Ha a ROM nagy, akkor a terület alapköltsége sokkal nagyobb, mint egy technológiára jellemző ROM beültetésénél Ha a ROM nagy, akkor a terület alapköltsége sokkal nagyobb, mint egy technológiára jellemző ROM beültetésénél A tömb állandóval való ROM bejelentést érdemes a csomagba helyezni, mert így újrafelhasználhatóvá válik A tömb állandóval való ROM bejelentést érdemes a csomagba helyezni, mert így újrafelhasználhatóvá válik Példa egy 4x8 bites ROM-ra: Példa egy 4x8 bites ROM-ra: Library ieee; use ieee.std_logic_1164.ALL; Package rom is constant rom_width:integer:=8; constant rom_length:integer:=4; constant rom_width:integer:=8; constant rom_length:integer:=4; subtype rom_word is std_logic_vector (rom_width-1 downto 0); subtype rom_word is std_logic_vector (rom_width-1 downto 0); type rom_table is array (0 to rom_length-1) of rom_word; type rom_table is array (0 to rom_length-1) of rom_word; constant rom: rom_table:= rom_table’(“ ”, “ ”, constant rom: rom_table:= rom_table’(“ ”, “ ”, “ “,” ”); “ “,” ”); end;
ROM meghatározása tömb állandóval II. Az előbb meghatározott ROM alkalmazása: Az előbb meghatározott ROM alkalmazása: Library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use work.rom.all; Entity romcir is port(addr:in std_logic_vector(1 downto 0); q:out rom_word); port(addr:in std_logic_vector(1 downto 0); q:out rom_word);end; Architecture dtf of romcir is begin q<=rom(conv_integer(addr));-- Adatot olvas a ROM tömb addr nevű címéről q<=rom(conv_integer(addr));-- Adatot olvas a ROM tömb addr nevű címéről end;
ROM meghatározása tömb állandóval III. A szintézis során kombinációs logikai hálózattal fog létrejönni a ROM, mivel a felhasznált ROM mező címét előzetesen nem lehet kiszámítani. A szintézis során kombinációs logikai hálózattal fog létrejönni a ROM, mivel a felhasznált ROM mező címét előzetesen nem lehet kiszámítani. Ha a cím számítható, akkor az előző példabeli kimeneti q jel állandó, így a szintézis során nem kombinációs hálózattal jön létre a ROM, hanem az adott ROM mezőhöz tartozó egyes biteket közvetlenül VCC-re vagy földre kötik. Ha a cím számítható, akkor az előző példabeli kimeneti q jel állandó, így a szintézis során nem kombinációs hálózattal jön létre a ROM, hanem az adott ROM mezőhöz tartozó egyes biteket közvetlenül VCC-re vagy földre kötik. A kiszámolható ROM cím egy példája: A kiszámolható ROM cím egy példája: Architecture bnc of waveform is begin q<=rom(2);-- Adatot olvas a ROM tömb 2-es címéről q<=rom(2);-- Adatot olvas a ROM tömb 2-es címéről end;
Technológiára jellemző ROM beültetése Nagyobb ROM-ok esetén célszerű Nagyobb ROM-ok esetén célszerű Előny: Előny: jobb területkihasználtságú (hiszen az adott technológiára optimalizált) Hátrányok: Hátrányok: a VHDL kód technológia függővé válik gondot jelent a szimuláció, ha nincs VHDL modell a ROM-ra ilyenkor esetleg egy kevert módú (VHDL- és kapu-szintű) szimulátort lehet alkalmazni ilyenkor esetleg egy kevert módú (VHDL- és kapu-szintű) szimulátort lehet alkalmazni
RAM Két lehetőség van RAM feladatkör megvalósítására Két lehetőség van RAM feladatkör megvalósítására regiszterek használata RAM beültetése
RAM létrehozása regiszterekkel A regiszterek nagyon kis RAM-okhoz használhatók A regiszterek nagyon kis RAM-okhoz használhatók Nagyobb RAM-ok esetén a területi alapköltség túl nagy Nagyobb RAM-ok esetén a területi alapköltség túl nagy A következő példa egy órajeles folyamat használatával modellezi a regisztereket: A következő példa egy órajeles folyamat használatával modellezi a regisztereket: process(clk,resetn) begin if resetn=‘0’ then if resetn=‘0’ then q ‘0’); q ‘0’); elsif clk’event and clk=‘1’ then elsif clk’event and clk=‘1’ then if wr=‘1’ then if wr=‘1’ then q<=data; q<=data; end if; end if; end process;
RAM létrehozása beültetéssel Nem lehetséges jó szintézis eredményt elérni RAM beültetése nélkül Nem lehetséges jó szintézis eredményt elérni RAM beültetése nélkül Hátrány (hasonlóan a ROM-hoz): Hátrány (hasonlóan a ROM-hoz): a VHDL kód technológia függővé válik a szimulációval gondok lehetnek Megoldás: viselkedési szintű szintézis Megoldás: viselkedési szintű szintézis a RAM-ot egy írható-olvasható tömbbel helyettesítik a viselkedési szintézis eszköz mindig az aktuális cél-technológiának megfelelő RAM-ot használja A RAM beültetéséhez a generate parancs alkalmazható, pl: A RAM beültetéséhez a generate parancs alkalmazható, pl: architecture rtl of RAM4 is component RAM4x1 port(d,a0,a1,we: in std_logic; q:out std_logic); end component; -- A következő sor csak a szimulációhoz szükséges for U1:RAM4x1 use entity work.RAM4x1(rtl); begin for i in 0 to 3 generate for i in 0 to 3 generate RAM_b: RAM4x1 port map (d_in(i),a0,a1,write,d_out(i)); RAM_b: RAM4x1 port map (d_in(i),a0,a1,write,d_out(i)); end generate; end generate; end;
Példa Meg kell tervezni egy c1 összetevőt, amely beültet egy 4x8 bites RAM-ot Meg kell tervezni egy c1 összetevőt, amely beültet egy 4x8 bites RAM-ot A könyvtár csak a következő RAM-ot tartalmazza: A könyvtár csak a következő RAM-ot tartalmazza: entity RAM4x1 is port( d,a0,a1,we:instd_logic; port( d,a0,a1,we:instd_logic; q:outstd_logic); q:outstd_logic); end;
Megoldás library ieee; use ieee.std_logic_1164.all; entity c1 is port( write,a0,a1:instd_logic; port( write,a0,a1:instd_logic; d_in:instd_logic_vector(7 downto 0); d_in:instd_logic_vector(7 downto 0); d_out:outstd_logic_vector(7 downto 0)); end; architecture rtl of RAM4 is component RAM4x1 port(d,a0,a1,we: in std_logic; q: out std_logic); end component; -- A következő sor csak a szimulációhoz szükséges for U1:RAM4x1 use entity work.RAM4x1(rtl); begin for i in 0 to 7 generate for i in 0 to 7 generate RAM_block: RAM4x1 port map(d_in(i),a0,a1,write,d_out(i)); RAM_block: RAM4x1 port map(d_in(i),a0,a1,write,d_out(i)); end generate; end generate; end;