Wie zu folgern, block-RAM in Verilog
Ich habe ein sehr spezifisches problem mit einem Projekt beschäftigt, das verfolgt mich nun seit Tagen. Ich habe die folgenden Verilog-code für ein RAM-Modul:
module RAM_param(clk, addr, read_write, clear, data_in, data_out);
parameter n = 4;
parameter w = 8;
input clk, read_write, clear;
input [n-1:0] addr;
input [w-1:0] data_in;
output reg [w-1:0] data_out;
reg [w-1:0] reg_array [2**n-1:0];
integer i;
initial begin
for( i = 0; i < 2**n; i = i + 1 ) begin
reg_array[i] <= 0;
end
end
always @(negedge(clk)) begin
if( read_write == 1 )
reg_array[addr] <= data_in;
if( clear == 1 ) begin
for( i = 0; i < 2**n; i = i + 1 ) begin
reg_array[i] <= 0;
end
end
data_out = reg_array[addr];
end
endmodule
Verhält es sich genau wie erwartet, jedoch, wenn ich gehe zu synthetisieren bekomme ich die folgende:
Synthesizing Unit <RAM_param_1>.
Related source file is "C:\Users\stevendesu\---\RAM_param.v".
n = 11
w = 16
Found 32768-bit register for signal <n2059[32767:0]>.
Found 16-bit 2048-to-1 multiplexer for signal <data_out> created at line 19.
Summary:
inferred 32768 D-type flip-flop(s).
inferred 2049 Multiplexer(s).
Unit <RAM_param_1> synthesized.
32768 flip-flops! Warum nicht einfach schließen, ein block-RAM? Dieses RAM-Modul ist so riesig (und ich habe zwei davon - eine für den Unterricht Speicher, einen für die Daten-Speicher), es verbraucht die gesamte verfügbare Fläche des FPGA... mal 2.4
Ich versuche schon alles, um ihn zu zwingen, zu schließen, ein block-RAM, statt 33k flip-flops, aber es sei denn, ich kann es herausgefunden bald, ich kann erheblich verringern Sie die Größe der meinen Speicher nur auf passen auf einen chip.
Der synthesizer kann nicht "ableiten", eine Struktur, die nicht physisch vorhanden ist, auf dem FPGA und verschiedenen FPGAs haben unterschiedliche RAMs. Dies ist nicht eine Verilog-problem ist, müssen Sie zum Lesen der Handbücher für Ihr FPGA.
Sorry, ich update eine neue Antwort, dies ist für BRAM , nicht verteilt RAM. Wirklich Leid tut.
InformationsquelleAutor stevendesu | 2013-12-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nur entfernen, was Ihren code, das Ergebnis wie dieses:
Init alle Nullen nicht brauchen-code, wenn Sie möchten, init, tun Sie es einfach:
Dann das Ergebnis, dass ich von ISE 13.1
Update hier!: Stark Dank mcleod_ideafix
Sorry habe vergessen deine Frage: es ist block-RAM, nicht verteilt. Für die block-RAM, müssen Sie erzwingen es: Synthesis - XST -> Prozess-Eigenschaften -> HDL-option -> RAM-Stil -> Ändern von auto zu Blockieren. Das Ergebnis wird so sein:
Ende Update
Empfehle ich Ihnen die Lektüre xst user guide für die RAM-sample-code und Datenblatt des Geräts. Zum Beispiel, in einigen FPGA-LUT-RAM: das reset-signal ist nicht gültig. Wenn Sie versucht haben, um es zurückzusetzen, die mehr Logik-Modul zurückgesetzt werden müssen, integrieren. Es führt zu einem D-FF anstelle von RAM. Das Reset-signal wird automatisch zuweisen, um das system zurückzusetzen.
Im Fall der Block-RAM (nicht-LUT-RAM), ich bevorzuge es, bestimmte tiefen - /Daten-Breite oder core-generation oder rufen Sie es direkt aus der Bibliothek.
Mehr Quellcode für Allgemeine Verwendung (ASIC/FPGA) kann hier gefunden werden: http://asic-world.com/examples/verilog/ram_dp_sr_sw.html
initial
Blöcke sind in der Regel nicht synthetisierbare.Diese Feste alles! Die clear-bit war eigentlich etwas, das in unsere professor ' s Beispiel-code. Ich werde ihn wissen lassen, es brach alles.
Wenn es eine "klare", es in der Regel umgesetzt als
if (clear==1'b1) begin ... end else if (read_write==1'b1) begin ... end else begin ... end
. Auchnegedge(clk)
ist normalerweise so geschrieben, wienegedge clk
Ich weiß, die erste ist nicht synthetisierte, aber initial mit null ist keine Sache mehr im RAM-design, es ist nur für die ROM init . Ich will einfach nur machen es kürzer :D. ich versuche mal ein reset, aber es wurde nicht synthetisiert, da RAM (array (FF). So wie ich das verstehe, RAM zu verwenden, system-reset, für den Benutzer nicht definiert, weil wir nicht brauchen, deaktivieren Sie das RAM in Lauf-Zeiten. Wenn das system tun, werde ich es definieren als Register.
Ihr Ergebnis von ISE zeigt an, dass distributed RAM verwendet wurde, nicht block-RAM!
InformationsquelleAutor Khanh N. Dang