Forum: FPGA, VHDL & Co. Unterschied zwischen übergabe nach Name und Übergabe nach Position


von Jele D. (jele_d)


Angehängte Dateien:

Lesenswert?

Entwerfen Sie nun ein komplettes VHDL-Programm in „Struktureller 
Beschreibungsweise“, das als Ergebnis die Parität des 4-BIT-Vektors A 
anzeigt!
Bei einer geraden Anzahl von “1‘en“ im 4-Bit Vektor A soll der Ausgang 
GERADE ein “1“- Signal aufweisen, ansonsten ein “0“-Signal. Bei einer 
ungeraden Anzahl von “1‘en“ im 4-Bit Vektor A soll der Ausgang UNGERADE 
ein “1“-Signal aufweisen, ansonsten ein “0“-Signal .

. ich kann den Unterschied zwischen die Übergabe nach Name und nach 
Position im Portmap nicht . siehe Bild

von VHDL-Notfallhilfe (Gast)


Lesenswert?

Keine Ahnung.

Gfs meint dein Aufgabenstelle, Funktionen definieren, in einem package 
ablegen und dann einmal als Variablen übergeben und einmal als Vektor. 
Ehrlich gesagt habe ich sowas in 20 Jahren Entwicklung nicht gebraucht.

Portmapping mache ich immer explizit und zwar deshalb, damit Kollegen 
direkt sehen, was passiert und es nutzen können. Dein Aufgabensteller 
hat den falschen Fokus und weis nicht, was in der Industrie abgeht.

Ich kenne aber solche Leute:

Die trainieren ihre Studis auf möglichst komplizierten Sch....s, die 
suhlen sich dann in ihren Konstrukten und produzieren einen Haufen 
formellen Quark, der aber inhaltsbefreit ist. Wichtiger wäre es, die 
richtige Schaltungstechnik und den jeweils richtigen mathematischen 
Ansatz zu haben.

Der fehlt diesen Leuten aber meistens!

Drucke meinen Beitrag aus und lege ihn dem Prof auf ins Fach!

von FPGA Notfallseelsorge (Gast)


Lesenswert?

Dem kann ich mich nur anschließen.

von Lerninstructor (Gast)


Lesenswert?

Jele D. schrieb:
> Entwerfen Sie nun ein komplettes VHDL-Programm in „Struktureller
                                   ^^^^^^^^^^^^^ das ist der Fehler
Ansonsten:
1
--named.
2
k1 : gewurschtel port map(
3
  Bit_1 => A(0),
4
  Bit_2 => A(1),
5
  even  => open,
6
  odd   => s_K1toK2);
7
8
--positional:
9
k2 : gewurschtel port map(s_K1toK2, A(2), open, s_K2toK3);

Natürlich fehlt da im VHDL-Model einiges (signal, component declaration) 
und Fehlerfreiheit wird nicht garantiert, aber der Unterschied zwischen 
named und positional assignment dürfte klar werden.

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


Lesenswert?

Jele D. schrieb:
> ich kann den Unterschied zwischen die Übergabe nach Name und nach
> Position im Portmap nicht .
Diesem Satz fehlt doch was?

Wenn allein die Sache mit der Portliste "by name" und "by order" (aka 
"by position") dein Problem ist, dann mein Vorschlag: löse die Aufgabe 
einfach mal so, wie es dir gefällt. Zeig dann, was du hast, und dann 
bauen wir diese Parameterübergabe-Geschichten mit ein. Das kann man 
nämlich problemlos in 1 Minute auch hinterher noch ändern.

von Jele D. (jele_d)


Lesenswert?

ibrary IEEE;
use IEEE.std_logic_1164.all;
entity 4-BIT_VEKTOR is
port (
A: in std_logic_vector (3 downto 0 )  ;
GERADE , UNGERADE: out std_logic

);
end entity 4-BIT_VEKTOR ;

architecture VERHALTEN of 4-BIT_VEKTOR is
signal C : std_logic_vector (1 downto 0 );
component 2_BIT_VEKTOR is
port (
BIT_1,BIT_2 : in std_logic ;
EVEN,ODD  :out std_logic );
end component ZWEI_BIT_PARITY ;
begin
K1:        ZWEI_BIT_PARITY  portmap ( A(0),A(1) , C(0) , ODD   ) ;
K2:        ZWEI_BIT_PARITY  portmap ( C(0), A(2), C(1), ODD  ) ;
K3:        ZWEI_BIT_PARITY  portmap ( C(1), A(3), GERADE, UNGERADE  ) ;

