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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Erhard M. (erhard_m)


Bewertung
0 lesenswert
nicht 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. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.