mikrocontroller.net

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


Autor: Beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
USE ieee.std_logic_unsigned.all; 
use IEEE.NUMERIC_STD.ALL;

entity TEST is
    Port ( Signal_1 : out std_logic_vector (4 downto 0);
           Signal_2 : in std_logic_vector (4 downto 0);
           CLK    : in std_logic;   
        
          
end TEST;

architecture Behavioral of TEST is

Signal HilfsSignal_1 :std_logic;
Signal count         : integer range 0 to 99;
Signal Enable        : std_logic;
begin  
  
process (CLK)
begin
 if rising_edge (CLK) then  
   if count >= 99 then  
      count <= 0;
      Enable <='0' 
   else 
      count <= count +1;
      Enable <='1' 
   end if;
 end if;  
end process;    


HilfsSignal_1 <= Signal_2 when Enable = '1' else
            HilfsSignal_1 when Enable = '0' else
            HilfsSignal_1;


Signal_1 <= HilfsSignal_1;

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
Signal_A : std_logic_vector(4 downto 0);
Signal_B : std_logic_vector(9 downto 0);

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ß

Autor: Matthias Larisch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
process (CLK)
begin
 if rising_edge (CLK) then  
   if count < 99 then  
      count <= count + 1;
      Signal_1 <= Signal_2
   end if;
 end if;  
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? :)

Autor: Matthias Larisch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
signal signal_1_save : std_logic_vector(.....);
process (CLK)
begin
 if rising_edge (CLK) then  
   if count < 99 then  
      count <= count + 1;
      Enable <= '1';
      signal_1_save <= signal_1;
   else
      Enable <= '0';
   end if;
 end if;  
end process; 

process output (Enable, Signal_1)
begin
  if Enable = '1' then
    signal_2 <= signal_1;
  else
    signal_2 <= signal_1_save;
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 
:)

Autor: Commtel @msn (commtel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm ok

kennst du

http://www.stud.uni-stuttgart.de/studweb/users/etk...
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

Autor: Beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
Signal_A : std_logic_vector(4 downto 0);
Signal_B : std_logic_vector(4 downto 0);
Ergebnis : std_logic_vector(9 downto 09;


Ergebnis <= Signal_A * Signal B;

Ausgabe <= Ergebnis(9 downto 7);



:) ?

Autor: Commtel @msn (commtel)
Datum:

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

Autor: Matthias Larisch (Gast)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HilfsSignal_1 <= Signal_2 when Enable = '1' else
            HilfsSignal_1 when Enable = '0' else
            HilfsSignal_1;
Deine Beschreibung kann man ohne funktionale Einschränkungen auch etwas 
kürzer schreiben:
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:
process (CLK)
begin
 if rising_edge (CLK) then  
   if count >= 99 then  
      count <= 0;
      HilfsSignal_1 <= Signal_2; 
   else 
      count <= count +1;
   end if;
 end if;  
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:
process output (Enable, Signal_1)
begin
  if Enable = '1' then
    signal_2 <= signal_1;
  else
    signal_2 <= signal_1_save;
end
weil (wieder mal) die Sensitivliste unvollständig ist :-/
Da müsste nämlich noch signal_1_save mit rein.

Autor: dr.schmock (Gast)
Datum:

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

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.