Forum: FPGA, VHDL & Co. Xilinx BRAM stoppt schreiben


von Geza E. (geza)


Angehängte Dateien:

Lesenswert?

Hallo liebes Forum,

Ich bin gerade an der Speicherung von Zählerdaten. Diese werden vom 
Xilinx FPGA auf einen BRAM und dann über BRAM Controller auf die SD 
Karte des Boards gespeichert. Dies funktioniert soweit ganz gut, nur 
bricht die Speicherung auf den BRAM nach max ca 1630 Zyklen und damit ca 
6,5KB ab. Der BRAM wäre aber größer (zb 32KB in Vivado konfiguriert), 
also warum schreibt dieser nicht mehr Daten hinein? Ich habe noch kein 
Abbruchkriterium drinnen, wollte mal sehen, wie der Ablauf so hinhaut. 
Hat wer Ideen, wieso die Speicherung stoppt? Manchmal stoppt diese auch 
bereits früher. Kann es sein das das auslesen der Daten aus dem DualPort 
RAM über den PS das schreiben blockiert? Anbei das Blockschaltbild. LED 
und SW sind mal als Dummy ohne wirklichem Sinn drinnen.

Vielen Dank für die jede Art von Hilfe.

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


Lesenswert?

Geza E. schrieb:
> nur bricht die Speicherung auf den BRAM nach max ca 1630 Zyklen und
> damit ca 6,5KB ab.
Wie stellst du das fest?

> Der BRAM wäre aber größer (zb 32KB in Vivado konfiguriert), also warum
> schreibt dieser nicht mehr Daten hinein?
Das BRAM ist sicher nicht dein Problem, denn das wird nur gesteuert und 
wenn was schiefgeht, dann steht da halt einfach Müll drin.

> also warum schreibt dieser nicht mehr
Welcher "dieser" schreibt da überhaupt?

von Geza E. (geza)


Lesenswert?

Lothar M. schrieb:
> Geza E. schrieb:
>> nur bricht die Speicherung auf den BRAM nach max ca 1630 Zyklen und
>> damit ca 6,5KB ab.
> Wie stellst du das fest?
> Ich lese die BRAM Adressen in SDK im Memory View aus und auf der SD Karte sind 
ebenfalls die Werte in der Bit Datei drinnen.
>
>> also warum schreibt dieser nicht mehr
> Welcher "dieser" schreibt da überhaupt?
Ah entschuldigung, das erwähnte ich nicht. Die Werte kommen aus dem 
Counter, als 32Bit Zahlen samt der Adressen und den für den BRAM 
notwendigen AXI Variablen (clk, wren, en). Der Counter zählt von 1-5000 
mit seiner verlangsamten Clock clka, mit 400kS/S.
Aber ich glaub das Problem könnte darin liegen, dass der PS beim RUN des 
C-Codes den PL stoppt? Wenn ich die Clock für den Zähler verlangsame 
(40kS/S), kommen 1/10 der Werte in den BRAM. Könnte das sein?

von Gustl (Gast)


Lesenswert?

Geza E. schrieb:
> dem Counter

Code?

Geza E. schrieb:
> AXI Variablen (clk, wren, en)

Das sind Signale!

Geza E. schrieb:
> kS/S

Kilosiemens je Siemens?

Geza E. schrieb:
> Aber ich glaub das Problem könnte darin liegen, dass der PS beim RUN des
> C-Codes den PL stoppt?

Nicht glauben, messen oder herzeigen. Messen geht prima mit dem ILA, 
herzeigen kann man Code. Und noch viel besser ist erstmal simulieren.

Geza E. schrieb:
> Könnte das sein?

Es fehlen noch fast alle Details. Bisher haben wir nur ein Bildchen und 
ein paar schwammige Aussagen. Wie soll man da helfen? Wo ist das Probem 
einfach das Projekt als .zip hochzuladen?

von Geza E. (geza)


Lesenswert?

Also zur Simulation: Der BRAM ist in der Simulation normal gelaufen. Bis 
5000 aber nicht, da dies so langsam war, aber zu geringeren Maxwerten 
hat das Abbruchkriterium funktioniert. Ob 300 oder 5000 Cycles sollte 
sich hier in Vivado wohl nichts mehr ändern oder?
Sonst mach ich morgen eine ausgedehnte Pause und lass es mal 
durchlaufen.

