mikrocontroller.net

Forum: FPGA, VHDL & Co. Rom frisst ALMs


Autor: Damian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

Ich versuche, per Verilog ein ROM zu erstellen, welches per Schalter 
umgeschaltet werden kann. Das Modul unten funktioniert soweit auch, die 
ROM belegen jedoch nicht BlockRam, sondern ALMs. Verwende ich das 
gleiche Modul mit fix einem Rom (case-Anweisung auskommentiert), wird 
wie gewünscht BlockRam verwendet.

Hat jemand eine Idee?

Ich verwende Quartus Prime Lite 17.0 mit dem Terasic Cyclone V Starter 
Board (mit mehr als genug BlockRam).

Besten Dank für die Hilfe :)

Benötigt ALMs:
module rom (
  input wire clk,
  input wire [12:0] address,
  input wire romSelect,
  output reg [7:0] dataOut
);

reg [7:0] rom0 [0:8191];
reg [7:0] rom1 [0:8191];

initial $readmemh("roms/rom0.hex",rom0);
initial $readmemh("roms/rom1.hex",rom1);

always @(posedge clk) begin
  case (romSelect)
    1'b0: dataOut <= rom0[address];
    1'b1: dataOut <= rom1[address];
  endcase  
end
  
endmodule

Alles wie gewünscht im BlockRam:
module rom (
  input wire clk,
  input wire [12:0] address,
  input wire romSelect,
  output reg [7:0] dataOut
);

reg [7:0] rom0 [0:8191];
reg [7:0] rom1 [0:8191];

initial $readmemh("roms/rom0.hex",rom0);
initial $readmemh("roms/rom1.hex",rom1);

always @(posedge clk) begin
//  case (romSelect)
//    1'b0: dataOut <= rom0[address];
//    1'b1: dataOut <= rom1[address];
//  endcase  
  dataOut <= rom0[address];
end
  
endmodule

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Damian schrieb:
> Hat jemand eine Idee?
Was schreibt denn Altera im Synthesizer Users Guide, wie man ein ROM in 
Verilog beschreiben muss, dass der Synthesizer dafür RAM-Blöcke nimmt?

Ich glaube, du musst den Multiplexer ausserhalb machen...

: Bearbeitet durch Moderator
Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar M. schrieb:
> Was schreibt denn Altera im Synthesizer Users Guide, wie man ein ROM in
> Verilog beschreiben muss, dass der Synthesizer dafür RAM-Blöcke nimmt?

Das hier:
// Single Port ROM

module single_port_rom
#(parameter DATA_WIDTH=8, parameter ADDR_WIDTH=8)
(
  input [(ADDR_WIDTH-1):0] addr,
  input clk, 
  output reg [(DATA_WIDTH-1):0] q
);

  // Declare the ROM variable
  reg [DATA_WIDTH-1:0] rom[2**ADDR_WIDTH-1:0];

  // Initialize the ROM with $readmemb.  Put the memory contents
  // in the file single_port_rom_init.txt.  Without this file,
  // this design will not compile.

  // See Verilog LRM 1364-2001 Section 17.2.8 for details on the
  // format of this file, or see the "Using $readmemb and $readmemh"
  // template later in this section.

  initial
  begin
    $readmemb("single_port_rom_init.txt", rom);
  end

  always @ (posedge clk)
  begin
    q <= rom[addr];
  end

endmodule

Lothar M. schrieb:
> Ich glaube, du musst den Multiplexer ausserhalb machen...

... das glaube ich auch. Oder Du nimmst ein doppelt grosses ROM und 
addierst beim Umschalten einfach einen Offset zur Adresse.

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Multiplexer ausserhalb des ROM-Auslesens:
module rom (
  input wire clk,
  input wire [12:0] address,
  input wire romSelect,
  output reg [7:0] dataOut
);

reg [7:0] rom0 [0:8191];
reg [7:0] rom1 [0:8191];

initial $readmemh("roms/rom0.hex",rom0);
initial $readmemh("roms/rom1.hex",rom1);

wire [7:0] q0,q1;
 
always @(posedge clk) begin
  q0 <= rom0[address];
end

always @(posedge clk) begin
  q1 <= rom1[address];
end

assign dataOut = romSelect ? q1 : q0;
  
endmodule

Oder ein Rom mit umschalten der 2 Bereiche per MSB der Adresse:
module rom (
  input wire clk,
  input wire [12:0] address,
  input wire romSelect,
  output reg [7:0] dataOut
);

reg [7:0] rom0 [0:16383];

initial $readmemh("roms/rom0.hex",rom0,0);
initial $readmemh("roms/rom1.hex",rom0,8192);

 
always @(posedge clk) begin
  dataOut <= rom0[{romSelect,address}];
end
  
endmodule

Andi

P.S. Gibt es eigentlich ein Syntaxhighlighting für Verilog in diesem 
Forum?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andi schrieb:
> P.S. Gibt es eigentlich ein Syntaxhighlighting für Verilog in diesem
> Forum?
Nein. Ich nehme auch immer die [c] Tags...

Autor: Damian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke allen und v.a. Andi, genau was ich gesucht habe :)

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.

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