Couldn't implement registers for assignments on this clock edge

Gast #988876
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;
Moderator (Firma: Titel) Persönliche Seite #988910
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
Moderator (Firma: Titel) Persönliche Seite #988924
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;
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.