CID Aplicatii 4: Diferență între versiuni

De la WikiLabs
Jump to navigationJump to search
Fără descriere a modificării
Fără descriere a modificării
Linia 92: Linia 92:
endmodule
endmodule
</syntaxhighlight>
</syntaxhighlight>
'''Observatii:'''
* Circuitul Decoder  va  avea  o  intrare  pe  2  biti,  care  va  reprezenta  adresa  memoriei  ROM  si  o iesire  pe  4  biti,  reprezentand  continuturile  memoriei  ROM  corespunzatoare  fiecarei combinatii de la intrare.
* Chiar daca in interiorul case  se acopera toate cazurile posibile (toate combinatiile  de 2 biti), este  bine  sa  punem si  un  default,  ca  sa  evitam  inserarea  in  locul  circuitului  combinational dorit (aici, memoria ROM) a unui latch.
'''Implementarea pe FPGA:'''
* Implementarea pe  FPGA  are  ca  tinta  doar  modulul  in  sine  (Decoder), modulul  de  test (Decoder_TB) fiind nesintetizabil.
* Semnalele de  intrare vor  fi  legate  la  dispozitive  care comanda  stari,  iar  iesirile  la  dispozitive care  observa  stari.  Asadar,  vom  alege  aici  comutatoare  pentru  intrari  (cate  un  comutator  pentru fiecare bital fiecarei intrari –2in total) si 4 LED-uri pentru iesiri.
{| class="wikitable"
|-  align="center"
||'''Semnal''' || '''Dispozitiv''' || '''PIN'''
|-  align="center"
| in[0] || SW0 || AB12
|-  align="center"
| in[1] || SW1 || AC12
|-  align="center"
| out[0] || LEDR0 || V16
|-  align="center"
| out[1] || LEDR1 || W16
|-  align="center"
| out[2] || LEDR2 || V17
|-  align="center"
| out[3] || LEDR3 || V18
|}




<syntaxhighlight lang="Verilog">
<syntaxhighlight lang="Verilog">
</syntaxhighlight>
</syntaxhighlight>

Versiunea de la data 21 martie 2021 13:50

Memoria ROM–Introducere

Memoria ROM(Read-Only Memory)este un circuit combinationalfolosit pentru stocarea unor date ce pot fi accesate cu ajutorul unei intrari de adrese. Asa cum se intelege si din nume, memoria ROM, in general, nu poate fi modificata.

Pentru a intelege termenul de memorie, putem face urmatorul exercitiude imaginatie: sa ne gandim la un dulap cu mai multe sertare. Continutul memoriei este reprezentat de continutul sertarelor, iar adresele sunt reprezentate de etichetele lipite pe aceste sertare, pentru a le identifica. Daca avem nevoie de continutul unui sertar, va trebui sa stim eticheta aferenta acestuia.


Am intalnit memoria ROM in aplicatiile anterioare, atunci cand am vorbit despre structura unui FPGA. Am vazut atunci cafunctiile logice erau implementate pe FPGA prin intermediul unor LUT-uri (memorii ROM), care stocau iesirile corespunzatoare unor combinatii de intrari. Asadar, in cazul acela, adreseleerau reprezentate de combinatii ale intrarilor, iar continutul memoriei era reprezentat de iesirile aferente acestor combinatii.


O memorie ROM are urmatorii parametrii: numerul de biti ai adresei, care este legat de numarul de locatii de memorie (cu n biti de adresa putem forma 2𝑛combinatii diferite, deci putem accesa maxim 2𝑛locatii de memorie) si dimensiunea locatiei de memorie, care ne spune cat de multa informatie poate stoca o locatie de memorie.


Sa urmarim exemplul din figura urmatoare:


Aici, adresa are dimensiunea de 4 biti, asadar putem accesa cu aceasta 16 locatii diferite de memorie. Dimensiunea fiecarei locatii este de 8 biti, asadar fiecare locatie de memorie poate stoca numere de 8 biti. Spunem ca memoria ROM este o memorie 4x8. Capacitatea acestei memorii este de 16 x 8 biti = 128 biti.

Exemplul 1

Scop: Descrierea comportamentala a unui decodor, testarea acestuia prin simulare si sinteza pe FPGA.

Decodorul este circuitul care, pentru o anumita valoare a intrarii, va genera laiesire un sir binar care contine 1 pe pozitia cu indicele egal cu valorea intrarii si 0 in rest. De exemplul, decodorul de mai jos pe 2 biti, va avea urmatoarea corespondentaintrare-iesire:

in out
2'b00 4'b0001
2'b01 4'b0010
2'b10 4'b0100
2'b11 4'b1000


Vom implementa acest circuit ca o memorie ROM.


Implementarea Verilog a circuitului

module Decoder(
  input [1:0] in,
  output reg [3:0] out
  );

  always@(in) begin
    case(in)
      2'b00: out = 4'b0001;
      2'b01: out = 4'b0010;
      2'b10: out = 4'b0100;
      2'b11: out = 4'b1000;
      default: out = 4'b0000;
    endcase
  end

endmodule


Implementarea Verilog a modulului de test


`timescale 1ns/1ps

module Decoder_TB();
  reg [1:0] in_t;
  wire [3:0] out_t;
  
  integer idx;

  initial begin
    for(idx=0; idx<4; idx = idx + 1) begin
      in_t = idx;
      #1;
    end 
    #2 $stop();
  end

  Decoder DUT(
    .in(in_t),
    .out(out_t)
  );

endmodule


Observatii:

  • Circuitul Decoder va avea o intrare pe 2 biti, care va reprezenta adresa memoriei ROM si o iesire pe 4 biti, reprezentand continuturile memoriei ROM corespunzatoare fiecarei combinatii de la intrare.
  • Chiar daca in interiorul case se acopera toate cazurile posibile (toate combinatiile de 2 biti), este bine sa punem si un default, ca sa evitam inserarea in locul circuitului combinational dorit (aici, memoria ROM) a unui latch.

Implementarea pe FPGA:

  • Implementarea pe FPGA are ca tinta doar modulul in sine (Decoder), modulul de test (Decoder_TB) fiind nesintetizabil.
  • Semnalele de intrare vor fi legate la dispozitive care comanda stari, iar iesirile la dispozitive care observa stari. Asadar, vom alege aici comutatoare pentru intrari (cate un comutator pentru fiecare bital fiecarei intrari –2in total) si 4 LED-uri pentru iesiri.
Semnal Dispozitiv PIN
in[0] SW0 AB12
in[1] SW1 AC12
out[0] LEDR0 V16
out[1] LEDR1 W16
out[2] LEDR2 V17
out[3] LEDR3 V18