Forum: FPGA, VHDL & Co. korrekte Signal Zuweisung in Vhdl


von New C. (wunderlampe)


Lesenswert?

1
entity e1 is
2
  port (
3
    i1 : in std_logic; 
4
    i2 : in std_logic; 
5
    o1 : out std_logic
6
  );
7
end entity; 
8
9
architecture of e1 is
10
  signal o1_Reg : std_logic;
11
  
12
begin
13
  o1 <= o1_Reg;
14
15
  process (clk, rst) is 
16
  begin
17
    if rising_edge(i1) then
18
      if i1 = '1' then
19
    o1_Reg           <= '1';
20
      end if;
21
    end if;
22
  end process;
23
end architecture;
was ist der korrekte Signalzuweisung?
wie in obige Beispiel über ein interne signal oder
darf ich ohne o1_Reg
direkt
1
o1 <= '1';
schreiben

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


Lesenswert?

Beides ist "korrekt".

Du kannst den Ausgang o1 aber eben nicht mehr irgendwo anders lesend 
verarbeiten. Dafür müsste der ein buffer oder ein inout sein. Und diese 
beiden für zu schreibfaulen Lesen von Ausgängen zu verwenden, das ist 
schlechter Stil.

von New C. (wunderlampe)


Lesenswert?

lkmiller, Herzlichen Dank

von Blechbieger (Gast)


Lesenswert?

Lothar M. schrieb:
> Du kannst den Ausgang o1 aber eben nicht mehr irgendwo anders lesend
> verarbeiten.

Seit VHDL-2008 geht das.

VHDL-2008 hat generell viele schöne Verbesserungen und mittlerweile ist 
die Unterstützung in den Tools dafür gut genug um es immer zu nutzen.

von Dussel (Gast)


Lesenswert?

New C. schrieb:
1
15 process (clk, rst) is
2
16  begin
3
17    if rising_edge(i1) then
4
18      if i1 = '1' then
5
19    o1_Reg           <= '1';
6
20      end if;
7
21    end if;
8
22  end process;
Unabhängig von der Zuweisung ist das aber auch nicht ganz sinnvoll. 
Erstens ist i1 nach einer rising_edge 1, zweitens müssten in clk und i1 
im gleichen Deltazyklus eine Flanke haben, damit das ausgewertet wird 
(geht das eigentlich?) und drittens ist clk und rst gar nicht definiert.
Ich nehme an, das ist nur ein Flüchtigkeitsfehler beim Erstellen dieses 
kurzen Beispiels, aber auf sowas sollte man achten.

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


Lesenswert?

Dussel schrieb:
> drittens ist clk und rst gar nicht definiert.
Es ist eigentlich andersrum: die Sensitivliste ist falsch. Dort muss 
passend zum Code i1 rein.
Viele Anfänger meinen, dass man mit der Sensitivliste irgend etwas 
"steuern" könnte. Dabei ist es schlicht so, dass man erst den Code 
schreibt, und dann schaut, welche Signale davon in die Sensitivliste 
gehören.

Dussel schrieb:
> zweitens müssten in clk und i1 im gleichen Deltazyklus eine Flanke
> haben, damit das ausgewertet wird (geht das eigentlich?)
Das interessiert überhaupt nur den Simulator. Und dort können sich einem 
Deltazyklus durchaus mehrere Signale gleichzeitig ändern. Z. B. bei 
einem parallelen Bus, oder hier, wenn clk und i1 im selben Prozess von 0 
auf 1 gesetzt werden. Denn dann werden diese Änderungen gleichzeitig für 
beide beim nächsten wait oder beim Prozessende relevant.

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.