Forum: FPGA, VHDL & Co. C Schleife in VHDL umsetzen


von Andre S. (fpga_student)


Lesenswert?

Hallo Forum,

ich habe folgende C-Code und möchte diesen in VHDL umsetzen und auf 
meinem DE2-115 Board laufen lassen.

Bei dem Code handelt es sich um eine for-Schleife bei der eine Variable 
bis zu einem bestimmten Wert erhöht wird. Die Laufvariable wird mit 
einem Offset erhöht (0x80) und als Adresse genutzt, um aus einem Fifo 
etwas auszulesen. Danach muss der Offset gleich wieder abgezogen werden. 
Das folgende Programm benötigt diese Anweisung so. Ist nicht 
veränderbar.
In C, weis ich das dies sequentiell abgearbeitet wird, und somit kein 
Problem darstellt, aber in VHDL, wenn ich diese Berechnungen einem 
Signal zuweise wird nur die letzte Zuweisung am Ende eines Processes 
übernommen. Hat einer von euch einen Tip wie ich das realisieren kann, 
das beim einem Takt erst der Wert + Offset einem Signal zugewiesen wird 
und beim nächsten Takt, dann der nächste Wert. Vielen Dank.

jetzt noch der C-Code:

void fifo_read(int* pArr)
{
   for(addr =0; addr <= fifo_length; addr++)
   {
     pio_data(fifo_address, 0x80 + addr);
     pio_data(fifo_adress, 0x00);
     pArr[addr] = io_data(data);
   }
}

von Gustl B. (-gb-)


Lesenswert?

if addr < fifo_lenght then
 addr <= addr+1;
end if;

Das wird dann so aber in jedem Takt gemacht. Also keine Ahnung wie 
schnell Du lesen/schreiben kannst.

Andre Schlurch schrieb:
> Das folgende Programm benötigt diese Anweisung so.

In C vielleicht, in VHDL sieht das vermutlich schon ganz anders aus ... 
mehr Informationen wären schon nicht schlecht.

von Marius S. (lupin) Benutzerseite


Lesenswert?

Andre Schlurch schrieb:
> Das folgende Programm benötigt diese Anweisung so.

Was für ein Programm? Oder meinst du die darauf folgende Hardware? Auf 
FPGAs laufen in der Regel keine Programme, es sei denn du beschreibst 
einen Prozessor im FPGA, auf den dann ein Programm läuft.

Aus deinem Code werde ich nicht schlau. Was ist der Unterschied zwischen 
fifo_address und fifo_adress? Oder zwischen pio_data und io_data? Und wo 
kommt data her?

Andre Schlurch schrieb im Beitrag #3504002:
> wenn ich das
> gleiche Signal mit zwei unterschiedlichen Werten beschreibe

Grindguakn hat schon recht, musst in Hardware denken.
Was du in VHDL beschreibst muss in Hardware umgesetzt werden. Was du 
innerhalb eines Prozesses beschreibst ist eine Schaltung und die kann 
von sich aus nicht zwei Werte hintereinander ausgeben. Das geht z.B. nur 
wenn du deine Schaltung taktest. Mit jeden Takt wird ein neuer Wert 
berechnet, der dann bis zum nächsten Takt gültig ist.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Andre Schlurch schrieb:
> Hat einer von euch einen Tip wie ich das realisieren kann, das beim
> einem Takt erst der Wert + Offset einem Signal zugewiesen wird und beim
> nächsten Takt, dann der nächste Wert. Vielen Dank.
Du brauchst einen Zustandsautomaten. Wenn du es geschickt machst, reicht 
der Zähler als Automat aus (Zähler sind nämlich schon die einfachsten 
FSM, die es gibt...).

Aber ich würde mal vorschlagen, du zeichnest erst mal ein zeitliches 
Ablausdriagramm, wass wann von wo geholt wird und nach wo geschrieben 
wird, aus dem C-Schnipsel wird das nicht so ganz klar...

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

zufällig habe ich eine ähnlichen Prozess bei mir gefunden. Lesen sieht 
genaus aus. Nur andersherum die  Datenzuweisung

   data_out<=fifo_ram(to_integer(waddr));



  process(wclk)
  begin
    if wclk'event and wclk = '1' then
      if reset = '1' then
        waddr           <= (others => '0');
      elsif wr = '1' then
        fifo_ram(to_integer(waddr)) <= data_in;
          waddr <= waddr+1;
      end if;
    end if;
  end process;

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.