Featured image of post Minimaler Skidbuffer mit AXI-like Handshaking

Minimaler Skidbuffer mit AXI-like Handshaking

Ein kompakter Skidbuffer, der nur das `ready`-Signal entkoppelt – ohne zusätzliche Latenz.

In weniger als einer Stunde entstanden:
Ein kompakter Skidbuffer, der nur das ready-Signal entkoppelt – ohne zusätzliche Latenz.

Hintergrund ist hier die Verwendung von AXI-like Handshaking und die Notwendigkeit, das ready-Signal zu entkoppeln, um die Datenverarbeitung zu optimieren. In den von mir genutzten Desisngs ist das ready-Signal oft der Flaschenhals, da es in der Regel durch mehrere Pipelines hindurch propagiert werden muss. Ein Skidbuffer kann hier helfen, die Latenz zu reduzieren und die Datenverarbeitung zu optimieren. Dagegen wird das valid-Signal nicht entkoppelt, da es durch jede Pipeline selbst entkoppelt wird.

Das Design nutzt ein einfaches Prinzip:

  • Wenn ready = '1', wird direkt durchgeschaltet (MUX = 0)
  • Wenn ready = '0', wird ein Zwischenspeicher aktiviert (MUX = 1)
  • valid bleibt entweder durchgeschliffen oder stammt aus dem Puffer

Das System erfüllt vollständiges AXI-like Handshaking
und wurde bei zufällig verzögertem Up- und Downstream erfolgreich getestet.

Ressourcenbedarf (nach Synthese, Xilinx Spartan-3):

  • 1 Flipflop
  • 4 LUTs
  • 0 zusätzliche Latenz

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
--@ Set mux to buffered mode if data is available in the buffer.
C_MUX    <= R_IsBuffered;
--@ Enable the buffer register if not buffered and chip enable is high.
C_Enable <= I_CE and not R_IsBuffered;
--@ Set the ready signal to high if not buffered.
O_Ready  <= not R_IsBuffered;
--@ Set the valid signal to high if data is available in the buffer or if data is valid.
O_Valid  <= R_IsBuffered or I_Valid;

process (I_CLK)
begin
    if rising_edge(I_CLK) then
        if I_RST = G_ResetActiveAt then
            R_IsBuffered <= '0';
        elsif I_CE = '1' then
            if R_IsBuffered = '0' and I_Valid = '1' then
                R_IsBuffered <= '1';
            elsif I_Ready = '1' and (R_IsBuffered or I_Valid) = '1' then
                R_IsBuffered <= '0';
            end if;
        end if;
    end if;
end process;

Skidbuffer Blockdiagramm


Die Architektur eignet sich besonders für tiefe Pipeline-Systeme mit Timing-Engpässen auf ready.

Kein Overhead – nur Datenfluss.

Erstellt mit Hugo
Theme Stack gestaltet von Jimmy