Diferență între revizuiri ale paginii „CID Seminar 5”

De la WikiLabs
Jump to navigationJump to search
Linia 86: Linia 86:
 
==Exemplul 6==
 
==Exemplul 6==
  
Să se implementeze o memorie 512x8b folosind patru memorii 128x8b, conectate corespunzător.
+
Să se implementeze o memorie 128x16b folosind doua memorii 128x8b, conectate corespunzător.
  
 
==Reguli de bună practică==
 
==Reguli de bună practică==
  
 
Se vor grupa semnalele de interfață ale porturilor, și se vor denumi astfel încât să fie ușor identificabile ca fiind parte din portul respectiv (e.g., addrA, dataA, weA, addrB, dataB, weB)
 
Se vor grupa semnalele de interfață ale porturilor, și se vor denumi astfel încât să fie ușor identificabile ca fiind parte din portul respectiv (e.g., addrA, dataA, weA, addrB, dataB, weB)

Versiunea de la data 1 aprilie 2014 08:29

În acest seminar veţi învăţa să descrieţi memorii de tip Random Access (RAM) și Read Only (ROM) folosind vectori de date în Verilog.

Cuvinte cheie: memorie, vector, RAM, ROM

Sintaxă Verilog: $readmemh, $readmemb

Memoriile reprezintă structuri fizice de stocare de date, caracterizate prin două măsuri:

  • numărul de cuvinte N;
  • numărul de biți ai fiecărui cuvânt stocat, W;

Capacitatea de stocare este NxW biți.

Astfel, veți întâlni deseori terminologia de memorie 1024x8b, ceea ce descrie o memorie cu o capacitate de 1024 de cuvinte a 8 biți fiecare.

Memoriile pot fi clasificate în funcție de capacitatea lor de a suprascrie valorile stocate cu valori noi:

  • memoriile Random-Access (RAM) permit și operații de suprascriere a conținutului cuvintelor stocate;
  • memoriile Read-Only (ROM) permit doar citirea.

De asemenea, memoriile pot fi clasificate în funcție de caracterul lor sincron sau asincron:

  • asincron – citirea se face imediat ce se prezintă comanda;
  • sincrone – toate operațiile sunt sincronizate de unul din fronturile semnalului de ceas.

Din considerente de implementare fizică, scrierea este întotdeauna sincronă.

Orice memorie RAM are următorul set de semnale de interfață, care formează un port al memoriei:

  • adresa – intrare – specifică indexul cuvântului pe care îl dorim accesat, pentru scriere sau citire;
  • datele pentru scriere – intrare – datele care vor fi scrise la indexul specificat de adresă;
  • datele citite – ieșire – datele care au fost citite de la indexul specificat de adresă;
  • comanda de scriere – intrare – specifică dacă se dorește scriere sau citire;
  • semnalul de ceas.

În funcție de configurația portului de memorie, unele din aceste semnale pot lipsi. De exemplu, un port Write-Only nu va avea date citite. Asemănător, un port Read-Only nu va avea date pentru scriere. Un port Read-Write va avea toate aceste semnale. Adresa este semnalul care definește portul memorie, și nu poate lipsi.

Observații: A nu se face confuzia între porturi ale unui modul Verilog și porturile unei memorii.

Exemplul 1

Să se descrie în Verilog o memorie RAM cu citire asincronă, de 128 de cuvinte de 8 biți, cu un singur port Read-Write. Se va simula funcționarea memoriei scriind în trei locații de memorie, apoi citind din cele trei locații de memorie și comparând valorile citite cu valorile scrise anterior.

Explicaţie suplimentară

Se va folosi un vector de date în Verilog:

reg [W-1:0] memory[0:N-1];

În acest exemplu am declarat un vector de date numit memory, care este format din cuvinte de W biți, și are N elemente. Elementele vectorului sunt accesate în următorul fel:

  • memory[3] reprezintă elementul 3 al vectorului memory, element care are W biți;
  • memory[3][0] reprezintă bitul zero al elementului 3 al vectorului memory.

Exemplul 2

Să se modifice codul de la exercițiul anterior pentru a implementa o memorie cu citire sincronă.

Exemplul 3

Să se adauge memoriei descrise la exemplul 2 un al doilea port de citire sincronă (Read-Only), și să se simuleze citirea simultană din două locații diferite ale memoriei, prin cele două porturi, cât și situația în care unul din porturi scrie în o locație de memorie în timp ce al doilea port citește din aceeași locație de memorie.

Exemplul 4

Se va inițializa conținutul unei memorii RAM folosind funcțiile de sistem $readmemh() și $readmemb().

Explicatii suplimentare

Funcțiile se folosesc conform următorului șablon:

	$readmem[hb]("fișier de inițializare",numele vectorului,adr1,adr2)

Funcțiile citesc date în format hexazecimal sau binar din fisierul specificat, și le încarcă în vectorul specificat din modulul Verilog, începând de la adresa adr1 până la adresa adr2.

Conținutul fișierului memorie.txt (128 de valori de 8 biți, in hexazecimal, una sub alta):

01
02
0a
13
...
1f

Exemplul 5

Să se implementeze o memorie 512x8b folosind patru memorii 128x8b, conectate corespunzător.

Exemplul 6

Să se implementeze o memorie 128x16b folosind doua memorii 128x8b, conectate corespunzător.

Reguli de bună practică

Se vor grupa semnalele de interfață ale porturilor, și se vor denumi astfel încât să fie ușor identificabile ca fiind parte din portul respectiv (e.g., addrA, dataA, weA, addrB, dataB, weB)