kS/s - Kilosamples pro Sekunde meinte ich

Mein ILA hat leider noch nicht recht funktioniert, wollte damit die 
Daten in den BRAM Controller auslesen, da kam aber nichts, obwohl sie 
danach aber auf der SD waren, also da sein mussten!

Ich bin erst morgen wieder im Labor, da kann ich die Datei als .zip dann 
raufstellen wenn das hilft. Dachte zuerst vll ist der Fehler im Design 
ersichtlich. Wie gesagt ich hab hier leide keine Ahnung mehr woran es 
liegen kann. Ob es eine Kleinigkeit ist oder der Ansatz der Falsche... 
Danke schonmal für die Infos und Hilfe! Bin für jeden Tipp sehr dankbar!

Einstweilen der Code. Eher unspektakulär für geübte Anwender glaub ich.
Ich hoffe es kommt euch nicht der graus beim Anblick

Der VHDL Code:
[vhdl]
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

entity CNT2 is
  Port (
    clk    : in STD_LOGIC;
    reset : in STD_LOGIC;
    SW : in STD_LOGIC;
    SW2 : in STD_LOGIC;
    LED : out STD_LOGIC_vector(1 downto 0) := "00"; --rot/grün leuchtet 
zu Beginn
    LED2 : out STD_LOGIC := '1'; --blau LED
    count2 : out STD_LOGIC_vector(31 downto 0); --integer :=0;
    wren: out STD_LOGIC := '1';
    wren4: out STD_LOGIC_vector(3 downto 0) := "1111";
    clock_out: out std_logic; --langsame Clock
    addra : out STD_LOGIC_vector(31 downto 0)
  );
end CNT2;
architecture Behavioral of CNT2 is
signal limit : INTEGER :=0;
signal cnt  :  INTEGER RANGE 0 TO 5201 := 0; --Integer hat range von 32 
Bit, durch angabe von extra range wird dieser angepasst
signal count: integer :=1;
signal tmp : std_logic := '0';
signal addrcnt :  INTEGER RANGE 0 TO 40801 := 0; --TO 257 := 0;
begin
process(clk,reset,SW)
begin
if(reset='1' or SW = '1') then
    count<=1;
    LED <= "01"; --rot bleibt an also ist rot LED[01] 0 an höchstem Bit
    tmp<='0';
    elsif(clk'event and clk='1') then
    LED2 <= SW2;
    count <=count+1;
      if (cnt = 5000) then --Aufhören zum zählen
      addrcnt <= 0;
      count2 <= conv_std_logic_vector(0,32);
      addra <= conv_std_logic_vector(0,32);
      wren <= '0';
      elsif (count = 125) then
           tmp <= NOT tmp;
           cnt <= cnt + 1;
           addrcnt <= addrcnt +4;
       elsif (count = 250) then
           tmp <= NOT tmp;
           addra <= conv_std_logic_vector(addrcnt,32);
           count2 <= conv_std_logic_vector(cnt,32);
           count <= 1;
    end if;
end if;
clock_out <= tmp;
end process;

end Behavioral;
[vhdl]

Hier der C-Code in SDK. Liest im Endeffekt nur die Daten aus der BRAM 
Adresse und schreibt sie in den Ordner auf der SD:
[c]
#include <stdio.h>
#include "xsdps.h" /*SD Device driver*/
#include "platform.h"
#include "xil_io.h"
#include "ff.h"
#include "xil_cache.h"
#include <stdlib.h>
#include "xstatus.h"
#include "xparameters.h"
#include "xil_printf.h"
#include "xplatform_info.h"


FATFS  fatfs;
static int SD_Init();
static int SD_Eject();
static int WriteFile(char *FileName, u32 size, u32 SourceAddress);
int word2;
int addrbram;

#define inputImageWidth 512 //Speicherweite
#define inputImageHeight 512 //Speicherhˆhe
#define size32 32000 //32000 //Speichergrˆfle

//char imageBuffer[inputImageWidth*inputImageHeight*3];
uint32_t imageBuffer[32000];//[32000]

int main()
{
  int Status;

    Status = SD_Init(&fatfs); /* Mount/Unmount a logical drive */
    if (Status != XST_SUCCESS) {
     print("file system init failed\n\r");
       return XST_FAILURE;
    }
    /*Status = ReadFile("data.bin",(u32)imageBuffer); //Name length only 
5 characters
    if (Status != XST_SUCCESS) {
     print("file read failed\n\r");
       return XST_FAILURE;
    }*/

    addrbram = XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR; //Hier wird 
//Startadresse angegeben, auf die die Speichergrˆfle angeh‰ngt wird
    xil_printf("Speicheraddr = 0x%08x\n\r", addrbram);

    Status = WriteFile("dat2.bin",size32,(u32)imageBuffer); // 
(inputImageWidth*inputImageHeight*3),(u32)imageBuffer); char *FileName, 
u32 size, u32 SourceAddress
    if (Status != XST_SUCCESS) {
     print("file write failed\n\r");
       return XST_FAILURE;
    }
    Status=SD_Eject(&fatfs);
    if (Status != XST_SUCCESS) {
     print("SD card unmount failed\n\r");
       return XST_FAILURE;
    }
  xil_printf("done...");
    return 0;
}
static int SD_Init()
{
  FRESULT rc;
  TCHAR *Path = "0:/";
  rc = f_mount(&fatfs,Path,0); /* Mount/Unmount a logical drive */
  if (rc) {
    xil_printf(" ERROR : f_mount returned %d\r\n", rc);
    return XST_FAILURE;
  }
  return XST_SUCCESS;
}

