Forum: FPGA, VHDL & Co. berechnetes Shift in VHDL


von Erhard M. (erhard_m)


Lesenswert?

Ich möchte in VHDL (XILINX, Webpack) ein berechnetes Shift mit 
STD_LOGIC_VECTOR durchführen und erhalte immer diverse Fehlermeldungen.
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
use IEEE.NUMERIC_STD.ALL;
6
7
entity sllTest is
8
    Port ( reset_L : in  STD_LOGIC;
9
           clk : in  STD_LOGIC;
10
           arg1 : in  STD_LOGIC_VECTOR (3 downto 0);
11
           arg2 : in  STD_LOGIC_VECTOR (9 downto 0);
12
           output : out  STD_LOGIC_VECTOR (13 downto 0));
13
end sllTest;
14
15
architecture Behavioral of sllTest is
16
17
begin
18
19
shift: process(reset_L,clk)
20
begin
21
if reset_L = '0' then output <= (others => '0');
22
elsif rising_edge(clk) then
23
  output <= STD_LOGIC_VECTOR(unsigned(arg2) sll  to_integer(unsigned(arg1)));
24
  end if;
25
end process;
Fehlermeldung: type conversion expression type cannot be determined 
uniquely

Andere Schreibweisen der Zeit mit “sll” mit verschiedenen Type-Casts 
erzeugen andere Fehlermeldungen.

Wie muss die Befehlszeile mit „sll“ korrekt lauten? Danke

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


Lesenswert?

Erhard M. schrieb:
> Fehlermeldung: type conversion expression type cannot be determined
> uniquely
Das kommt davon:
> use IEEE.STD_LOGIC_ARITH.ALL;
> use IEEE.STD_LOGIC_UNSIGNED.ALL;
> use IEEE.NUMERIC_STD.ALL;
Du hast durch die beiden Artihmetikpackages doppelte Typ- und 
Umwandlungsdefinitionen. Der Synopsys Simulator von 
https://www.edaplayground.com sagt das dann auch recht klar:
1
    output <= STD_LOGIC_VECTOR(unsigned(arg2) sll to_integer(unsigned(arg1)...
2
                                                             ^
3
  Identifier 'UNSIGNED' is not visible because it is ambiguous. Contending 
4
  identifiers:
5
     NUMERIC_STD:UNSIGNED
6
     STD_LOGIC_ARITH:UNSIGNED
7
  The conflicting identifiers were introduced by USE clauses. See section 10.4
8
  of the VHDL LRM for further details.
Fazit: niemals beide Packages gleichzeitig einbinden. Nimm die 
numeric_std. Die kann alles, was du brauchst:
http://www.lothar-miller.de/s9y/categories/16-Numeric_Std

> Wie muss die Befehlszeile mit „sll“ korrekt lauten?
Nimm die numeric_std und shift_left(). Etwa so:
1
output <= STD_LOGIC_VECTOR(shift_left(unsigned(arg2),to_integer(unsigned(arg1)));

BTW: die [vhdl]-Tags formatieren den Quelltext hübsch. Siehe 
"Formatierung" über jeder Eingabebox gleich unter "Antwort schreiben - 
Wichtige Regeln - erst lesen, dann posten!"...

: Bearbeitet durch Moderator
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.