Counter in 2 Process

OP #7491749
Lesenswert?

Hallo, ich übe mich gerade in VHDL und habe ein Problem was ich nicht verstehe. Ich möchte einen count in 2 Process hoch zählen und da bekomme ich immer einen fehler. Könnte mir jmd einen Tipp geben wäre nett

1
 signal  count       : STD_LOGIC_VECTOR (3 downto 0):= "0000";
2

3

4
  Process (clk_q)  -- erster Clock
5
     begin
6
      bla bla bla then
7
            count<= count + '1';
8
     end if;  --End Clock Event
9
  end Process;
10

11

12
  Process (clk1)  -- 2ter Clock
13
     begin
14
      bla bla bla  then
15
            count<= count + '1';
16
     end if;  --End Clock Event
17
  end Process;
18

19
 Addr <= count;

mfg Schuby

#7491791
Lesenswert?

Max S. schrieb:

Könnte mir jmd einen Tipp geben

  1. Programmtags für Sourcecode verwenden ;-)

  2. Für die allermeisten Fälle und für Anfänger insbesondere gilt: Ein Signal wird nur von einem Prozess getrieben!

Eine Lösungsmöglichkeit ist, dass (mindestens) ein Prozess ein Signal setzt, wenn der Counter inkrementiert werden soll und der andere Prozess (der den Counter hochzählt) dieses Signal zusätzlich zu seiner eigenen Logik auswertet, um den einen Zähler zu inkrementieren. Aber was ist, falls bei Prozesse gleichzeitig 'count' erhöhen wollen?

Oder den Zähler gleich in einen dritten Prozess auslagern.

Aber Vorsicht: Du hast zwei Taktdomänen! Da müssen die Signale aus der einen Taktdomäne erst in die andere einsynchronisiet werden, bevor sie verwendet werden können! Und bei Events (Signal ist nur ein Takt high), ist das nicht ganz trivial).

Aber erzähl doch mal, was Du wirklich machen willst und warum es zwei Taktdomänen sein müssen.

OP #7491806
Lesenswert?

Hallo Pat A, erstmal schönen Dank für deine Antwort. Tja was habe ich vor ? Ich bin Rentner und fast 70 Jahre alt, ich möchte mich beschäftigen. Und nicht den ganzen Tag vor der Klotze verbringen. :-)

Vor habe ich im mom gar nichts, ich muss erst besser in VHDL werden. Schaue mir jeden Tag Videos an und bin am üben.

mfg Schuby

OP #7491832
Lesenswert?

Oh Danke das schaue ich mir gleich mal an.

Aber zu meiner Frage, ich bin am überlegen alles in einen Process zu lassen und die beiden Clk über ein MUX zu schalten.

Ich habe doch noch das alte Spartan 3 von Digilent und da versuche ich meine ersten Tests mit den beiden SRAM die unter der Platine sind.

  1. Die SRAM schreiben möchte ich gerne mit einen hohen Clk.
  2. Aber das Lesen möchte ich mit meinen Takt langsam so das ich auuch was sehe.

Das Spartan 3 Board habe ich mit einen XMega verbunden 8 Daten Bits und ein paar Steuerleitungen.

Na ja meine ersten Gehversuche :-) Aber es macht Spaß.

mfg Schuby

#7491873
Lesenswert?

Ah, ok - das ist schon fortgeschrittenes Level ;-)

Vielleicht noch ein Tipp dazu: zwei oder mehr Taktdomänen nimmt man nur, wenn's sich wirklich nicht vermeiden lässt - weil der Aufwand und die Fehlerträchtigkeit enorm ansteigt. Die Taktdomänen müssen unbedingt sauber getrennt bleiben und Signale, die in der anderen Taktdomäne verwendet werden, müssen umsynchronisiert werden - ansonsten sind Funktionsfehler garantiert!

Langsamere Takte in einem Single-Clock-Design generiert man sich am besten per heruntergeteiltem Clock-Enable (ungetestet, einfach mal runtergeschrieben):

1
constant ClockDivider: integer = 10;
2
signal clk_div: integer range 0 to ClockDivider-1;
3
signal clk_en: std_logic;
4

5
clk_div: process(reset, clk)
6
begin
7
    if (reset = '1') then
8
        clk_en  <= '0';
9
        clk_div <= ClockDivider-1;
10
    elsif rising_edge(clk) then
11
        clk_en <= '0';
12

13
        if clk_div = 0) then
14
            clk_en  <= '1';             -- clock enable für einen Takt
15
            clk_div <= ClockDivider-1;  -- Taktteiler neu starten
16
        else 
17
            clk_div <= clk_div - 1;
18
        end if;
19
    end if;
20
end process clk_div;
21

22
slow_clk_proc: process(reset, clk)
23
begin
24
    if (reset = '1') then
25
        -- ...
26
    elsif rising_edge(clk) then
27
        if (clk_en = '1') then
28
            -- jeden 10. Takt etwas ausführen
29
        end if;
30
    end if;
31
end process slow_clk_proc;

Aber auf gar keinen Fall einen Takt herunterteilen und diesen bzw. dieses Signal als neuen Takt verwenden (Stichwort 'gated clock'). Klingt zwar verlockend einfach, ist aber aber tatsächlich ziemlich problembehaftet und kann Fehler verursachen, die nur sporadisch auftreten können und schwer zu finden sind.

Weiterhin viel Spaß mit VHDL und FPGA - damit kann man echt tolle Sachen machen!

#7492049
Lesenswert?

Max S. schrieb:

  1. Die SRAM schreiben möchte ich gerne mit einen hohen Clk.
  2. Aber das Lesen möchte ich mit meinen Takt langsam so das ich auuch was sehe.

Hi Max S, das was du vor hast, habe ich bei mir schon am Laufen. Auch ein Xmega und ein FPGA. Ist zwar ein Spartan-6, aber das Prinzip bleibt gleich. Ich empfehle dir alles im FPGA mit einem hohen Takt zu betreiben. Ganz egal ob du langsam lesen und schreiben willst, oder schnell. Das Schreibsignal ist ja WE und zum Lesen nimmst du OE. Das ist dann vom CLK unabhängig. Wenn du da den µC direkt mit dran hast, dann kannst du mit dem ja einen kleinen RAM Test laufen lassen und sehen ob das funktioniert. Dazu schreibe ich Primzahlen und lese sie wieder aus. Damit kannst du schnell testen ob alles läuft.

Wenn du da noch ein paar Infos brauchst, dann melde dich gerne bei mir.

Viele Grüße

Moderator (Firma: Titel) Persönliche Seite #7492298
Lesenswert?

Max S. schrieb:

ich übe mich gerade in VHDL

VHDL-Code bitte mit [vhdl] Tags umrahmen.

Max S. schrieb:

Die SRAM schreiben möchte ich gerne mit einen hohen Clk. Aber das Lesen möchte ich mit meinen Takt langsam so das ich auuch was sehe.

Such mal nach "Postulate" hier im FPGA-Forum. Die tauchen dort auf, wo Anfänger typische Anfängerprobleme gemacht haben.

Aber generell gilt: nur 1 Takt pro Design. Das ist der Takt, der mit ca. 50 MHz vom Taktpin des FPGAs kommt.

Und zum Thema "Clock-Enable sieh dir mal dort das Lauflicht an: dort wird in einem Prozess das langsame Clock-Enable erzeugt, aber das gesamte Design läuft mit hoher Taktfrequenz:

Später als Fortgeschrittener kannst du dann wenn nötig mit mehreren Taktdomänen anfangen, wenn du welche brauchst. Und bis dahin merkst du: das ist eigentlich gar nicht so oft der Fall.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren