Barrel-Shifter: the following signal(s) form a combinatorial loop

Gast #2476766
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.
Gast #2476788
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.
#2476962
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.
Moderator (Firma: Titel) Persönliche Seite #2478120
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren