Diferență între revizuiri ale paginii „Memorii RAM”

De la WikiLabs
Jump to navigationJump to search
 
(Nu s-a afișat o versiune intermediară efectuată de același utilizator)
Linia 29: Linia 29:
  
 
Ieșirile pot fi ori de tip wire, pentru porturi asincrone, ori de tip reg pentru porturi sincrone.
 
Ieșirile pot fi ori de tip wire, pentru porturi asincrone, ori de tip reg pentru porturi sincrone.
 +
 +
'''Atenție:''' O memorie RAM nu are semnal de reset!
  
 
== Implementarea unei memorii RAM ==
 
== Implementarea unei memorii RAM ==
 +
 +
Celulele de memorare ale unui RAM se definesc ca un vector de registre. Astfel un RAM de 1024 de locații de 32 de biți se definește în interiorul modulului Verilog astfel:
 +
 +
<syntaxhighlight lang="Verilog">
 +
reg [31:0] memorie [0:1023];
 +
</syntaxhighlight>
 +
 +
Această sintaxă exprimă un vector de 1024 de elemente (0 - 1023), care elemente sunt registre de 32 de biți (31 - 0). Accesul la unul din registrele din vectorul de 1024 de registre, se face utilizând operatorul '''[]'''. Spre exemplu registrul specificat de un semnal '''addr''' este accesat astfel:
 +
 +
<syntaxhighlight lang="Verilog">
 +
memorie[addr]
 +
</syntaxhighlight>
 +
 +
<div class="regula"><font color="red">Regulă:</font> Întotdeauna, scrierea unei locații de memorie, se face sincron (pe frontul de ceas), prin urmare se face utilizând un bloc always secvențial.</div>
 +
 +
<div class="regula"><font color="red">Regulă:</font> Întotdeauna, citirea unei locații de memorie, pe un port sincron, se face utilizând un bloc always secvențial.</div>
 +
 +
<div class="regula"><font color="red">Regulă:</font> Întotdeauna, citirea unei locații de memorie, pe un port asincron, se face utilizând un bloc assign sau always combinațional (assign este recomandat).</div>

Versiunea curentă din 25 martie 2012 11:48

Memoriile RAM (Random Access Memory) sunt circuite de memorare. Adică diferența din acestea și memoriile ROM, este că RAM-urile se pot și scrie, nu doar citi. Astfel, pe lângă parametrii importanți pe care îi cunoaștem de la ROM (numărul de locații de memorie și dimensiunea unei locații), o memorie RAM poate avea unul sau mai multe porturi. Aceste porturi sunt compuse din mai multe intrări și/sau ieșiri, și pot fi de 3 feluri:

  • port de scriere - pe acest port se poate face doar scriere în memorie;
  • port de citire - pe acest port se poate face doar citire din memorie;
  • port de citire-scriere - pe acest port de poate face și scriere și citire, dar doar la aceeași adresă.

Porturile de citire pot fi la rândul lor de două tipuri:

  • asincrone - dacă ieșirea de date se schimbă asincron, odată cu schimbarea adresei de citire, iar această ieșire este de tip wire;
  • sincrone - daca ieșirea de date se schimbă sincron cu ceasul, indiferent de momentul schimbării adresei, iar această ieșire este de tip reg.

Cu cât o memorie are mai multe porturi, cu atât aceasta e mai mare (ca arie) și mai lentă. Prin urmare este recomandat ca un designer să aibă în vedere funcționalitatea necesară unei memorii și să adauge exact numărul și tipul de porturi de care este nevoie. De exemplu, nu se vor adăuga două porturi de citire decât dacă este esențial să se poată citi două locații de memorie în același timp.

Observație: Fiecare port distinct trebuie să aibă propria intrare de adresă.

Interfața unei memorii RAM

Interfața unei memorii RAM conține obligatoriu semnalul de ceas ca intrare. În plus, fiecare port are următoarele semnale:

  • porturile de citire conțin (ca și în cazul unei memorii ROM, unde nu se face decât citire) :
    • adresa locației ca intrare
    • data citită din memorie ca ieșire
  • porturile de scriere conțin:
    • adresa destinației ca intrare
    • data care se dorește scrisă, tot ca intrare
    • un semnal de intrare de un bit, care comandă scrierea datei de intrare la adresa specificată, numit tradițional Write Enable (sau we).
  • porturile de citire-scriere conțin:
    • adresa locației care se dorește accesată (citită sau scrisă), ca intrare
    • data care se dorește scrisă, tot ca intrare
    • data citită din memorie ca ieșire
    • un semnal de intrare de un bit, care comandă scrierea datei de intrare la adresa specificată, numit tradițional Write Enable (sau we).

Ieșirile pot fi ori de tip wire, pentru porturi asincrone, ori de tip reg pentru porturi sincrone.

Atenție: O memorie RAM nu are semnal de reset!

Implementarea unei memorii RAM

Celulele de memorare ale unui RAM se definesc ca un vector de registre. Astfel un RAM de 1024 de locații de 32 de biți se definește în interiorul modulului Verilog astfel:

reg [31:0] memorie [0:1023];

Această sintaxă exprimă un vector de 1024 de elemente (0 - 1023), care elemente sunt registre de 32 de biți (31 - 0). Accesul la unul din registrele din vectorul de 1024 de registre, se face utilizând operatorul []. Spre exemplu registrul specificat de un semnal addr este accesat astfel:

memorie[addr]
Regulă: Întotdeauna, scrierea unei locații de memorie, se face sincron (pe frontul de ceas), prin urmare se face utilizând un bloc always secvențial.
Regulă: Întotdeauna, citirea unei locații de memorie, pe un port sincron, se face utilizând un bloc always secvențial.
Regulă: Întotdeauna, citirea unei locații de memorie, pe un port asincron, se face utilizând un bloc assign sau always combinațional (assign este recomandat).