static int SD_Eject()
{
  FRESULT rc;
  TCHAR *Path = "0:/";
  rc = f_mount(0,Path,1);
  if (rc) {
    xil_printf(" ERROR : f_mount returned %d\r\n", rc);
    return XST_FAILURE;
  }
  return XST_SUCCESS;
}
static int WriteFile(char *FileName, u32 size, u32 SourceAddress){
  UINT btw;
  static FIL fil; // File instance
  FRESULT rc; // FRESULT variable
  rc = f_open(&fil, (char *)FileName, FA_OPEN_ALWAYS | FA_WRITE); 
//f_open macht File "data"
  if (rc) {
    xil_printf(" ERROR : f_open returned %d\r\n", rc);
    return XST_FAILURE;
  }

  rc = f_write(&fil,(const void*)addrbram,size,&btw); //Schreibt Daten 
aus addrbram ins File
  //&fil [IN] Pointer to the file object structur Speicherort Daten,
  //(const void*)addrbram [IN] Pointer to the data to be written, Daten 
aus BRAM
  //[IN] Number of bytes to write, Datengrˆfle
  //[OUT] Pointer to the variable to return number of bytes written
  if (rc) {
    xil_printf(" ERROR : f_write returned %d\r\n", rc);
    return XST_FAILURE;
  }
  rc = f_close(&fil);
  if (rc) {
    xil_printf(" ERROR : f_write returned %d\r\n", rc);
    return XST_FAILURE;
  }
  return XST_SUCCESS;
}
[c]

von Oh oh (Gast)


Lesenswert?

Schöner Asynchroner Reset...

von Ohweia (Gast)


Lesenswert?

Wenn ein Softwaremensch Hardwarebeschreibungen macht...

von Gustl B. (-gb-)


Angehängte Dateien:

Lesenswert?

Ohweia schrieb:
> Wenn ein Softwaremensch Hardwarebeschreibungen macht...

Allerdings. Klare Empfehlung:
Lerne die Grundlagen!

Jedenfalls in der Simulation kommt das raus wie im Bildchen. Dauert auch 
nicht lange zu simulieren. Das Bild zeigt das "Ende", also wenn cnt die 
5000 erreicht.

Außerdem dabei:
Etwas aufgehybschter (nein, ich habe keine Fehler korrigiert) VHDL Code 
samt sehr einfacher Testbench.

von Geza E. (geza)


Angehängte Dateien:

Lesenswert?

> Jedenfalls in der Simulation kommt das raus wie im Bildchen. Dauert auch
> nicht lange zu simulieren. Das Bild zeigt das "Ende", also wenn cnt die
> 5000 erreicht.
Okay, also der Code würde somit den BRAM befüllen. Also liegt das 
Problem am BRAM? Konfiguration laut Bild. Also 32KByte Adressrange im 
Adress Editor, mit 131072Bits was eben zumindest 4096 32Bit Einträge 
zulassen würde. Warum auch immer, lässt der Memory Generator keine 
32KByte zu. Hat da wer Erfahrung mit der Auslegung und maximalem 
Speicher? Sollte bei mir am Zynq700 140 BRAM zu je 36KB haben!

Anbei die Datei als .zip neu, mit dem Code von @Gustl.B Allerdings zeigt 
mir nun SDK gar keine Werte mehr an. Keine Ahnung wieso das.

> Außerdem dabei:
> Etwas aufgehybschter (nein, ich habe keine Fehler korrigiert) VHDL Code
> samt sehr einfacher Testbench.
Vielen Dank fürs Drüberschaun. Sieht schon feiner aus, da fehlt mir noch 
die Erfahrung, mit der Testbench gehts wirklich flott!

Ps: Mit den ganzen IP ist das File leider echt groß, obwohl nichts 
großartiges passiert.

: Bearbeitet durch User
von Gustl B. (-gb-)


Lesenswert?

Geza E. schrieb:
> Also 32KByte Adressrange, mit
> 131072Bits was eben zumindest 4096 32Bit Einträge zulassen würde.

Ähm ... laut Bildchen sind das 131072 Einträge mit je 32 Bits macht ... 
512 kByte. Und das ist schon eher sehr viel.

Wenn du nur 4096 Einträge haben willst, dann stelle die Depth auch auf 
4096.

Aber:
Deine Adresse geht bis 19996. Das passt also nicht mit 4096 Adressen.

Aber:
Deine Adresse zählt immer um 4 hoch. Die letzten zwei Bits der Aadresse 
sind also konstant und du nutzt so nicht den gesamten Speicher, sondern 
immer nur ein Viertel, eben jede vierte Adresse.
Statt von 0 bis 19996 könntest du das auch einfach durch 4 teilen, also 
die beiden LSBs der Adresse weglassen und dann geht das nurnoch von 0 
bis 4999. Passt aber weiterhin nicht in 4096 Adressen.

Aber:
Was willst du überhaupt mit einem Zähler und dem BRAM?
Wenn da sowieso nur einmalig Werte reingeschrieben werden, dann könnte 
man die auch einmalig berechnen und dann den BRAM über eine Datei 
vorinitialisieren.
Weil die Werte berechenbar sind, könnte man sich auch im VHDL eine 
Funktion schreiben die den BRAM vorinitialisiert.
Und weil das eine Funktion ist, ist die Frage wieso das überhaupt in 
einen BRAM geschrieben werden soll. Das könnte doch die CPU im Zynq 
direkt berechnen.

... oder machst du das mit dem Zähler nur um mal das mit dem BRAM 
auszuprobieren ohne tieferen Sinn?

von Geza E. (geza)


Lesenswert?

Gustl B. schrieb:
> Ähm ... laut Bildchen sind das 131072 Einträge mit je 32 Bits macht ...
> 512 kByte. Und das ist schon eher sehr viel.
Okay, war mir nicht sicher weil oben Bit steht, was damit gemeint war. 
Gut das hilft schon sehr!! Also genug Speicher vorhanden :) Vielen Dank 
für die Klarstellung!
> Aber:
...
> ... oder machst du das mit dem Zähler nur um mal das mit dem BRAM
> auszuprobieren ohne tieferen Sinn?
Zu dem "Aber". Ja ich mache das als Test um später 32 Bit große Daten 
aus einem Mikrofon auf der SD Karte speichern zu können. Die Filterung 
am FPGA mit 22Bit am Ausgang hätte ich schon getestet, allerdings keine 
Ahnung wie ich das am besten speichern kann. Dachte BRAM wäre am 
einfachsten zum Umsetzen. Der BRAM wäre nur der Zwischenspeicher, wo die 
ankommenden Daten (39Kilosample/s) für 1-3 Sekunden gepuffert werden 
sollten, damit ich die dann auf die SD schieben kann. Wäre das eine 
Möglichkeit über BRAM? Theoretisch vom Speicher machbar oder? Sonst 
müsste ich während dem aufnehmen der Signale immer wieder auslesen und 
den BRAM neu beschreiben, falls da zu wenig Platz verfügbar wäre...

: Bearbeitet durch User
von Gustl B. (-gb-)


Lesenswert?

