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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Martin O. (ossi-2)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Im MAX10 hast Du doch user flash, aus dem Du lesen kannst?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.