Forum: FPGA, VHDL & Co. Einige Fragen zum VHDL


von Beginner (Gast)


Lesenswert?

Hallo ,

befinde mich grad im betreten der großen Welt des VHDLs. Zudem hätte ich 
ein paar Fragen und hoffe ich finde hier vielleicht ein Paar Antworten:

Was mich am meisten Verwirrt ist folgende Situation:

Ich möchte ein Signal_1 einem anderem Signal_2 Zuweisen für eine 
bestimmte Zeit eines bestimmtes Enable Signal. Wenn das Enable Signal 
auf Null geht Soll das Signal auf dem Letzten erhaltenm Wert bleiben. Ja 
quasi ein Speicherzustand.

In vhdl z.B
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
USE ieee.std_logic_unsigned.all; 
4
use IEEE.NUMERIC_STD.ALL;
5
6
entity TEST is
7
    Port ( Signal_1 : out std_logic_vector (4 downto 0);
8
           Signal_2 : in std_logic_vector (4 downto 0);
9
           CLK    : in std_logic;   
10
        
11
          
12
end TEST;
13
14
architecture Behavioral of TEST is
15
16
Signal HilfsSignal_1 :std_logic;
17
Signal count         : integer range 0 to 99;
18
Signal Enable        : std_logic;
19
begin  
20
  
21
process (CLK)
22
begin
23
 if rising_edge (CLK) then  
24
   if count >= 99 then  
25
      count <= 0;
26
      Enable <='0' 
27
   else 
28
      count <= count +1;
29
      Enable <='1' 
30
   end if;
31
 end if;  
32
end process;    
33
34
35
HilfsSignal_1 <= Signal_2 when Enable = '1' else
36
            HilfsSignal_1 when Enable = '0' else
37
            HilfsSignal_1;
38
39
40
Signal_1 <= HilfsSignal_1;
41
42
end Behavioral;

Meine Frage : Es kommt die Warning found Latch ... ist auch verständlich 
da ich auch ein Speicherzustand bewirken will nur ist das so ok? ich 
denke das ist eher ein schlechtes Design, aber dann frag ich mal wie 
macht man das am besten wenn man ein Signal fur eine bestimmte Zeit 
einem anderem Zuweisen soll und fur eine bestimmte Zeit soll es den 
letzt erhalten Wert zuweisen



Eine Zweite Frage:

Z:b
1
Signal_A : std_logic_vector(4 downto 0);
2
Signal_B : std_logic_vector(9 downto 0);
3
4
Signal_A <= Signal_B(9 downto 5);

Meine Frage : Hier kommt die Warning " Node <Signal_B_0> of sequential 
type is unconnected...." Ist die Warning ernst zu nehmen? Ich mein ich 
vwerdende auch nur die oberen 5 bit.... oder gibt es da eine bessere 
Design möglichkeit?



Gruß

von Matthias Larisch (Gast)


Lesenswert?

Bist du dir sicher, dass der erste Code tut was er soll? count beginnt 
ja nach 99 wieder bei 0 und enable geht dann gleich wieder auf 1 (d.h. 
es ist immer 99 Takte 1 und 1 Takt 0)

Du könntest das Ausgangssignal direkt im getakteten Prozess setzen:
1
process (CLK)
2
begin
3
 if rising_edge (CLK) then  
4
   if count < 99 then  
5
      count <= count + 1;
6
      Signal_1 <= Signal_2
7
   end if;
8
 end if;  
9
end process;

Ich muss dazusagen, dass ich kein VHDL Experte bin...

Zum Unconnected Pins Problem:
Ist ja in dem Code der Fall, dass du die unteren Bits zwar hast, aber 
nirgens angeschlossen. Wozu hast du sie denn dann? :)

von Matthias Larisch (Gast)


Lesenswert?

Achso: Wenn du natürlich Asynchron Signal 2 auf 1 zuweisen willst im 
ersten Beispiel, so führt kein Weg um dein Enable drum herum. Zusätzlich 
ist dann das Problem, dass das Latch dadurch entsteht, dass dein 
Speicher nicht mehr taktgesteuert ist. Das ist Müll :) Deswegen führen 
wir den Speicher explizit ein:
1
signal signal_1_save : std_logic_vector(.....);
2
process (CLK)
3
begin
4
 if rising_edge (CLK) then  
5
   if count < 99 then  
6
      count <= count + 1;
7
      Enable <= '1';
8
      signal_1_save <= signal_1;
9
   else
10
      Enable <= '0';
11
   end if;
12
 end if;  
13
end process; 
14
15
process output (Enable, Signal_1)
16
begin
17
  if Enable = '1' then
18
    signal_2 <= signal_1;
19
  else
20
    signal_2 <= signal_1_save;
21
end

Ich bin mir grad nicht sicher, wie schlau es wäre, den Speicher noch in 
einen eigenen Prozess auszulagern. Aber ich denke so ist das schon okay 
:)

von Commtel @. (commtel)


Lesenswert?

hmm ok

kennst du

http://www.stud.uni-stuttgart.de/studweb/users/etk/etk39219/vhdl/index.htm
http://www.lothar-miller.de/s9y/

ansonsten

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
USE ieee.std_logic_unsigned.all;
use IEEE.NUMERIC_STD.ALL;

sollte so aussehen

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

