Forum: FPGA, VHDL & Co. Barrel-Shifter: the following signal(s) form a combinatorial loop


von Jan S. (Gast)


Lesenswert?

Hallo,

inn der Entity sind folgende Ports deklariert:
1
port(
2
  X: in std_logic_vector(15 downto 0);
3
  n: in std_logic_vector(3 downto 0);
4
  Y: out std_logic_vector(15 downto 0)
5
);

Bei folgender Anweisung
1
Y <= STD_LOGIC_VECTOR(SHIFT_RIGHT(SIGNED(X), TO_INTEGER(UNSIGNED(n))));

bekomme ich diese Fehlermeldung:
1
the following signal(s) form a combinatorial loop: Y_shift0001<3>

Eingebunden sind IEEE.STD_LOGIC_1164.ALL und IEEE.NUMERIC_STD.ALL.

Wenn ich statt SIGNED(X) UNSIGNED(X) verwende oder die Anzahl 
verschiebender Bits n statisch setze, tritt das Problem nicht auf.

Ich benötige aber einen SIGNED(X). Als Lösung fällt mir nur ein 
Multiplexer ein, der ausgehend vom Wert Bits n den SHIFT_RIGHT() mit 
konstantem Verschiebeoperator aufruft.

Ist jemandem das Problem oder eine Lösung bekannt?


Grüße Jan.

von Jan S. (Gast)


Lesenswert?

Achso:

Ich verwende das Xilinx Webpack Version 13.1

von Jan S. (Gast)


Lesenswert?

Noch etwas:

Wenn ich im Port n vom Typ Integer waehle, dann kommt auch keine 
Kombinatorische Schleife.

Nun bin ich vollständig verwirrt.
1
Y <= STD_LOGIC_VECTOR(SHIFT_RIGHT(SIGNED(X), n));  -- geht, wenn n vom Typ Integer

Ich kann bzw. möchte aber als Port für n keinen Integer verwenden.

von Jan S. (Gast)


Lesenswert?

Vergesst den letzten Post - das gleiche Problem =)

von Manuel W. (other)


Lesenswert?

Hey,

eventuell folgendermaßen lösen:
1
  function Shr(Op, Bits: std_logic_vector) return std_logic_vector is
2
    constant MaxBitsValue: Integer := 2**Bits'Length - 1;
3
    variable Result: std_logic_vector(Op'Range);
4
    variable BitsInt: Integer Range 0 to MaxBitsValue;
5
  begin  
6
    Result  := (others => '0');
7
    BitsInt := TO_INTEGER(UNSIGNED(Bits));
8
    for i in 0 to MaxBitsValue loop
9
      if (i = BitsInt) then
10
        Result := STD_LOGIC_VECTOR(SHIFT_RIGHT(SIGNED(Op), i));
11
      end if;
12
    end loop;
13
    return Result;
14
  end Shr;

Ob das synthetisierbar ist, habe ich nicht probiert. Zumindest ergibt es 
keine kombinatorische Schleife :-).


Grüße Manuel.

von Basti Sch. (Gast)


Lesenswert?

Bist du sicher das dein SHIFT_RIGTH() einen Integer verkraftet, der erst 
zur laufzeit feststeht?

von Manuel W. (other)


Lesenswert?

Hey,

meinst du mich?

Grüße Manuel.

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


Lesenswert?

Basti Sch. schrieb:
> Bist du sicher das dein SHIFT_RIGTH() einen Integer verkraftet, der erst
> zur laufzeit feststeht?
Naja, daraus wird ein ordinärer Multiplexer, also keine 
Raketentechnik...

Jan S. schrieb:
> - das gleiche Problem =)
Zeig mal den Rest des Codes. In der geposteten Zeile ist keinerlei 
kominatorische Schleife zu sehen:
http://www.lothar-miller.de/s9y/categories/36-Kombinatorische-Schleife
Ich vermute auch hier irgendwas mit der 2-Prozess-Schreibweise...

von Jan S. (Gast)


Lesenswert?

Hallo Lothar,

Lothar Miller schrieb:
> Zeig mal den Rest des Codes. In der geposteten Zeile ist keinerlei
> kominatorische Schleife zu sehen:
> http://www.lothar-miller.de/s9y/categories/36-Komb...
> Ich vermute auch hier irgendwas mit der 2-Prozess-Schreibweise...

Das wars. War eine versteckte kombinatorische Schleife.


Jan.

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.