BRAM verwendet man eher für kleine Zwischenspeicher. Auf deinem FPGA 
Board mit Zynq hast du bestimmt auch DDR RAM drauf. Ist eben die Frage 
wie du das bauen möchtest. Du kannst direkt ohne CPU die Daten auf die 
Karte schreiben, quasi live. Du kannst aber auch über die CPU gehen und 
von der aus auf die Karte schreiben. Aber den BRAM brauchst du wohl 
nicht, die Datenrate ist niedrig. Wenn, dann würde ich da einen kleinen 
FIFO in BRAM einbauen um Schreibpausen der Karte zu puffern, aber da 
reichen ein paar wenige kBytes.

Geza E. schrieb:
> Der BRAM wäre nur der Zwischenspeicher, wo die
> ankommenden Daten (39Kilosample/s) für 1-3 Sekunden gepuffert werden
> sollten, damit ich die dann auf die SD schieben kann.

Ja das geht, aber muss nicht. Vermutlich reicht es deutlich weniger als 
eine Sekunde zu puffern. Und das brauchst du nicht selbst über einen 
BRAM mit Adressen zu machen, sondern du kannst dir gleich einen FIFO 
generieren lassen. Der hat eine Schreibseite und eine Leseseite. Und die 
Bedingung ist, dass du im zeitlichen Mittel nicht schneller schreibst 
als du liest. Wenn du also langsamer liest als schreibst, dann läuft der 
voll.

Wenn du den Weg über die CPU gehst kannst du den Puffer auch in Software 
bauen und die Daten in dem RAM der CPU/PS ablegen.

von Geza E. (geza)


Lesenswert?

Gustl B. schrieb:
> BRAM verwendet man eher für kleine Zwischenspeicher. Auf deinem FPGA
> Board mit Zynq hast du bestimmt auch DDR RAM drauf. Ist eben die Frage
> wie du das bauen möchtest. Du kannst direkt ohne CPU die Daten auf die
> Karte schreiben, quasi live. Du kannst aber auch über die CPU gehen und
> von der aus auf die Karte schreiben. Aber den BRAM brauchst du wohl
> nicht, die Datenrate ist niedrig. Wenn, dann würde ich da einen kleinen
> FIFO in BRAM einbauen um Schreibpausen der Karte zu puffern, aber da
> reichen ein paar wenige kBytes.
Wie könnte ich denn direkt vom PL auf die Karte schreiben? Dachte das 
muss über den PS gehen, über das AMBA Interface oder in der Art. Das 
Puffern wär so als Notlösung, falls ich nicht den ganzen BRAM 
vollschreiben kann und ich mehr Platz benötige um die paar Sekunden 
Signal zu speichern. Im Grunde brauche ich eine möglichst einfache Art 
ca 3s Sekunden Signal auf die Karte zu bekommen. Dann könnte ich die 
Mikrofone und den Filter den ich im PL implementierten will vergleichen.
Schreibgeschwindigkeit bei den knapp 40kS/s direkt auf die SD wäre 
eignetlich möglich. Hatte ich aber noch nirgends was darüber gelesen :/
>
> Ja das geht, aber muss nicht. Vermutlich reicht es deutlich weniger als
> eine Sekunde zu puffern. Und das brauchst du nicht selbst über einen
> BRAM mit Adressen zu machen, sondern du kannst dir gleich einen FIFO
> generieren lassen. Der hat eine Schreibseite und eine Leseseite. Und die
> Bedingung ist, dass du im zeitlichen Mittel nicht schneller schreibst
> als du liest. Wenn du also langsamer liest als schreibst, dann läuft der voll.
> Wenn du den Weg über die CPU gehst kannst du den Puffer auch in Software bauen 
und die Daten in dem RAM der CPU/PS ablegen.

Also lieber FIFO statt BRAM beschreiben? Und als Trigger zum lesen ein 
Signal aus dem PL? Leider ist mir da nicht ganz klar wie ich da am 
besten den FPGA mit dem PS synchronisiere. Hätte da an ein Signal aus 
dem PL gedacht, mit dem ich über GPIO das lesen des Puffers in der CPU 
starte, wenn der voll ist? Wäre das eine Möglichkeit?
Vielen Dank schonmal für die Hilfe! Ich steh da etwas im Dunklen vor den 
ganzen Möglichkeiten.

von Gustl B. (-gb-)


Lesenswert?

Geza E. schrieb:
> Wie könnte ich denn direkt vom PL auf die Karte schreiben? Dachte das
> muss über den PS gehen

