Forum: FPGA, VHDL & Co. Process bei zweitem Takt starten


von Timo (Gast)


Lesenswert?

Hallo ich habe eine frage zum Process ablauf in VHDL.
Ich möchte, das der Process m2, einen Takt später ausgeführt wird als 
der Process m1. Das heißt, wenn c einen Wert hat, soll der Process m2 
beim nächsten Takt ausgeführt werden.
1
.
2
m1 : process (clk) is
3
if rising_edge (clk) then 
4
begin
5
c <= a+b;
6
end if;
7
end process m1;
8
9
m2 : process (clk) is  -- m2 : process (c) is ??
10
begin
11
if rising_edge (clk) then 
12
begin
13
d <= c;
14
end if;
15
end process m2;
16
.
   --      --
__|  |____|  |___
   m1      m1
           m2

Ich habe versucht den zweiten Process abhängig zu machen vom ersten,
aber das scheint mir der falsche weg zu sein.

Gruß Timo

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Ich möchte, das der Process m2, einen Takt später ausgeführt wird als
> der Process m1.
Du hast also zwei Zustände m1 und m2.
Sowas verwaltet man mit einer State-Machine.
1
signal state : std_logic :='0';
2
:
3
process (clk) begin
4
   if rising_edge (clk) then 
5
   if (state = '1') then
6
      c <= a+b;
7
      state <= '0';
8
   else
9
      d <= c;
10
      state <= '1';
11
   end if;
12
end process;
Hier gibt es zwei Zustände, die abwechselnd ausgeführt werden.

> Ich habe versucht den zweiten Process abhängig zu machen vom ersten,
> aber das scheint mir der falsche weg zu sein.
Was du eigentlich brauchst, ist ein dritter Prozess, der die beiden 
anderen verwaltet.
1
signal start : std_logic :='0'; -- irgendein Start-Signal
2
signal dom1 : std_logic :='0';  -- enable Signale für m1 und m2
3
signal dom2 : std_logic :='0';
4
:
5
6
verwaltung: process (clk) begin
7
 if rising_edge (clk) then 
8
   dom1 <='0';
9
   dom2 <='0';
10
   if (start='1') then
11
      dom1 <='1';
12
   end if;
13
   if (dom1='1') then
14
      dom2 <='1';
15
   end if;
16
 end if;
17
end process;
18
19
m1 : process (clk) begin
20
   if rising_edge (clk) then 
21
      if (dom1='1') then
22
         c <= a+b;
23
      end if;
24
   end if;
25
end process m1;
26
27
m2 : process (clk) begin
28
   if rising_edge (clk) then 
29
      if (dom2='1') then
30
         d <= c;
31
      end if;
32
   end if;
33
end process m2;

von Timo (Gast)


Lesenswert?

Vielen Dank für den Hinweis mit dem dritten Process.
Genau so was habe ich gebraucht.
Danke.

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.