Forum: FPGA, VHDL & Co. Signal in VHDL nach "after" zurückbringen


von Sebastian (Gast)


Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

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;

von T.M. (Gast)


Lesenswert?

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.

von Sebastian (Gast)


Lesenswert?

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.

von Sebastian (Gast)


Lesenswert?

Ich brauch wohl noch nen Reset oder Start für "count", oder?

von T.M. (Gast)


Lesenswert?

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

von Sven Johannes (Gast)


Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

@ 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

von Sebastian (Gast)


Angehängte Dateien:

Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.