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.txtest 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
..