von FPGA NOTFALLSEELSORGE (Gast)


Lesenswert?

Dann wäre es jetzt an der Zeit das einem Simulator wie Modelsim 
vorzuwerfen. Der meldet dir dann auch wunderhybsch alle Fehler.

von Lerninstructor (Gast)


Lesenswert?

Grob gereinigt und in tags:
1
library IEEE;
2
use IEEE.std_logic_1164.all;
3
4
entity 4_BIT_VEKTOR is
5
  port (
6
    A                : in  std_logic_vector (3 downto 0);
7
    GERADE, UNGERADE : out std_logic);
8
end entity;
9
10
architecture VERHALTEN of 4_BIT_VEKTOR is
11
  signal C : std_logic_vector (1 downto 0);
12
  component 2_BIT_PARITY is
13
    port (
14
      BIT_1, BIT_2 : in  std_logic;
15
      EVEN, ODD    : out std_logic);
16
  end component;
17
18
begin
19
20
  K1 : ZWEI_BIT_PARITY portmap (A(0), A(1), C(0), ODD);
21
  K2 : ZWEI_BIT_PARITY portmap (C(0), A(2), C(1), ODD);
22
  K3 : ZWEI_BIT_PARITY portmap (C(1), A(3), GERADE, UNGERADE);
23
24
end architecture;

von FPGA NOTFALLSEELSORGE (Gast)


Lesenswert?

4_BIT_VEKTOR, 2_BIT_PARITY : Zahl am Anfang ist iirc verboten
portmap : braucht ein Leerzeichen.

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


Lesenswert?

Das ist aber nicht das Problem hier, das motzt der Syntaxcheck dann 
sowieso an.

Zur eigentlichen Frage:

Das hier ist "by position":

K3 : ZWEI_BIT_PARITY portmap (C(1), A(3), GERADE, UNGERADE);

Dabei kommt es auf die Reihenfolge an. Die Zuordnung erfolgt implizit 
entsprechend der Signaldefinition in der Portliste.


Und das hier "by name":

K3 : ZWEI_BIT_PARITY portmap ( EVEN=>GERADE, ODD=>UNGERADE, BIT_1=>C(1), 
BIT_1=>A(3));

Hier ist die Reihenfolge egal, weil jede Zuordnung explizit erfolgt.

: Bearbeitet durch Moderator
von Jele D. (jele_d)


Lesenswert?

danke sehr

von FPGA Notfallseelsorge (Gast)


Lesenswert?

Lerninstructor schrieb:
>> Entwerfen Sie nun ein komplettes VHDL-Programm in „Struktureller
>                                    ^^^^^^^^^^^^^ das ist der Fehler

Falls wieder die alte theoretische Leier von wegen "Programm" gemeint 
ist:

a) Texte für die Steuerung von Software (hier die Synthese-SW und den 
Simulator) sind IMMMER Programme, da "programma" = wörtlich "die 
Vorschrift" im Sinne von Beschreibung, Publikation, Bekundigung, 
Ankündigung, später auch Tagesordnung.

b) Die Einengung auf "Ablauf" im Allgemeinen und "Softwareablauf" im 
Besonderen ist ebenfalls falsch. Auch bei C++ sprechen wir vom Programm, 
obwohl dort keine Abläufe, sondern Strukturen beschrieben werden.

Auch das TCL, die UCF, DDXc und alles, was an Beschreibungen der 
Synthesesoftware zugeführt wird, sind "Pro Gramm(e)".

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


Lesenswert?

FPGA Notfallseelsorge schrieb im Beitrag #7136970:
> a).....
und
> b).....
Muss man halt einfach so als Postulat hinnehmen.

Ich sag meinen Praktikanten immer: "mach mal eine VHDL-Beschreibung 
davon", er kapiert dann, was ich meine und programmiert frohgemut 
drauflos und zeigt mir stolz sein Programm, wenn ich frage "wie weit 
bist du mit der Beschreibung?"

Auf diese Art sind wir beide zufrieden.

von vancouver (Gast)


Lesenswert?

FPGA Notfallseelsorge schrieb im Beitrag #7136970:
> Auch bei C++ sprechen wir vom Programm,
> obwohl dort keine Abläufe, sondern Strukturen beschrieben werden.

wobei zu beachten ist, dass...

1. ...ein C++-Programm, dass nur aus Strukturen besteht, vermutlich 
recht wenig tun wird, und

2. ... ein C++-Programm in eine Folge von Maschinenbefehlen übersetzt 
wird, die irgendeine arme CPU sequenziell ausführen muss, während eine 
VHDL-Beschreibung bis zum bitteren Ende eine Struktur bleibt, die zu 
keinem Zeitpunkt von irgendjemandem ausgeführt wird.


