Memorii ROM

De la WikiLabs

Majoritatea funcțiilor implementate de circuite combinaționale pot fi descrise analitic, adică ieșirea poate fi calculată aplicând operatori (adunare, scădere, shiftare, operații logice) intrărilor. Astfel de funcții sunt cele pe care le-ați implementat în lucrările 1 și 2 de laborator. Există însă cazuri în care nu există o relație clară între valoarea de intrare și valoarea de ieșire, astfel încât nu se poate aplica o regulă pentru calculul acesteia din urmă. În acest caz, soluția constă în utilizarea unei memorii ROM (Read-Only Memory), numită și LUT (Lookup Table), care are rolul de a stoca pentru fiecare valoare de intrare, valoarea corespunzătoare de ieșire.

Interfața unei memorii ROM

Interfața unei memorii ROM

O memorie ROM, ca circuit, are o singură intrare, pe care se specifică valoarea de intrare, și o singură ieșire pe care se propagă valoarea funcției pentru intrarea specificată. Pentru fiecare valoare de intrare, o memorie ROM dispune de o locație de memorie, care este accesată când valoarea corespunzătoare apare pe portul de intrare. Valoarea locației este propagată pe portul de ieșire. Astfel, o memorie ROM are doi parametri importanți:

  1. numărul de biți ai portului de intrare (care reprezintă adresa în memorie), care determină numărul total de locații ale memoriei, notat M;
  2. numărul de biți ai portului de ieșire (care este egal cu numărul de biți ai fiecărei locații de memorie), notat N;

Observație: Dacă portul de intrare are M biți, atunci numărul total de adrese posibile, respectiv numărul total de locații în memoria ROM este de 2M. Deci, numărul total de biți ai memoriei ROM (capacitatea memoriei) este produsul dintre numărul total de locații (2M) și dimensiunea în biți a unei locații (N).

Exemplu de memorie ROM (diagramă)

Implementarea unei memorii ROM

Fiind un circuit combinațional, în Verilog, implementarea unei memorii ROM se poate face în trei moduri:

  • cu blocuri assign și operatorul condițional;
  • cu blocuri always combinaționale și sub-blocuri if;
  • cu blocuri always combinaționale și sub-blocuri case.

Metoda preferată este ultima, din cauza ușurinței descrierii (vezi operatori condiționali).