dann Frage zu
Port ( Signal_1 : out std_logic_vector (4 downto 0); <--sind es 5 
leitungen?
           Signal_2 : in std_logic_vector (4 downto 0);
           CLK    : in std_logic;

Signal count         : integer range 0 to 99;<--hmm 100 leitungen für 
die zahl 99?

würd auch reichen
Signal count : unsigned (7 downto 0);

ansonsten

if Enable = '1' then
 HilfsSignal_1 <= Signal_2
else
 Signal_1 <= HilfsSignal_1;
end if;

Hoffe hab s verstanden mit deinen signalen
bin selber neuling seit sommer

von Beginner (Gast)


Lesenswert?

Hi,


der Code oben war jetzt als Beispiel geschrieben,hab das was ich gemacht 
hab grad nicht auf diesem Pc. MIr gehts eigenltich um die Zuweisung 
eines Signals bzw. Das das Signal auf den letzt erhaltenen Wert bleiben 
soll... ich weiß oben ist vielleich bläd das das Enable nur für ien Takt 
auf 1 geht. Aber angenommen das Enable Signal dauert länger also auf 1 
ist es 100 takte und auf null ist es auch 100 takte... Wie beschreibe 
ich das Design ohne Latches zu verursachen.


Zum unterem Beispiel:

Angenommen du Mulltiplizierst zwei signale und möchtest nur bestimmte 
bits ausgeben.
1
Signal_A : std_logic_vector(4 downto 0);
2
Signal_B : std_logic_vector(4 downto 0);
3
Ergebnis : std_logic_vector(9 downto 09;
4
5
6
Ergebnis <= Signal_A * Signal B;
7
8
Ausgabe <= Ergebnis(9 downto 7);


:) ?

von Commtel @. (commtel)


Lesenswert?

wenn deine Ausgabe auch nur 3 stellen hat dann ja

bei xilinx ise kommt noch ne warning mit das die restlichen bits nicht 
angeschlossen sprich (6 downto 0);

von Matthias Larisch (Gast)


Lesenswert?

Ich hab dir doch 2 Beispiele geschrieben oben, wie du KEINE latches 
erzeugst.

Multiplikation:
Wenn du nur 3 Bits brauchst dann multipliziere auch nicht mehr :) Aber 
generell hast du recht: Die Warnung darf man dann ignorieren in so einem 
Fall. Man sollte sich allerdings überlegen, wie man die Bits eventuell 
vorher schon einsparen kann, oder ob es nicht gar ein Fehler ist, dass 
man manche nicht verwendet hat. Deswegen die Warnung.

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


Lesenswert?

1
HilfsSignal_1 <= Signal_2 when Enable = '1' else
2
            HilfsSignal_1 when Enable = '0' else
3
            HilfsSignal_1;
Deine Beschreibung kann man ohne funktionale Einschränkungen auch etwas 
kürzer schreiben:
1
HilfsSignal_1 <= Signal_2 when Enable = '1' else HilfsSignal_1 ;
Und dann erkennt man das Latch sofort. Das Hilfssignal_1 wird auf sich 
selber zugewiesen, und zwar abhängig vom Pegel von Enable. Das ist ein 
klassisches Latch. Im Gegensatz zum flankengesteuerten Flipflop ist das 
Latch pegelgesteuert.

Ich meine fast, die originale Beschreibung könnte ohne Latch auch in 
etwa so aussehen:
1
process (CLK)
2
begin
3
 if rising_edge (CLK) then  
4
   if count >= 99 then  
5
      count <= 0;
6
      HilfsSignal_1 <= Signal_2; 
7
   else 
8
      count <= count +1;
9
   end if;
10
 end if;  
11
end process;


> Meine Frage : Hier kommt die Warning " Node <Signal_B_0> of sequential
> type is unconnected...." Ist die Warning ernst zu nehmen?
Nein.
> Ich mein ich vwerdende auch nur die oberen 5 bit....
Grund erkannt.

BTW:
> Signal count : integer range 0 to 99;<--hmm 100 leitungen
>                                         für die zahl 99?
Das ist ein integer mit einem Bereich von 0 bis 99. Dafür reichen 7 
Leitungen (aka Bits) aus. Diesen Zusammenhang erkennt der Synthesizer 
selbständig.
> würd auch reichen
> Signal count : unsigned (7 downto 0);
Noch immer zuviel. Es würde sogar
Signal count : unsigned (6 downto 0);
ausreichen. Aber ich selber nehme für Zähler auch immer integer. Denn in 
diesem Fall käme beim unsigned keine Fehlermeldung, wenn im Simulator 
wegen eines Fehlers mal der Wert 100 erreicht wird. Beim Integer gibts 
einen Fehler.

BTW2:
Diese Beschreibung simuliert falsch:
1
process output (Enable, Signal_1)
2
begin
3
  if Enable = '1' then
4
    signal_2 <= signal_1;
5
  else
6
    signal_2 <= signal_1_save;
7
end
weil (wieder mal) die Sensitivliste unvollständig ist :-/
Da müsste nämlich noch signal_1_save mit rein.

von dr.schmock (Gast)


Lesenswert?

Latches verhindern:
indem man speichernde Zuweisungen (wie z.B. HilfsSignal_1 <= 
HilfsSignal_1;) IMMER in getakteten Prozessen macht.
Also entweder wie von Matthias beschrieben, oder wenn das Enable-Signal 
die Instanz wechselt, ungefähr so:

process (CLK)
begin
 if rising_edge (CLK) then
  if Enable = '1' then
   HilfsSignal_1 <= Signal_2;
  end if;
 end if;
end process;


Unverbundene Signale sind machmal kaum zu vermeiden. Ich weiß leider 
auch keinen Weg, wie man die Warnings wegbekommt

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.