Hi, ich möchte ein Signal, dass ich mit einer Verzögerung auf 0 gesetzt habe zurück after 1 bringen und das nach einer bestimmten Zeit. Dachte da es auch mit "after" gehen sollte, weiß aber leider nicht wie. Es geht um CSTART und CCD_ROG. Bin VHDL-Neuling und würde mich über jede Idee freuen. CCD_CTRL: process ( CLK, ENABLE ) count : std_logic := '0' begin if (CLK'event and CLK = '1' and ENABLE) then if (count > 2033) then CSTART <= 0 after 140ns; end if if (count = 2088) then CCD_ROG <= 0 after 1000ns; count := 0; else count := count + 1; end if end if end process CCD_CTRL; Danke & Gruß Sebastian
Da waren wohl noch andere Problem, so sieht es schon besser aus. Mein Problem ist damit aber noch nicht vom Tisch. CCD_CTRL: process ( CLK, ENABLE ) variable count : integer := 0; begin if (CLK'event and CLK = '1' and ENABLE = '0') then if (count > 2033) then CSTART <= '0' after 140ns; end if; if (count = 2088) then CCD_ROG <= '0' after 1000ns; count := 0; else count := count + 1; end if; end if; end process CCD_CTRL;
Erstmal ist der Process umzuschreiben:
1 | CCD_CTRL: process (CLK) |
2 | variable count : integer := 0; |
3 | begin
|
4 | if (CLK'event and CLK = '1') then |
5 | if ENABLE = '0' then |
6 | if (count > 2033) then |
7 | CSTART <= '0' after 140ns; |
8 | end if; |
9 | if (count = 2088) then |
10 | CCD_ROG <= '0' after 1000ns; |
11 | count := 0; |
12 | else
|
13 | count := count + 1; |
14 | end if; |
15 | end if; |
16 | end if; |
17 | end process CCD_CTRL; |
Wann soll denn die Zeit starten, dh. ab welchen Punkt soll um wieviel später denn was zugewiesen werden? Wenn count=0? Zu beachten ist auch noch, dass Zeitverzögerungen nicht synthetisierbar sind. Lässt sich simulieren, mehr aber nicht.
Hi, erstmal Danke für deine Antwort und die Änderung mit dem ENABLE. Das das mit den Zeiten nicht so wirklich funktionieren kann dachte ich mir schon. Das ISE Webpack 7.1 hats aber trotzdem gefressen. Woher soll die Hardware auch wissen was ns sind. Das hat mit ein Bekannter so gesagt... CCD_ROG soll nach 1000ns und CSTART nach ca. 500ns (aber vorerst nicht so wichtig) wieder auf 1 gesetzt werden. Ich dachte mir das ich evtl. aus einem höheren Takt das CLK-Signal abteilen könnte und dadurch auch mehr Flanke hätte, was mir das "after" ersparen würde.
Ich brauch wohl noch nen Reset oder Start für "count", oder?
Ich würde count als Signal anlegen und mit 0 initialisieren. Dann brauchst du nicht unbedingt einen Reset oder Start dafür. Das läuft dann ab der 1. clk-Flanke los und wird bei 2088 zurückgesetzt. Dafür musst du aber noch bei der Bedingung count > 2033 ein count <= count + 1 einfügen, sonst bleibt der ja bei 2034 stehen. Weiterhin ist es besser diese Bedingung in count = 2034 umzuformen, Verhalten wäre das selbe bei weniger Ressourcenbedarf. Also ungefähr so:
1 | architecture ... of ... is |
2 | |
3 | signal count: integer range 0 to 2088 := 0; |
4 | |
5 | begin
|
6 | |
7 | CCD_CTRL: process (CLK) |
8 | begin
|
9 | if (CLK'event and CLK = '1') then |
10 | if ENABLE = '0' then |
11 | if (count = 2034) then |
12 | CSTART <= '0' after 140ns; |
13 | count <= count + 1; |
14 | end if; |
15 | if (count = 2088) then |
16 | CCD_ROG <= '0' after 1000ns; |
17 | count <= 0; |
18 | else
|
19 | count <= count + 1; |
20 | end if; |
21 | end if; |
22 | end if; |
23 | end process CCD_CTRL; |
Verzögerungen lassen sich mit einem Zähler am einfachsten realisieren. Im Prinzip wie du schon einen drin hast. Der muss dann in Abhängigkeit von deinem Takt bis zu einem bestimmten Zählerstand zählen und dann die Signale zurücksetzen. Das kann ich aber hier nicht auf die Schnelle machen, muss erstmal in die Hochschule ne Prüfung ablegen ;-) Aber vielleicht hilft dir jemand anders derweile, gibt ja genug Experten hier...
Moin... mal ganz ab vom Problem, das der ganze Proces nicht in Hardware synthetisiert werden kann. "after" darf nur in Simulationen vorkommen. Also Zähler ist zwingend, es sei denn du willst dich auf physikalische Synthese einlassen und die Luafzeitketten nmanuell platzieren. Mach doch mal ein paar mehr angaben zum Projekt. Offensichtilich willst du nach bestimmten Zeiten die Signale auslösen. Was spicht dagegen einfach direkt die nötigen Zählerstände abzufragen? Das Design scheint ja mit ca 8MHz hinzukommen. -- Sven Johannes
@ T.M. Danke schon mal für deine Anstrengungen. So wie du das alles schilderst kann ich gut mitkommen, was beim Durchlesen meines Buches nicht immer ganz der Fall ist. Hab mir gestern abend noch ein paar Gedanken zum Projekt gemacht und bin jetzt grad dabei ein paar gravierende Änderungen vorzunehmen. Wird aber eher komplexer... @ Sven Ich will zwei CCD-Zeilen takten und zu bestimmten Zeitpunkten (Wert am Ausgang der Zeilen) einen den "Conversation Start" der daran angeschloßenen AD-Wandler erzeugen. Die seriellen-to-parallel Umsetzer soll mir die Daten dann für einen 8-Bit Bus vorbereiten. Als Anfänger-Projekt doch nicht ohne, oder? ;-) Wer nicht wagt... CCD-Zeilen: ILX551B, AD-Wandler: TLC2551 Hab das ganze schon mit einem µC realisiert, der aber nur etwas überfordert ist da er zusätzliche Aufgaben bekommt und der Takt hochgesetzt werden soll. Deshalb dachte ich daran einiges in externe Hardware auszulagern. Und da ich mir VHDL schon seid längerem mal bebringen wollte war mein Endschluß klar... Leider hatte ich meine Lernphase vor einer Weile aus zeitlichen Gründe nach den Schaltnetzen abgebrochen. Soviel erstmal zu dem Projekt. Ich werd jetzt mal mein Diagramm fertigstellen und das dann posten. Denke mal dann wird einiges verständlicher und der Umfang absehbar. Ich hoffe doch ich bekomm es heut noch fertig. Gruß Sebastian
Die vorab Version meines Diagramms ist jetzt fertig. Bin mir aber an einigen Stellen noch etwas unschlüssig. Ich hab versucht die Komponenten so klein wie möglich zu halten. Ist vielleicht ganz gut bei der Fehlersuche außerdem kann ich dann vielleicht irgendwelche Bibliotheken verwenden. Die FSM wollte ich jetzt etwas nähere beschrieben, aber ich weiß noch nicht so wirklich wie ich den Buffer und somit auch die Control-Signale, realisieren soll. Vielleicht könnt ihr mir ja etwas Bestand leisten. Wenn jemand Fehler in meinen Aufbau entdecken kann oder Verbesserungvorschläge hat, raus damit! Gruß Sebastian
Bin nach unzähligen Internal Server Errors mal wieder über Umwege auf die Seite gekommen. Kann mir vielleicht jemand sagen, wie ich es verhindern kann asynchrones mit synchrones Design zu mixen? Das µC-Interface hätte ich gern asynchron und den Rest synchron. Desweiteren würde mich interessieren ob es zu Timing-Problemen durch das UND-Gatter kommen kann? Oder ist das eine Gatter bei 20MHz eher zu vernachlässigen. Wäre für etwas Beistand sehr dankbar! Sebastian
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.