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