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?
Du hast in einem Process zwei Flankenabfragen: clk'event und pfs'event Das kann nicht funktionieren. Mach in zwei Processen einzeln Kest
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
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
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
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...
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
Zu der Frage mit der steigenden und fallenden Flanke schau mal in dem Thread http://www.mikrocontroller.net/forum/read-9-243791.html#new
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.