Forum: FPGA, VHDL & Co. Delay mit Xilinx IP/FIFO einstellbar?


von Gustl B. (-gb-)


Lesenswert?

Hallo,
ich brauche für einen Pretriggerspeicher einfach nur einen Speicher der 
ein Signal verzögert um n Takte. Also auf der einen Seite wird 
geschrieben, auf der anderen gelesen (mit gleichem Takt) und dazwischen 
ist Zeit.

Ich kann das natürlich schnell selber schreiben, habe ich auch getan
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity Delay is
6
    Generic(
7
  Data_Width: integer;
8
  Data_Depth: integer);
9
    Port(
10
  clk: in std_logic;
11
  rw_en: in std_logic;
12
  din: in std_logic_vector(Data_Width-1 downto 0);
13
  dout: out std_logic_vector(Data_Width-1 downto 0));
14
end Delay;
15
16
architecture Behavioral of Delay is
17
18
type Data_arr is array (Data_Depth-1 downto 0) of std_logic_vector(Data_Width-1 downto 0);
19
signal Data: Data_arr:=(others => (others => '0'));
20
21
signal rw_address: integer range 0 to Data_Depth-1:=0;
22
23
begin
24
25
process begin
26
  wait until rising_edge(clk);
27
  dout <= Data(rw_address);
28
  if rw_en = '1' then
29
    if rw_address < Data_Depth-1 then
30
      rw_address <= rw_address +1;
31
    else
32
      rw_address <= 0;
33
    end if;
34
    Data(rw_address) <= din;
35
  end if;
36
end process;
37
38
end Behavioral;

aber nur aus Interesse, geht das auch mit einem Xilinx IP oder FIFO? 
Also eigentlich bräuchte ich ja nur einen FIFO der immer einen 
bestimmten Füllstand hat. Also aus dem nur gelesen werden kann wenn der 
einen bestimmten Füllstand hat.
Habt ihr das mal gemacht und geht das?

von Samuel C. (neoexacun)


Lesenswert?

Gustl B. schrieb:
> aber nur aus Interesse, geht das auch mit einem Xilinx IP oder FIFO?

Xilinx hat dafür einen IP-Core mit dem Namen "RAM-Based Shift Register".

von Gustl B. (-gb-)


Lesenswert?

Danke! Ich hatte bei den IPs unter Memory geguckt und da war nix. Hab es 
jetzt gefunden.

von Christoph Z. (christophz)


Lesenswert?

Gustl B. schrieb:
> Also eigentlich bräuchte ich ja nur einen FIFO der immer einen
> bestimmten Füllstand hat. Also aus dem nur gelesen werden kann wenn der
> einen bestimmten Füllstand hat.

Für das gibt es bei FIFOs die programmierbaren Voll/Leer Flags.
Praktisch bei paketbasierten Interfaces. Kommt aber auf deinen Chip 
drauf an, ob du solche zur Verfügung hast.

Bei Xilinx gibt es solche bei UltraScale und UltraScale+, nicht bei der 
7-Series (entsprechend wohl auch nicht bei noch älteren).

Quelle:
PG057 Xilinx FIFO Generator 13.1 (Stichwort prog_full)

von Gustl B. (-gb-)


Lesenswert?

Christoph Z. schrieb:
> Für das gibt es bei FIFOs die programmierbaren Voll/Leer Flags.

Die gibt es auch bei der 7er Serie.

Wie müsste ich die Flag Werte setzen damit immer eine bestimmte Anzahl 
an Daten im FIFO bleibt?
Ich würde den Empty Threshold Assert Value auf den gewünschten Wert 
setzen, dann sollte der FIFO empty melden wenn weniger/gleich viele 
Daten drinnen sind.

von Samuel C. (neoexacun)


Lesenswert?

