mikrocontroller.net

Forum: FPGA, VHDL & Co. ist es eine extension?


Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mir ist beim Probieren aufgefallen, dass unter den VHDL Codeschnipsel
angegebener Code für Veroderung nicht in ghdl funktioniert.

http://www.mikrocontroller.net/articles/VHDL_Schni...
architecture test of test is
    signal ored, anded: bit;
    signal vec: bit_vector(3 downto 0);
begin
    anded <= '1' when vec = (others => '1') else '0';
    ored <= '0' when vec = (others => '0') else '1';
end;

$ ghdl -a --std=02 main.vhd
'others' choice not allowed for an aggregate in this context
'others' choice not allowed for an aggregate in this context

$ ghdl -a --std=93 main.vhd
'others' choice not allowed for an aggregate in this context
'others' choice not allowed for an aggregate in this context

$ ghdl -a --std=87 main.vhd
'others' choice not allowed for an aggregate in this context
'others' choice not allowed for an aggregate in this context

im Moment kann ich nicht mit XST und Quartus testen
aber wenn es auf der Seite steht, denke ich dass es sich um
eine Extension handelt.

Im Grunde möchte ghdl sagen, dass ein Konstrukt (others => '0')
die Bitbreite nicht ermitteln kann/darf. Eigentlich kommt ja
nur die Bitbreite vom anderen Parameter der "=" Funktion.
Weiss jemand wie es im Standard steht?

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
XST beschwert sich auch:
40:    anded <= '1' when vec = (others => '1') else '0';
41:    ored <= '0' when vec = (others => '0') else '1';
=========================================================================
*                          HDL Compilation                              *
=========================================================================
Compiling vhdl file "test.vhd" in Library work.
Entity <test> compiled.
ERROR:HDLParsers:3236 - "test.vhd" Line 40. Can not determine the "others" values in aggregate. (LRM 7.3.2.2)
ERROR:HDLParsers:3304 - "test.vhd" Line 40. Can not determine the "others" values in aggregate. (LRM 7.3.2)
ERROR:HDLParsers:3236 - "test.vhd" Line 41. Can not determine the "others" values in aggregate. (LRM 7.3.2.2)
ERROR:HDLParsers:3304 - "test.vhd" Line 41. Can not determine the "others" values in aggregate. (LRM 7.3.2)
--> 

Duke

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
XST liefert ja sogar direkt das Kapitel im LRM (Language Reference 
Manual). Wenn Du da in Kapitel 7.3.2.2 schaust, wirst Du unter h) finden 
others nur in qualified expressions erlaubt ist. In 7.3.4 steht dann was 
eine qualified expression ist. Nämlich eine Angabe mit Typ. Ich kann es 
gerade nicht testen, aber
 anded <= '1' when vec = std_logic_vector'(others => '1') else '0';
 ored <= '0' when vec = std_logic_vector'(others => '0') else '1';

sollte demnach funktionieren. Lass mal wissen ob das so funktioniert 
hat!

Ach ja: das LRM findest Du online unter 
http://rti.etf.bg.ac.yu/rti/ri5rvl/tutorial/TUTORI...

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Mathi:
Deine Variante ändert leider nichts an der Fehlermeldung.
Aber Danke füe den Link zum LRM.

@all:
Diese Variante geht:
entity test is
    Port ( vec : in  bit_vector (3 downto 0);
           anded : out bit;
           ored : out bit);
end test;


architecture test of test is
  constant zero_vec : bit_vector( vec'range) := (others => '0');
  constant ones_vec : bit_vector( vec'range) := (others => '1');
begin

    anded <= '1' when vec = ones_vec else '0';
   ored <= '0' when vec = zero_vec else '1';
end;

Duke

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Duke Scarring wrote:
> architecture test of test is
>   constant zero_vec : bit_vector( vec'range) := (others => '0');
>   constant ones_vec : bit_vector( vec'range) := (others => '1');
> begin

Nicht der Typ ist das Problem, sondern der Bereich, der sich nicht aus 
dem Kontext ergibt. Es geht daher auch einfacher:
architecture test of test is
    signal ored, anded: bit;
    signal vec: bit_vector(3 downto 0);
begin
    anded <= '1' when vec = (vec'range => '1') else '0';
    ored  <= '0' when vec = (vec'range => '0') else '1';
end;

Gruß
Marcus
http://www.doulos.com/

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Nicht der Typ ist das Problem, sondern der Bereich, der sich nicht aus
>dem Kontext ergibt.

wow, danke
es geht auch mit ghdl

kann vielleicht jemand den Artikel korrigieren?!

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.