www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Rahmenwekennung


Autor: Oliver Lpo (emperor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Hier ist mal ein  Auszug aus einem Modul welches Teil einer
Rahmensynchronisation ist.
Pcm mit 32*8Bit.

Count: process(clk,pfs,Reset)
variable a: std_logic;

begin

if(Reset='1') then


count4      <= (others => '0');
count3      <= (others => '0');
a:='0';

else

if ( pfs'event and pfs='1')  then
--Rahmenbeginn signalisieren
    a := '1';
--"Start"
end if;


if (a='1')then

if (clk'event and clk='1') then

    count3 <=count3+1;

end if;


if (clk'event and clk='0') then

   if(count4="011111" and count3="1000") then
--Rahmenende signalisieren

      a:='0';

   end if;

end if;


end if;

if (count4="011111" and count3="1000") then
--Timeslotzählung rücksetzen

count4 <= (others => '0');
count3 <= (others => '0');

elsif count3="1000" then
--Bitzählung rücksetzen und Timeslotzählung

count3     <= (others => '0');
count4     <= count4+1;

end if;
end process Count;

In der Simulation funktioniert auch alles wunderbar aber beim
Synthetisieren mit Leonardo wird der pfs(Framesync) nicht angebunden.


Woran könnte das liegen?

Autor: Kest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast in einem Process zwei Flankenabfragen:
clk'event und pfs'event

Das kann nicht funktionieren.
Mach in zwei Processen einzeln

Kest

Autor: Oliver Lpo (emperor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann hab ich aber das Problem das man Variablen nur in einem Prozess
verwenden darf, oder?
Es wird mit der steigenden Flanke von clk geschrieben und mit der
fallenden gelesen. clk und pfs sind synchron.

Mir der steigenden Flanke von pfs muss das erste bit geschrieben
werden.
Wenn ich das jetzt mit zwei Processen mache, dann müsste ich Signale
verwenden und ich würde das 1Bit doch quasi verpassen.

Hab das schon mal versucht und das hat nicht hingehauen.


olli

Autor: Oliver Lpo (emperor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi

werd es mal ohne pfs'event probieren.
Simulation geht damit und Leo setzt es auch um.
Wenn noch wer eine bessere Lösung hat, ich bin für alles offen :-)

olli

Autor: AxelM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver Ipo... na ich denke wir kennen uns oder :-)
So also zu beginn ein Tipp. Du kannst den Quellcode besser anzeigen,
wenn du das ganze wie auf der Startseite beschrieben so eingibst...

--
Quellcode
--}
--

Aber nun zu deinem Problem. Warum soll das nicht in 2 Prozessen
funktionieren? Du kannst doch bei deiden den zustand von a abfragen und
dann entscheiden ob er den Prozess durchlaufen soll oder nicht.
A musst du dann natürlich als globale Variable oder besser als Signal
in der Component definieren.
Oder hab ich heut schon zu lange vor dem PC gesessen???


Axel

Autor: AxelM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ich depp
Das mit dem beispiel für die Quellcodeeingabe ist ja voll in die Hose
geganggen. Ich dachte das er die Zeilen als Text interprätiert, wenn
man -- davorschreibt. Also musste dir das mal schnell auf der
Startseite anschauen...

Autor: Oliver Lpo (emperor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi
ja richtig wir kennen uns ;-)

mit der globalen variable werd ich mal probieren,danke. mit nem signal
haut es nicht hin, weil dann das erste bit flöten geht.
noch mal zum thema zwei'events in einem process:

gilt das nur bei verschiedenen signalen oder darf ich auch nicht beide
flanken von clk in einem process verwenden?

olli

Autor: AxelM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zu der Frage mit der steigenden und fallenden Flanke schau mal in dem
Thread

http://www.mikrocontroller.net/forum/read-9-243791.html#new

Autor: Oliver Lpo (emperor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi
hm der fehler der bei der synthese nicht mehr beastandet wird taucht
beim place and route wieder auf.
globale variablen lassen sich doch nur mit hilfe von prozeduren
verwenden oder?

Autor: Oliver Lpo (emperor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so das place and route hat geklappt und jetzt gibts probleme beim
simulieren.
wenn der erste timeslot durchgelaufen ist und zähler 3 bei 1000 ist,
müsste zähler 4 um eins eröt werden. stattdessen "zappelt" er nur rum
und macht nicht das was er soll.
könnte es daran liegen das dieser teil asynchron abläuft?
hab schon überlegt ob ich die abfrage für die zähler in den processen
lasse und das rücksetzen in einer prozedur mache.
gibt es eigentlich ne gute seite wo man nachschauen kann wie man
bestimmte dinge am besten realisiert?
so sieht der aktuelle code aus:

ENTITY Modul_Clock IS
Port(
clk,pfs:  in std_logic;                                             --
Clock und PFS
Reset:    in std_logic;                                             --
'1' aktiv
countTs:  out std_logic_vector (5 downto 0);                        --
Timeslotzählung
countBit: out std_logic_vector (3 downto 0);                        --
Bitzählung                                    
start:    out std_logic);                                            --
Start des ersten Rahmens erkannt
END ENTITY Modul_Clock;


ARCHITECTURE vercount OF Modul_Clock IS

procedure startstop(

variable b:  in std_logic;
variable go: out std_logic)is

begin
go:=b;
end procedure startstop;


signal count4: std_logic_vector (5 downto 0);                     
--Zählt alle Timeslots zwischen den pfs (RxD)
signal count3: std_logic_vector (3 downto 0);                     
--Zählt die Bits im PCM-Eingangsregister (RxD)
--signal start1: std_logic ;


 

BEGIN
          

Count: process(clk,pfs,Reset)                                 
variable a,got: std_logic;                                             
                  --Start des ersten Rahmens erkannt (RxD)              
                          

begin

if(Reset='1') then
   a           := '0';
   start       <= '0';
   got :='0';
   count4      <= (others => '0');
   count3      <= (others => '0');
   
else
                                    
      if (pfs='1')  then                                             
           --Rahmenbeginn signalisieren
           a := '1';
           startstop(a,got);                                           
                
      end if;
      
              if (got='1')then                                       
       --"Start"
                  if (clk'event and clk='1') then                   
             
                      count3 <=count3+1;                     
                  end if;    

               end if;
               
      if (count4="011111" and count3="1000") then                  
       --Timeslotzählung rücksetzen

          count4 <= (others => '0');
          count3 <= (others => '0');

      elsif count3="1000" then                                       
      --Bitzählung rücksetzen und Timeslotzählung

          count3     <= (others => '0');
          count4     <= count4+1;

      end if;

end if;

start<=got;

end process Count;
countTs  <= count4;          
countBit <= count3;


StopZero: process (clk,Reset)
variable a,got: std_logic;
begin
  
  if(Reset='1') then

       a           := '0';
       got         := '0';
      
  else
    

      if (clk'event and clk='0') then        
            if(count4="011111" and count3="1000") then       
               a := '0';                                             
     --Rahmenende signalisieren
               startstop(a,got);
             --  start1<=got;
            end if;
      end if;
      

  end if;
end process StopZero;    

END ARCHITECTURE vercount;


werd nochmal ein bisschen rumprobieren und später mal vorbeischauen.
bis dahin

olli

Autor: Oliver Lpo (emperor)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

So wie es aussieht haut das alles nach dem Place and Route nicht mehr
hin.Ich hab mal ein Bild hochgeladen das zeigt wie es aussehen sollte.
In der Simulation klappt alles wunderbar.
Das Problem das ich habe ist, dass bereits mit der steigenden Flanke
des PFS Signals das parallel dazu steigende Clock Signal erkannt werden
muss.
Alle anderen Module laufen, nur das erste Bit ist noch ein Problem.


Vielleicht kann mir ja jemand helfen.


Olli

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.