Forum: FPGA, VHDL & Co. Tabelle ins RAM/ROM mit Verilog


von Martin O. (ossi-2)


Lesenswert?

Derzeit habe ich die folgende Konstruktion:
1
always @(posedge clk_100) begin
2
  data2 <= data ;
3
  address2 <= address ;
4
  case (address2)
5
    10'd   0 :  data <= 12'd 4048 ;
6
    10'd   1 :  data <= 12'd 4047 ;
7
    10'd   2 :  data <= 12'd 4046 ;
8
 ....
9
    10'd1021 :  data <= 12'd 4045 ;
10
    10'd1022 :  data <= 12'd 4047 ;
11
    10'd1023 :  data <= 12'd 4048 ;
12
    default : begin  end
13
  endcase
14
  end
Also eine case-Konstruktion (Tabelle) mit 1024 Einträgen.
Quartus synthetisiert das momentan mit jeder Menge LUTs.
Mir wäre lieber, wenn die Tabelle im ROM/RAM landen würde.

Kann man das so formulieren, dass Ram/Rom genommen wird?

von Andreas (Gast)


Lesenswert?

Hallo Martin guckst du hier:

http://quartushelp.altera.com/15.0/mergedProjects/hdl/vhdl/vhdl_file_dir_romstyle.htm.htm

Der Trick ist:
1
attribute romstyle : string;
2
attribute romstyle of q : signal is M9K;

Das hilft dem Synthesizer zu erkennen was du willst.

Viele Grüße

von Martin O. (ossi-2)


Lesenswert?

Ich habs mit der Verilog Version:
1
(* romstyle = "M9K" *) reg [12-1:0] data ;
versucht
http://quartushelp.altera.com/14.1/mergedProjects/hdl/vlog/vlog_file_dir_romstyle.htm

Hat aber nicht geklappt. Vermutlich weil der MAX 10 nicht über 
"TriMatrix memory blocks" verfügt. Weitere Ideen?

von Martin O. (ossi-2)


Lesenswert?

1
module dual_port_rom (
2
  input [(addr_width-1):0] addr_a, addr_b,
3
  input clk,
4
  output reg [(data_width-1):0] q_a, q_b
5
  );
6
parameter data_width = 12;
7
parameter addr_width = 10;
8
reg [data_width-1:0] rom[2**addr_width-1:0];
9
initial 
10
  begin
11
  $readmemh("romSinTab1.data", rom);
12
  end
13
always @ (posedge clk)
14
begin
15
q_a <= rom[addr_a];
16
q_b <= rom[addr_b];
17
end
18
endmodule
Ich hab jetzt obiges Beispiel aus dem Quartus Manual genommen.
Im RTL-View wird das als dual-ported-rom umgesetzt, aber nachher
wird das Rom doch durch LUTs realisiert (1024 Werte je 12 Bit).
Ich kapiers nicht wie ich die Umsetzung durch BlockRam erreiche.

Jemand ne Idee

: Bearbeitet durch User
von Markus F. (mfro)


Lesenswert?

Martin O. schrieb:
> Ich kapiers nicht wie ich die Umsetzung durch BlockRam erreiche.

Was hast Du denn im Projekt ("Settings->Compiler Settings->Advanced 
Settings (Synthesis)") eingestellt?

Zumindest "Auto ROM Replacement" sollte an sein. Dann gibt's noch 
etliche Einstellungen (entweder mit "ROM" oder "RAM" im Namen), die das 
RAM/ROM inferral beeinflussen.

von Andi (Gast)


Lesenswert?

Martin O. schrieb:
> Weitere Ideen?

Erzeug dir ein ROM gewünschter Grösse mit dem IP-Catalog und binde die 
Tabellenwerte mit einer .MIF Datei ein.

Andi

von Martin O. (ossi-2)


Lesenswert?

Problem gelöst:
Irgendwie hatte Quartus nicht genau mitbekommen, welches MAX10 Device 
ich verwende. Daraufhin ging Quartus davon aus, dass ich ein "Compact" 
Device habe. Diese können bei der Configuration keine ROM 
Initialisierung. Draufhin hat Quartus konsequenterweise darauf 
verzichtet, ROM-Tabellen zu verwenden.

Jetzt hab ich den Device-Typ offensichtlich richtig eingesstellt und
alle Methoden funktionieren jetzt vollautomatisch mit ROM und 
Initialisierung.

von Martin O. (ossi-2)


Lesenswert?

@Andi
Als ich das probiert habe kam endlicch eine Fehlermeldung die auf die 
Configuration hinwies. Das brachte mich auf die richtige Spur.

: Bearbeitet durch User
von Andi (Gast)


Lesenswert?

Heisst das, dass die BlockRams der MAX10 Compact Versionen nicht 
initialisiert werden können beim laden der Konfiguration? Das wäre ja 
ein Riesennachteil, da eigentlich nur die SC Typen wirklich günstig 
sind.

Andi

von Martin O. (ossi-2)


Angehängte Dateien:

Lesenswert?

Ich würde Table 3 im MAX-10 Config guide so interpretieren.
(Siehe Anhang)

@Andi
Hast Du Erfahrung mit MAX-10?

: Bearbeitet durch User
von Markus F. (mfro)


Lesenswert?

Im MAX10 hast Du doch user flash, aus dem Du lesen kannst?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.