Eigentlich nein. Man muss eben das Interface für die SD Karte 
implementieren. Mit dem PS und einer Hochsprache geht das aber 
vermutlich einfacher.

Geza E. schrieb:
> Also lieber FIFO statt BRAM beschreiben?

Vermute ich. Aber habe ich noch nicht gemacht.

Aber:
Wieso überhaupt SD Karte? Das ist doch lästig die reinstecken, 
speichern, rausziehen, auslesen, ... du könntest die Daten doch auch 
direkt zum PC übertragen. UART schafft diese Datenrate ganz locker.

von Geza E. (geza)


Lesenswert?

Gustl B. schrieb:
> Eigentlich nein. Man muss eben das Interface für die SD Karte
> implementieren. Mit dem PS und einer Hochsprache geht das aber
> vermutlich einfacher.
Genau. Soweit einen Ordner erstellen und beschreiben klappt ja schon. 
Ich muss nur die Daten aus einer Adresse aus dem PL lesen. Da scheint 
mir BRAM am einfachsten. Wenn da alle Daten auf einmal gespeichert 
werden können wär es am besten. Einmal alle Daten rein und danach 
auslesen und auf die SD. Leider will eben der BRAM nur wenig Daten 
schreiben. Wenn er die 5000 oder später die 90000 Einträge schreiben 
könnte, wäre es schon perfekt. Leider aber schreibt er nur eine kurze 
Zeit, sodass eben nicht alle Zählerwerte auf dem BRAM sind und davon 
ausgelesen werden können.
>
> Aber:
> Wieso überhaupt SD Karte? Das ist doch lästig die reinstecken,
> speichern, rausziehen, auslesen, ... du könntest die Daten doch auch
> direkt zum PC übertragen. UART schafft diese Datenrate ganz locker.
Es ist die Umsetzung am Board als eigenständige Einheit ohne Computer 
geplant, sodass Daten selbstständig aufgenommen und gespeichert werden 
können. Falls dies aber schwer in der Umsetzung ist, ginge zur Not auch 
UART.
Für die UART Übertragung wäre eine Speicherung in einen FIFO die erste 
Wahl um sie dann seriell an den Computer schicken zu können oder?

von Gustl B. (-gb-)


Lesenswert?

Geza E. schrieb:
> Da scheint mir BRAM am einfachsten.

Weiß ich nicht. Ich glaube ein FIFO wäre besser geeignet. Die gibt es 
auch mit AXI Anschluss.

Geza E. schrieb:
> Für die UART Übertragung wäre eine Speicherung in einen FIFO die erste
> Wahl um sie dann seriell an den Computer schicken zu können oder?

Muss nicht sein. Man kann das auch ohne FIFO über UART streamen. Man 
muss die Daten eben schnell genug rausschicken. Also schneller als sie 
ankommen.

von Geza E. (geza)


Lesenswert?

Gustl B. schrieb:
>
> Weiß ich nicht. Ich glaube ein FIFO wäre besser geeignet. Die gibt es
> auch mit AXI Anschluss.
Ich wollte mir eben das wiederholte auslesen sparen und alles nach dem 
schreiben auf einmal auslesen (ca 1MB wird es werden). Scheinbar liest 
aber der PS schneller als der PL schreibt, deswegen kommen nicht mehr 
Einträge zusammen. Aber irgendwie kann ich das nicht ändern. Hab 
versucht den Prozessor zu beschäftigen vorm lesen und auch zweimal 
auszulesen. Ändert auch nicht so viel. Kann es sein, dass der FPGA über 
JTAG erst gestartet wird, wenn der Prozessor läuft?

> Geza E. schrieb:
>> Für die UART Übertragung wäre eine Speicherung in einen FIFO die erste
>> Wahl um sie dann seriell an den Computer schicken zu können oder?
> Muss nicht sein. Man kann das auch ohne FIFO über UART streamen. Man
> muss die Daten eben schnell genug rausschicken. Also schneller als sie
> ankommen.
Das geschieht dann über die UART IP? Habe noch nie mit UART gearbeitet 
leider

von Gustl B. (-gb-)


Lesenswert?

Geza E. schrieb:
> Ich wollte mir eben das wiederholte auslesen sparen und alles nach dem
> schreiben auf einmal auslesen (ca 1MB wird es werden).