Man kann das natürlich auch mit einem FIFO-IP machen. Das hat allerdings 
zwei "Nachteile":
- Du solltest dir die Doku dazu sehr genau anschauen. Du musst sicher 
gehen, ob sich das Almost-Empty-Flag gerade auch in Edgecases so 
verhält, wie du es gerne hättest, sonst handelst du dir unter Umständen 
Latenzen oder Jitter ein. (Vllt auch nicht, ist mir ehrlich gesagt zu 
doof, das jetzt für den Fall nachzuschauen).
- Meiner Erfahrung nach funktionieren die Almost-xxx-Flags in den 
Xilinx-FIFO-IPs nicht zuverlässig. Keine Ahnung warum, aber wir hatten 
hier schon mehrfach den Fall, dass die Flags nicht dazu zu bringen waren 
in einem sonst funktionierenden Design irgendetwas zu tun.

Daher die Frage, warum sollte man sich das mit dem FIFO antun, wenn das 
Shiftregister exakt das tut, was man will?

von Christoph Z. (christophz)


Lesenswert?

Gustl B. schrieb:
> Christoph Z. schrieb:
>> Für das gibt es bei FIFOs die programmierbaren Voll/Leer Flags.
>
> Die gibt es auch bei der 7er Serie.

Zitat aus dem user guide:

"prog_full(1)
[...]
Notes:
1.  For 7 series devices using the Built-in FIFO configuration, this 
signal is connected to the almostfull signal of the FIFO18E1/FIFO36E1 
primitive"

Und das almost_full Flag gibt dir nur an, ob du noch genau ein mal 
schreiben darfst.

Gustl B. schrieb:
> Wie müsste ich die Flag Werte setzen damit immer eine bestimmte Anzahl
> an Daten im FIFO bleibt?

Ich würde das programable_full auf den Mindestfüllstand setzen und dann 
zu lesen beginnen wenn es asserted wird. Muss man halt beachten, das 
programable_full zum Schreibinterface und dessen Clock gehört.

von Gustl B. (-gb-)


Lesenswert?

Christoph Z. schrieb:
> Zitat aus dem user guide:
>
> "prog_full(1)
> [...]
> Notes:
> 1.  For 7 series devices using the Built-in FIFO configuration, this
> signal is connected to the almostfull signal of the FIFO18E1/FIFO36E1
> primitive"
>
> Und das almost_full Flag gibt dir nur an, ob du noch genau ein mal
> schreiben darfst.

Seltsam. Der IP sagt dazu nix und erzeugt nur die Ports prog_empty und 
prog_full. Ich finde der FIFO Generator sollte da schon anzeigen, dass 
das was man da macht nicht stimmt.

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Mal noch eine andere Strategie in Raum geworfen. Ich wuerde fuer sowas 
kein Fifo nehmen sondern einen ganz normalen BRAM und dann ein bisschen 
Ringspeicher Logik aussenrum schreiben. Der Abstand zwischen Lese- und 
Schreib Adresse ist dann die gewuenschte Latenz.

Das ist so unfassbar viel einfacher als mit Fifos und den Flags zu 
hantieren. Ausserdem kann die Latenz zur Laufzeit noch eingestellt 
werden.

Und idealerweise machst du das ohne den BRAM zu instanzieren, sondern in 
reinem VHDL. Dann ist das sogar noch einigermassen portierbar.

: Bearbeitet durch User
von Samuel C. (neoexacun)


Lesenswert?

Das ist exakt das, was der Shiftregister-IP macht. Halt eben nur für 
Xilinx.

von Gustl B. (-gb-)


Lesenswert?

Tobias B. schrieb:
> Mal noch eine andere Strategie in Raum geworfen.

Samuel C. schrieb:
> Das ist exakt das, was der Shiftregister-IP macht. Halt eben nur für
> Xilinx.

Nun, das ist doch grob das was ich im ersten Post schon geschrieben 
hatte. Nur da eben mit fester Länge.
Klar kann ich mir das bauen, aber mir ging es hier drum ob es das auch 
in fertig gibt. Und das gibt es offensichtlich.

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.