@TO:
Vielleicht hast du mal Python gelernt, dort gibt es so etwas ebenfalls. 
Du kannst die Funktion

def F(a, b,c)
  ...


aufrufen mit

F(1,4,7)

oder mit

F(a=1, b=3, c=7)

von FPGA NOTFALLSEELSORGE (Gast)


Lesenswert?

Ich war inkonsequent in der Vergangenheit, aber hier im Thread sind
FPGA NOTFALLSEELSORGE
und
FPGA Notfallseelsorge
unterschiedliche Personen. Bis sich die kleingeschriebe auch groß 
schreibt.

Aber egal ... das mit Programm oder nicht ist schon ein Punkt. Ein 
weiterer wäre

Lothar M. schrieb:
> Parameterübergabe-Geschichten

Und das Wort "Übergabe" steht auch im Aufgabentext des TO.

Und es passt eben nicht. Generics oder Parameter in Verilog werden 
übergeben und sind zur Synthesezeit fest.
Ports werden hingegen nicht übergeben sondern verbunden. Wie Leitungen. 
Verdrahtet.

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


Lesenswert?

FPGA NOTFALLSEELSORGE schrieb im Beitrag #7137040:
> "Übergabe".... passt eben nicht
Ja stimmt, da hat mich ein false friend übel aufs Glatteis geführt.

> Verdrahtet.
Oder eben in der port map "zugeordnet" bzw. "abgebildet".

https://dict.leo.org/englisch-deutsch/to%20map

https://dict.leo.org/englisch-deutsch/map

von Lerninstructor (Gast)


Lesenswert?

FPGA NOTFALLSEELSORGE schrieb im Beitrag #7137040:

> Ports werden hingegen nicht übergeben sondern verbunden. Wie Leitungen.
> Verdrahtet.

Eben, deshalb ist die Frage nach einem Unterschied in der Wirkung der 
Beschreibungsvarianten hier reichlich Sinnfrei.

In einer Programmiersprachen gibt es messbare Unterschiede ob nun ein 
Unter-Programm per reference oder par value angesteuert wird. Oder 
registered, oder aligned im memspace. Oder per stack. oder ... Aber hier 
ist es eben eine Komponente und kein UnterProgramm und damit gibt es 
diese unterschiedlich wirksamen Interface resp. "Calling conventions" 
nicht.

Es mag Unterschied bei neueren VHDL-Varianten (VHDL-2008) geben, die 
bspw. Negation in der Port map erlauben. Aber hier stiftet die Frage 
nach "Unterschied" reichlich Verwirrung, statt sie das Verständniss 
fördert.

PS:
Hilfreich swären hier IMHO auch Tipps für eine richtige Formatierung, 
style guide, mit der man dem positional mapping seinen Schrecke nimmt, 
bspw:
1
library IEEE;
2
use     IEEE.std_logic_1164.all;
3
4
library work;  --lib with component architecture declarazion
5
use     work.all;
6
7
entity E_4_BIT_VEKTOR is
8
  port (
9
    A_i                  : in  std_logic_vector (3 downto 0);
10
    GERADE_o, UNGERADE_o : out std_logic);
11
end entity;
12
13
architecture VERHALTEN of E_4_BIT_VEKTOR is
14
  --for wiring components
15
  signal s_parinet : std_logic_vector (1 downto 0);
16
17
  --component e_pari_2b calcs parity from two bits fan-in
18
  --output even_o is '1' wenn both inputs got same      value ("00" or "11") otherwise '0'
19
  --output odd_o  is '1' wenn both inputs got different value ("01" or "10") otherwise '0'
20
  component e_pari_2b is
21
    port (
22
      BIT_1_i, BIT_2_i : in  std_logic;
23
      EVEN_o, ODD_o    : out std_logic);
24
  end component;
25
26
begin
27
--                               op1         | op2   | res_even|   res_odd
28
  I_PARI_01 : e_pari_2b portmap (A_i(0),       A_i(1), open,       s_parinet(0));
29
  I_PARI_02 : e_pari_2b portmap (s_parinet(0), A_i(2), open,       s_parinet(1));
30
  I_PARI_03 : e_pari_2b portmap (s_parinet(1), A_i(3), GERADE_o,   UNGERADE_o);
31
32
end architecture;
33
34
--bei einer Beschreibungs- resp Spezifikationssprache ist es eben wichtitig das es verständlich beschrieben ist.

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.