Naja ein FIFO hat ein Flag. Das besagt ob Daten in ihm vorhanden sind. 
Man reagiert also auf dieses Flag und liest immer so lange bis der leer 
ist. Dann wartet man bis wieder Daten drinnen sind und liest dann 
wieder.

Geza E. schrieb:
> Das geschieht dann über die UART IP?

Kann man machen. Aber ein UART ist auch einfach selber geschrieben. Man 
kann einen UART auch wunderbar an einen FIFO anschließen. Immer wenn im 
FIFO Daten vorhanden sind holt sich der UART diese und schickt die raus.

von Duke Scarring (Gast)


Lesenswert?

Geza E. schrieb:
> Ich wollte mir eben das wiederholte auslesen sparen und alles nach dem
> schreiben auf einmal auslesen (ca 1MB wird es werden). Scheinbar liest
> aber der PS schneller als der PL schreibt, deswegen kommen nicht mehr
> Einträge zusammen. Aber irgendwie kann ich das nicht ändern.
Na irgendwie kannst und mußt Du das schon ändern!
Als erstes überlegst Du Dir, wie lange es dauert, bis die gewünschte 
Datenmenge zusammen kommt. Als nächstes baust Du Kontrollmechanismen 
ein: Das Prozessorsystem erlaubt das Datensammeln und stoppt es auch 
wieder. Außerdem kommt ein Zähler rein, damit Du weißt, wie viele Daten 
schon gültig sind.


> Hab
> versucht den Prozessor zu beschäftigen vorm lesen und auch zweimal
> auszulesen.
Das klingt nach Murks.

> Kann es sein, dass der FPGA über
> JTAG erst gestartet wird, wenn der Prozessor läuft?
Du solltest nochmal einen Schritt zurückgehen und ein paar 
Grundlagentutorials zum Zynq durchackern.

Duke

von Geza E. (geza)


Lesenswert?

Duke Scarring schrieb:
> Na irgendwie kannst und mußt Du das schon ändern!
> Als erstes überlegst Du Dir, wie lange es dauert, bis die gewünschte
> Datenmenge zusammen kommt. Als nächstes baust Du Kontrollmechanismen
> ein: Das Prozessorsystem erlaubt das Datensammeln und stoppt es auch
> wieder. Außerdem kommt ein Zähler rein, damit Du weißt, wie viele Daten
> schon gültig sind.
In dem Fall habe ich die Zählerdaten vom FPGA abbrechen lassen. Also 
kenne ich den Endpunkt der Daten und wieviele gültig sind. Kann ich die 
dann danach als ganzes vom PS auslesen? Bzw meine eigentliche Frage: 
Muss ich dem FPGA ein Startsignal geben, damit der VHDL Code 
abgearbeitet wird? Beim Boot über SD passiert das ja.

>> Kann es sein, dass der FPGA über
>> JTAG erst gestartet wird, wenn der Prozessor läuft?
> Du solltest nochmal einen Schritt zurückgehen und ein paar
> Grundlagentutorials zum Zynq durchackern.

Ich bin natürlich noch ein Einsteiger, aber diese Frage ist mir noch 
nicht untergekommen? Um es genauer auszudrücken. Lauft der PL Code 
sobald ich den FPGA über SDK programmiere? Mir scheint so als würde dies 
nicht passieren...

Danke für die Hilfe.
Geza

von Duke Scarring (Gast)


Lesenswert?

Geza E. schrieb:
> In dem Fall habe ich die Zählerdaten vom FPGA abbrechen lassen. Also
> kenne ich den Endpunkt der Daten und wieviele gültig sind.
Gut.

> Kann ich die
> dann danach als ganzes vom PS auslesen?
Wenn die wirklich alle in den BRAM passen, warum nicht.

> Muss ich dem FPGA ein Startsignal geben, damit der VHDL Code
> abgearbeitet wird?
Ein FPGA - hier die PL - wird konfiguriert und rennt dann sofort los.
Es schadet natürlich nicht hier noch ein Signal einzubauen, um die 
Zähler rückzusetzen und die Datenaufzeichnung zu starten.

> Lauft der PL Code
> sobald ich den FPGA über SDK programmiere? Mir scheint so als würde dies
> nicht passieren...
Es gibt mehrere Möglichkeiten den PL-Teil zu konfigurieren:
- via JTAG
- via FSBL
- via uboot
- via Linux

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.