Forum: FPGA, VHDL & Co. Rahmenwekennung


von Oliver L. (emperor)


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?

von Kest (Gast)


Lesenswert?

Du hast in einem Process zwei Flankenabfragen:
clk'event und pfs'event

Das kann nicht funktionieren.
Mach in zwei Processen einzeln

Kest

von Oliver L. (emperor)


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

von Oliver L. (emperor)


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

von AxelM (Gast)


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...

--
1
Quellcode
2
--}
3
--

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

von AxelM (Gast)


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...

von Oliver L. (emperor)


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

von AxelM (Gast)


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

von Oliver L. (emperor)


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?

von Oliver L. (emperor)


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:
1
ENTITY Modul_Clock IS
2
Port(
3
clk,pfs:  in std_logic;                                             --
4
Clock und PFS
5
Reset:    in std_logic;                                             --
6
'1' aktiv
7
countTs:  out std_logic_vector (5 downto 0);                        --
8
Timeslotzählung
9
countBit: out std_logic_vector (3 downto 0);                        --
10
Bitzählung                                    
11
start:    out std_logic);                                            --
12
Start des ersten Rahmens erkannt
13
END ENTITY Modul_Clock;
14
15
16
ARCHITECTURE vercount OF Modul_Clock IS
17
18
procedure startstop(
19
20
variable b:  in std_logic;
21
variable go: out std_logic)is
22
23
begin
24
go:=b;
25
end procedure startstop;
26
27
28
signal count4: std_logic_vector (5 downto 0);                     
29
--Zählt alle Timeslots zwischen den pfs (RxD)
30
signal count3: std_logic_vector (3 downto 0);                     
31
--Zählt die Bits im PCM-Eingangsregister (RxD)
32
--signal start1: std_logic ;
33
34
35
 
36
37
BEGIN
38
          
39
40
Count: process(clk,pfs,Reset)                                 
41
variable a,got: std_logic;                                             
42
                  --Start des ersten Rahmens erkannt (RxD)              
43
                          
44
45
begin
46
47
if(Reset='1') then
48
   a           := '0';
49
   start       <= '0';
50
   got :='0';
51
   count4      <= (others => '0');
52
   count3      <= (others => '0');
53
   
54
else
55
                                    
56
      if (pfs='1')  then                                             
57
           --Rahmenbeginn signalisieren
58
           a := '1';
59
           startstop(a,got);                                           
60
                
61
      end if;
62
      
63
              if (got='1')then                                       
64
       --"Start"
65
                  if (clk'event and clk='1') then                   
66
             
67
                      count3 <=count3+1;                     
68
                  end if;    
69
70
               end if;
71
               
72
      if (count4="011111" and count3="1000") then                  
73
       --Timeslotzählung rücksetzen
74
75
          count4 <= (others => '0');
76
          count3 <= (others => '0');
77
78
      elsif count3="1000" then                                       
79
      --Bitzählung rücksetzen und Timeslotzählung
80
81
          count3     <= (others => '0');
82
          count4     <= count4+1;
83
84
      end if;
85
86
end if;
87
88
start<=got;
89
90
end process Count;
91
countTs  <= count4;          
92
countBit <= count3;
93
94
95
StopZero: process (clk,Reset)
96
variable a,got: std_logic;
97
begin
98
  
99
  if(Reset='1') then
100
101
       a           := '0';
102
       got         := '0';
103
      
104
  else
105
    
106
107
      if (clk'event and clk='0') then        
108
            if(count4="011111" and count3="1000") then       
109
               a := '0';                                             
110
     --Rahmenende signalisieren
111
               startstop(a,got);
112
             --  start1<=got;
113
            end if;
114
      end if;
115
      
116
117
  end if;
118
end process StopZero;    
119
120
END ARCHITECTURE vercount;

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

olli

von Oliver L. (emperor)


Angehängte Dateien:

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

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.