Aller au contenu

Memoires synchrones

Mémoire synchrone simple port

  • Au front d'horloge on obtient l'élément pour lequel on a présenté l'adresse
  • Au même front on peut modifier ce même élément

Exemples

  • Mémoire synchrone
module sram(input clk, wr,
            input  [7:0] Addr,
            input  [7:0] Di,
            output logic [7:0] Do );


logic[7:0] mem [0:255];

always_ff @(posedge clk)
begin
   if (wr)
      mem[Addr] <= Di;
   Do <= mem[Addr];
end

endmodule
  • Mémoire synchrone (registre d'adresse)
module sram(input clk, wr,
            input  [7:0] Addr,
            input  [7:0] Di,
            output [7:0] Do );


logic[7:0] mem [0:255];
logic[7:0] Addr_r;

always_ff @(posedge clk)
begin
   if (wr)
      mem[Addr] <= Di;
   Addr_r <= Addr;
end

assign Do = mem[Addr_r];

endmodule
  • Il faut toujours un cycle d'horloge entre le changement de l'adresse et le changement de la sortie.

Mémoire synchrone dual-port

  • Deux canaux indépendants pour accéder à la même table
module sram_dp(input clk, wr1, wr2,
               input  [7:0] Addr1, Addr2,
               input  [7:0] Di1, Di2,
               output logic [7:0] Do1, Do2 );


logic[7:0] mem [0:255];

always_ff @(posedge clk)
begin
   if (wr1)
      mem[Addr1] <= Di1;
   Do1 <= mem[Addr1];
end

always_ff @(posedge clk)
begin
   if (wr2)
      mem[Addr2] <= Di2;
   Do2 <= mem[Addr2];
end

endmodule

Rom synchrone (pour FPGA)

  • Initialiser le contenu de la table et interdire l'écriture
  • NE FONCTIONNE QU'AVEC LES FPGAs
module rom (input clk,
            input  [7:0] Addr,
            output logic [7:0] Do );


logic[7:0] mem [0:255];

initial
    $readmemh("init.txt", mem);

always_ff @(posedge clk)
   Do <= mem[Addr];

endmodule
  • Le fichier init.txt est un fichier texte qui doit contenir les valeurs initiales en hexadécimal (sans la base). Avec, dans la version la plus simple, une ligne par case de la mémoire.

  • Par exemple:

AA
BB
C3
..