Forum: FPGA, VHDL & Co. Couldn't implement registers for assignments on this clock edge


von Psycho Dad (Gast)


Lesenswert?

Bei dem nachfolgenden Programm findet sich der oben genannte Fehler. Der 
Fehler ligt in der Flankendetektion. Was habe ich da falsch gemacht?
1
-- Dateiname: flanke.vhd
2
-- Beschreibung: Definition einer Funktion zur Detektion
3
-- einer ansteigenden Flanke
4
5
library ieee;
6
use ieee.std_logic_1164.all;
7
8
entity flanke is
9
10
  port (d, clk : in std_logic;
11
      q  : out std_logic);
12
  
13
  function pos_flanke (signal s : std_logic)
14
    return boolean is
15
      variable result : boolean; -- Rückgabevariable
16
      begin
17
        if (s'event) and (s = '1') and -- Flankendetektion
18
           (s'last_value = '0') then result := true; -- Wert vor letzter Signaländerung
19
        else result := false;
20
        end if;
21
    return result; -- Rückgabe  
22
  end function pos_flanke;
23
  
24
end entity flanke;
25
26
architecture verhalten of flanke is
27
begin
28
  process(clk)
29
  begin
30
    if pos_flanke(clk) then q <= d; -- Funktionsaufruf
31
    end if;
32
  end process;
33
end architecture verhalten;

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


Lesenswert?

Die Funktion "rising_edge()" ist in der IEEE-Library definiert:
1
    -------------------------------------------------------------------    
2
    -- edge detection
3
    -------------------------------------------------------------------    
4
    FUNCTION rising_edge  (SIGNAL s : std_ulogic) RETURN BOOLEAN IS
5
    BEGIN
6
        RETURN (s'EVENT AND (To_X01(s) = '1') AND 
7
                            (To_X01(s'LAST_VALUE) = '0'));
8
    END;

In der praktischen Anwendung sieht das dann so aus:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
entity flanke is
4
  port (d, clk : in std_logic;
5
        q      : out std_logic);
6
architecture verhalten of flanke is
7
begin
8
  process(clk)
9
  begin
10
    if rising_edge(clk) then q <= d; -- FF einbauen
11
    end if;
12
  end process;
13
end architecture verhalten;

Aber Achtung: Das ist nicht einfach so eine Flankenerkennung. Damit wird 
ein getaktetes Speicherelement (also ein Flipflop) beschrieben.

Siehe auch im http://www.mikrocontroller.net/articles/VHDL

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


Angehängte Dateien:

Lesenswert?

1
rising_edge()
und
1
clk'event and clk'last_value = '0' and clk='1'
sind Schlüsselformulierungen für die Synthese.
Daran wird erkannt, dass ein FF eingebaut werden soll.

Mit der folgenden Beschreibung wird zwar alles korrekt simuliert (Bild). 
Die Synthese macht aber nur aus den ersten beiden Beschreibungen FFs 
(v1, v2). Die beiden Prozesse v3 und v4 werden gar nicht erst 
implementiert (Bild RTL-Schematics).
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
entity flanke is
7
8
   port (clk   : in std_logic;
9
         d,e,f,g : in std_logic;
10
         q,p,r,s : out std_logic);
11
12
   -- Funktion rising_edge() aus IEEE, aber mit anderem Namen
13
   FUNCTION pos_edge  (SIGNAL s : std_ulogic) RETURN BOOLEAN IS
14
   BEGIN
15
     RETURN (s'EVENT AND (To_X01(s) = '1') AND 
16
                         (To_X01(s'LAST_VALUE) = '0'));
17
   END;  
18
19
   -- aus Post von  Psycho Dad
20
   function pos_flanke (signal s : std_logic)
21
     return boolean is
22
       variable result : boolean; -- Rückgabevariable
23
       begin
24
         if (s'event) and (s = '1') and               -- Flankendetektion
25
            (s'last_value = '0') then result := true; -- Wert vor letzter Signaländerung
26
         else result := false;
27
         end if;
28
     return result; -- Rückgabe  
29
   end function pos_flanke;
30
  
31
end entity flanke;
32
33
architecture verhalten of flanke is
34
begin
35
-- Synthese OK
36
  v1: process(clk)
37
  begin
38
    if rising_edge(clk) then p <= e; -- IEEE-Funktionsaufruf
39
    end if;
40
  end process;
41
42
  v2: process(clk)
43
  begin
44
    if clk'event and clk'last_value = '0' and clk='1' then r <= f; -- händisch
45
    end if;
46
  end process;
47
48
49
-- Synthese nicht brauchbar
50
  v3: process(clk)
51
  begin
52
    if pos_edge(clk) then q <= d;    -- Funktionsaufruf
53
    end if;
54
  end process;
55
  
56
  v4: process(clk)
57
  begin
58
    if pos_flanke(clk) then s <= g;   -- Funktionsaufruf
59
    end if;
60
  end process;
61
62
end architecture verhalten;

Die verwendetete Testbench:
1
   clk <= not clk after 10 ns;
2
3
   tb : PROCESS
4
     BEGIN
5
     d<='1';
6
     wait for 100 ns;
7
     e<='1';
8
     wait for 100 ns;
9
     f<='1';
10
     wait for 100 ns;
11
     g<='1';
12
     wait for 100 ns;
13
14
     d<='0';
15
     wait for 100 ns;
16
     e<='0';
17
     wait for 100 ns;
18
     f<='0';
19
     wait for 100 ns;
20
     g<='0';
21
     wait for 100 ns;
22
  END PROCESS;

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.