Quartus II e RAM

Sezione dedicata alle logiche programmabili

Quartus II e RAM

Postby zaxxon » 06 Sep 2013, 16:53

Sto facendo alcune prove con un moduletto FPGA Cyclone II ed un display LCD 84x48 monocromatico.
Per visualizzare un'immagine pensavo di utilizzare uno dei blocchi SRAM presenti nel chip; nel codice verilog, per andare sul sicuro, ho utilizzato il template generato automaticamente dal Quartus II.

In effetti dai log di compilazione riconosce la presenza della memoria, ma nel report finale mi indica come utilizzati 0 bit.
Tutto funziona regolarmente, quindi al posto della RAM sta utilizzando delle LE, ma non capisco il perché.

Con RTL Viewer sembra esserci la RAM, ma poi con il Map Viewer ci sono solo LE.

Magari è perché di fatto la inizializzo con $readmemh e poi non ci scrivo più nulla, la leggo solamente; forse per otimizzazioni interne lui decide di usare le LE.

C'è un modo per forzarlo ad usare la RAM?

Grazie, ciao!
zaxxon
 
Posts: 17
Joined: 07 Aug 2013, 16:10

Re: Quartus II e RAM

Postby Leonardo » 06 Sep 2013, 17:15

Salve zaxxon,
Puoi allegare il progetto? Con Quartus puoi andare sul menù "Project / Archive Project", scegliere la posizione dove salvare l'archivio sul computer e premere "Archive" dopodiché pubblicare il file .qar sul forum

Leonardo
Il mio blog di elettronica: http://electro-logic.blogspot.it
User avatar
Leonardo
 
Posts: 502
Joined: 29 May 2013, 22:31
Location: Parma

Re: Quartus II e RAM

Postby deluca » 06 Sep 2013, 17:50

salve zaxxon, come ti ha già consigliato leonardo,

prova ad allegare il progetto.
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Quartus II e RAM

Postby zaxxon » 07 Sep 2013, 07:15

Ho appena provato, ma mi dice che l'estensione qar non è permessa, quindi l'ho zippato.

Tenete presente che è scritto in verilog, che a voi non piace, ma il problema penso sia nelle impostazioni di Quartus (versione 13.0.1 web edition).

Grazie.
Attachments
LCD5110.qar.zip
Mostra immagine su LCD Nokia 5110.
(15.05 KiB) Downloaded 412 times
zaxxon
 
Posts: 17
Joined: 07 Aug 2013, 16:10

Re: Quartus II e RAM

Postby zaxxon » 07 Sep 2013, 10:50

Ho provato a modificare il modulo, senza usare il template della RAM di Quartus, ma dichiarando semplicemente una variabile del tipo:

Code: Select all
 reg [7:0] Image [511:0];


Ovviamente funziona tutto, anche qui non va ad occupare la RAM ma le LE, ma la cosa più assurda è che durante la compilazione mi da dei warning perché non inizializzo i valori di data_a, we_a, ecc... cioè gli ingressi di un modulo ram, che evidentemente lui crea internamente.

Inoltre adesso è più complesso, perché nel display ho una parte fissa ed una in movimento, occupo oltre 900 LE ma nessun bit di RAM. :(

Vedremo se nelle prossime prove, quando avrò necessità di scrivere nella RAM, si renderà conto che è meglio usare un blocco RAM...
zaxxon
 
Posts: 17
Joined: 07 Aug 2013, 16:10

Re: Quartus II e RAM

Postby Leonardo » 07 Sep 2013, 11:44

Va benissimo il file .qar zippato

Intanto come prima cosa cerchiamo di analizzare i Warning generati dal compilatore:

Warning (10850): Verilog HDL warning at LCDImage.v(76): number of words (504) in memory file does not match the number of elements in the address range [0:511]

Ci dice che il file di memoria è più piccolo di 512 byte

Warning (127007): Memory Initialization File or Hexadecimal (Intel-Format) File ".." contains "don't care" values -- overwriting them with 0s

Quartus completa il file di memoria con dei don't care che vengono sovrascritti con degli zeri nell'elaborazione finale, ad ogni modo non sono questi i veri problemi, per risolvere questi due Warning puoi aggiungere 00 00 00 00 00 00 00 00 al file Image.mif

Warning (12241): 1 hierarchies have connectivity warnings - see the Connectivity Checks report folder

Abbiamo dei problemi che possiamo visualizzare nel report di compilazione "Analysis & Syntesis" sotto alla cartella "Connectivity Checks", sono per LCDImage e sono:

Data -> Stuck at GND
We -> Input port expression (32 bits) is wider than the input port (1 bits) it drives. The 31 most-significant bit(s) in the expression will be dangling if they have no other fanouts.
we[-1] -> Stuck at GND

In sostanza utilizzi la RAM in sola lettura e quindi è corretto che Data e We siano collegati a GND, We (write enable) però è specificato come numero a 32 bit, per eliminare il warning puoi sostituire:
Code: Select all
single_port_ram_with_init Image(8'h0, Counter, 0, clock, Data);

con
Code: Select all
single_port_ram_with_init Image(8'h0, Counter, 1'b0, clock, Data);

Warning (332060): Node: CLOCK_50 was determined to be a clock but was found without an associated clock assignment.
Warning (332060): Node: Controller_5110:inst2|C5110_InternalClock:IC|bit_clock was determined to be a clock but was found without an associated clock assignment.

Un gated clock non è una buona idea su una FPGA, elimina la porta NOT sul segnale di clock per eliminare i rimanenti warning nell'analisi e sintesi

Warning (332153): Family doesn't support jitter analysis.

Passiamo adesso al file SDC, il comando derive_clock_uncertainty che permette di calcolare automaticamente l'incertezza del jitter ed altri effetti non è supportato dalla famiglia Cyclone II, eliminandolo si eviterà il Warning

Per un'analisi delle tempistiche cancella il contenuto del file SDC ed inserisci le seguenti righe:
Code: Select all
create_clock -name "CLOCK_50" -period 20.000ns [get_ports {CLOCK_50}]
derive_pll_clocks -create_base_clocks

Ti consiglio di utilizzare il menù "Assignments / TimeQuest Timing Analyzer Wizard" per generare il file SDC le prossime volte

Warning (332060): Node: Controller_5110:inst2|C5110_InternalClock:IC|bit_clock was determined to be a clock but was found without an associated clock assignment.

Il segnale bit_clock è un clock ma non ha assegnamenti, puoi aggiungere al file SDC il comando
Code: Select all
derive_clocks -period 1000.000ns

per indicare che gli ulteriori clock rilevati (oltre a CLOCK_50) devono avere periodo massimo ad esempio di 1 MHz, adesso potrai analizzare i risultati di TimeQuest

Appena ho tempo finisco di scrivere a proposito della RAM

Ciao
Il mio blog di elettronica: http://electro-logic.blogspot.it
User avatar
Leonardo
 
Posts: 502
Joined: 29 May 2013, 22:31
Location: Parma

Re: Quartus II e RAM

Postby zaxxon » 07 Sep 2013, 12:25

Grazie. Per la lunghezza del file e l'ampiezza di we avevo già risolto, ma comunque elimina solo i warning in quanto fa già la cosa giusta da solo.

Per quanto riguarda il timing, non ho ancora letto nulla, per cui mi limitavo a fare un copia-incolla del file sdc usato nel tutorial della de0-nano.

Sono curioso di capire perché non utilizza il blocco RAM... attendo fiducioso.

Grazie, ciao!
zaxxon
 
Posts: 17
Joined: 07 Aug 2013, 16:10

Re: Quartus II e RAM

Postby Leonardo » 07 Sep 2013, 14:31

Secondo me non inferisce automaticamente la memoria M4K perché il file di inizializzazione crea dei problemi.

Potresti provare a realizzare una ROM per inizializzare la RAM ma il modo più efficiente e rapido (a scapito della portabilità su device non-Altera) è utilizzare la Megafunction "RAM: 1-PORT" che trovi sotto Memory Compiler e che permette di instanziare direttamente e senza indugi blocchi ram utilizzando le risorse M4K con tanto di file di inizializzazione.

I passi da seguire sono:
- creare un nuovo file di memoria tramite il menù New, sarà nel formato adatto a Quartus
- andare su menù "Tools / MegaWizard Plug-in Manager"
- scegliere "Create a new custom megafunction variation"
- scegliere il plug-in "Memory Compiler / RAM: 1-PORT"
- scegliere Verilog HDL e aggiungere il nome del file da creare (es. ram)
- scegliere 8 bits / 512 words e M4K
- avanti, avanti e scegliere "Yes, use this file for memory content data", indicare il file creato al primo passo
- scegliere Finish

Basterà poi sostituire

Code: Select all
single_port_ram_with_init Image(8'h0, Counter, 1'b0, clock, Data);

con
Code: Select all
ram Image(Counter, clock, 8'h0, 1'b0, Data);


Ed il gioco sarà fatto
Leonardo
Il mio blog di elettronica: http://electro-logic.blogspot.it
User avatar
Leonardo
 
Posts: 502
Joined: 29 May 2013, 22:31
Location: Parma

Re: Quartus II e RAM

Postby zaxxon » 07 Sep 2013, 15:21

Grazie, ma ho appena risolto in altro modo, anche se simile: io usavo il template della RAM perché nel chip ci sono blocchi di RAM, ma l'utilizzo che ne faccio al momento è una ROM, quindi mi è bastato sostituire il template della RAM con quello della ROM e magicamente ha iniziato ad usare un blocco da 4K.

In questo modo purtroppo appaiono dei warning relativi alla mancata inizializzazione degli ingressi rom.data_a, rom.waddr_a e rom.we_a, ma è un problema conosciuto ed il workaround di altera consiglia solo di ignorare i warning.

Questo è il template generato:

Code: Select all
// Quartus II Verilog Template
// Single Port ROM

module single_port_rom
#(parameter DATA_WIDTH=8, parameter ADDR_WIDTH=9)
(
   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
      $readmemh("Image.mif", rom);
   end

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


Ed ovviamente la variabile Image viene dichiarata così:

Code: Select all
single_port_rom Image(Counter, clock, Data);


Vedremo quando dovrò usare i blocchi realmente come RAM se si comporta nel modo giusto.

Grazie!!! :)
zaxxon
 
Posts: 17
Joined: 07 Aug 2013, 16:10

Re: Quartus II e RAM

Postby Leonardo » 07 Sep 2013, 16:04

Prego :)
Il mio blog di elettronica: http://electro-logic.blogspot.it
User avatar
Leonardo
 
Posts: 502
Joined: 29 May 2013, 22:31
Location: Parma

Re: Quartus II e RAM

Postby zaxxon » 09 Sep 2013, 14:39

Per concludere il discorso, ho ampliato il progetto, adesso simulo un display a caratteri sul display grafico.
Utilizzo una ROM per il generatore di caratteri, dove ho messo le shape dei vari caratteri di matrice 6x8.
Utilizzo una RAM di ben 84 byte come memoria video a doppia porta: una viene usata solo in lettura per fare il refresh continuo del display, l'altra viene usata in scrittura per modificare il contenuto di quanto visualizzato.

In questo caso Quartus ha riconosciuto ed implementato entrambe le memorie correttamente.

Quindi basta usare l'attrezzo giusto per il lavoro giusto, e tutto fila liscio. ;)

Saluti.
zaxxon
 
Posts: 17
Joined: 07 Aug 2013, 16:10

Re: Quartus II e RAM

Postby legacy » 09 Sep 2013, 19:32

Carino il progetto. Ho fatto una cosa simile per un tubo CGA.
legacy
 
Posts: 862
Joined: 12 Mar 2012, 11:30

Re: Quartus II e RAM

Postby Altero » 14 Sep 2013, 11:50

zaxxon, verilog? oh nooooo
io voglio interfacciare un display lcd alfanumerico 16x2 classico con una fpga in vhdlllll !
qualcuno di voi lo ha mai controllato in modo da fargli scrivere il classico "Hello world".

Ci sto smanettando da un bel pò, ma è un casino.

Quindi complimenti zaxxon :) :)
Altero
 
Posts: 46
Joined: 20 Apr 2012, 09:33


Return to FPGA & CPLD

Who is online

Users browsing this forum: No registered users and 2 guests

cron