Forum: FPGA, VHDL & Co. Problem im vhdl code


von Igor (Gast)


Lesenswert?

Hallo liebe Forenmitglieder,


ich habe wiedermal ein Problem und komme nicht weiter. Vielleicht fällt 
jemandem der Fehler im code auf.

Um was es geht. Ich taste ein analoges Signal mit einem AD Wandler ab. 
Ich möchte zwei sachen von Analogen Signal erkennen.

1. Die fallende Flanke von Signal ( gelöst über ein Schmitt Trigger dank 
euch :))

2. Die maximale Amplitude vom Signal. (Funktioniert auch so weit)

Folgende Einschränkungen:

Ich möchte nicht auf jedes eingangssignal reagieren, sondern wenn ein 
Signal bzw. seine fallende Flanke erkannt wurde wird eine Sperrzeit von 
1 millisekunde, in der Zeit reagiert das System nicht auf den Eingang.
Funktioniert auch so weit.

Mein Problem ist bei der Ampliuden erkennung. Ich muss den Wert der 
Maximalen Amplituden erkennung wieder auf Null setzten. Meine Idee war 
es wenn die Totzeit beginnt den gespeicherten Wert der Amplitude wieder 
auf null zu setzten so das beim Nächsten ankommenden Signal die 
Amplituden erkennung wieder von Anfang losgeht und ich es für jedes 
Signal unabhängig mache.

Hier mal der Code , wenn jemand was auffällt wäre ich sehr dankbar!
1
----------------------------------------------------------------------------------
2
-- Company: 
3
-- Engineer: 
4
-- 
5
-- Create Date:    12:54:46 11/30/2009 
6
-- Design Name: 
7
-- Module Name:    EINGANGS_REGISTER - Behavioral 
8
-- Project Name: 
9
-- Target Devices: 
10
-- Tool versions: 
11
-- Description: 
12
--
13
-- Dependencies: 
14
--
15
-- Revision: 
16
-- Revision 0.01 - File Created
17
-- Additional Comments: 
18
--
19
----------------------------------------------------------------------------------
20
library IEEE;
21
use IEEE.STD_LOGIC_1164.ALL;
22
USE ieee.std_logic_unsigned.all; 
23
use IEEE.NUMERIC_STD.ALL;
24
25
26
---- Uncomment the following library declaration if instantiating
27
---- any Xilinx primitives in this code.
28
--library UNISIM;
29
--use UNISIM.VComponents.all;
30
-------------------------------------------------------------------------------
31
entity Flanken_Detektierung_AD_Wandler  is
32
    Port ( 
33
        Eingang_Flanken_Detektierung_AD_Wandler          : in   STD_LOGIC_vector (11 downto 0);
34
           Clk_20Mhz_Flanken_Detektierung                 : in   STD_LOGIC;
35
           Analoge_Maximale_Amplitude_AD_Wandler           : out STD_LOGIC_vector (11 downto 0);
36
        Analoge_Flanke_wurde_erkannt_vom_AD_Wandler       : out  std_logic);
37
       
38
        
39
          
40
end Flanken_Detektierung_AD_Wandler ;
41
42
43
architecture Behavioral of Flanken_Detektierung_AD_Wandler  is
44
-------------------------------------------------------------------------------
45
-------------------------------------------------------------------------------
46
47
-------------------------------------------------------------------------------
48
Signal Flanken_Detektierung_Zwischenpuffer                   : STD_LOGIC_vector (11 downto 0):="000000000000";
49
Signal Schmitt_Trigger_Level                            : unsigned (11 downto 0);
50
Signal cnt                                           : integer range  0 to 20000 ;
51
signal zustand,Enable_Trigger                             : std_logic;
52
sIGNAL Flanke_Erkannt,output_enable                       : std_logic:='0'; 
53
Signal Maximal_Analog_Amplitude                           : STD_LOGIC_vector (11 downto 0):="000000000000";          
54
Signal Aktuelle_Analoge_Amplitude                         : STD_LOGIC_vector (11 downto 0):="000000000000";          
55
Signal Amplitude_Zwischenspeicher                         : STD_LOGIC_vector (11 downto 0):="000000000000";          
56
57
begin
58
--------------------------------------------------------------------------------
59
--------------------------------------------------------------------------------  
60
  
61
  --------------SCHIEBEREGISTER-------------
62
  ------------------------------------------ 
63
  Schieben :process (Clk_20Mhz_Flanken_Detektierung )
64
    begin
65
      if falling_edge (Clk_20Mhz_Flanken_Detektierung ) then
66
        Flanken_Detektierung_Zwischenpuffer <= Eingang_Flanken_Detektierung_AD_Wandler ;
67
        Aktuelle_Analoge_Amplitude       <=  Flanken_Detektierung_Zwischenpuffer;
68
        if Enable_Trigger = '0' then                            --  WENN FLANKE ERKANNT WIRD DIE MAXIMALE ERKANNTE AMPLITUDE WIEDER AUF NULL GESETZT
69
          Maximal_Analog_Amplitude <= "000000000000";                --  
70
        else
71
          if Aktuelle_Analoge_Amplitude > Maximal_Analog_Amplitude then
72
            Maximal_Analog_Amplitude <= Aktuelle_Analoge_Amplitude;
73
          else
74
            Maximal_Analog_Amplitude <= Maximal_Analog_Amplitude ;
75
          end if;
76
        end if;
77
    end process Schieben ;
78
  ------------------------------------------
79
      
80
  --------------------------------- FLANKEN ERKENNUNG ------------------------------------------------------
81
  ----------------------------------------------------------------------------------------------------------
82
  ----------------------------------------------------------------------------------------------------------
83
  
84
  --------------SIGNALZUWEISUNG-------------
85
  Analoge_Flanke_wurde_Erkannt_vom_AD_Wandler <=output_enable;
86
  Schmitt_Trigger_Level <=unsigned(Flanken_Detektierung_Zwischenpuffer);
87
  ------------------------------------------
88
  
89
  --------------TOTZEITERKENNUNG------------
90
  Totzeit:process(Clk_20Mhz_Flanken_Detektierung )
91
  begin
92
  if falling_edge(Clk_20Mhz_Flanken_Detektierung ) then
93
    if Flanke_Erkannt = '1' then
94
      output_enable <= '1';
95
      Enable_Trigger <='0';          -- BEI ERKANNTER ANALOGEN FLANKE WIRD TRIGGER AUF NULL GESTELLT 
96
      cnt<=0;                    
97
    elsif cnt <= 19999 then            -- HIER TOTZEIT FUER 1 msek, KEINE REAKTION AUF EINGANGSSIGNAL 
98
      output_enable  <= '1';          -- 
99
      Enable_Trigger <= '0';
100
      cnt <=cnt+1;
101
    else
102
      output_enable  <= '0';
103
      Enable_Trigger <= '1';          -- BEIM ÜBERLAUF VON CNT IST TRIGGER WIEDER AUF 1, SOMIT WIRD 
104
    end if;                      -- AUF FALLENDE FLANKE GESCHAUT;WENN SIE ERKANNT IST WIRD TRIGGER AUF
105
  end if;                        -- 0 GESETZT FÜR DIE TOTZEIT VON 8399 STELLEN
106
  end process Totzeit;
107
  ------------------------------------------
108
109
  --------------SCHMITT-TRIGGER-------------
110
  ------------------------------------------ 
111
   Trigger: process (Clk_20Mhz_Flanken_Detektierung )
112
   begin
113
      if falling_edge(Clk_20Mhz_Flanken_Detektierung ) then
114
      Flanke_Erkannt <= '0';                
115
       if Enable_Trigger ='1' then                      
116
        if (Schmitt_Trigger_Level > "101001100101")  then    -- OBERE SCHWELLE HIER 65% VOM AD BEREICH
117
          zustand <= '1';
118
        end if;
119
        if (Schmitt_Trigger_Level < "011001100110")  then    -- UNTERE SCHWELLE HIER 40%  VOM AD BEREICH  
120
          zustand <= '0';
121
          if zustand = '1' then
122
            Flanke_Erkannt <= '1';    -- ANALOGE FLANKE ERKANNT WENN SCHWELLE_UNTEN WIEDER UNTERSCHRITTEN 
123
          end if;
124
        end if;
125
      end if;
126
      end if;  
127
  end process Trigger;
128
  ----------------------------------------------
129
  Analoge_Maximale_Amplitude_AD_Wandler  <=Maximal_Analog_Amplitude;
130
  
131
  
132
133
end Behavioral;

von Duke Scarring (Gast)


Lesenswert?

Das schmeisst Du erstmal raus:
> USE ieee.std_logic_unsigned.all;

Und dann macht es sich sehr gut, wenn Du noch die Testbench mitlieferst.

Duke

von Igor (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

sorry wusste nicht so genau wie ich das simulieren soll, jetzt bench 
dabei.

>Das schmeisst Du erstmal raus:
> USE ieee.std_logic_unsigned.all;

Was kann es für Fehler verursachen?


Gruß

von Duke Scarring (Gast)


Lesenswert?

> USE ieee.std_logic_unsigned.all;
Was kann es für Fehler verursachen?


z.B. diesen hier:
1
$ vlib work
2
$ vcom *.vhd
3
4
Model Technology ModelSim XE III vcom 6.2g Compiler 2007.02 Feb 22 2007
5
-- Loading package standard
6
-- Loading package std_logic_1164
7
-- Loading package std_logic_arith
8
-- Loading package std_logic_unsigned
9
-- Loading package numeric_std
10
-- Compiling entity flanken_detektierung_ad_wandler
11
-- Compiling architecture behavioral of flanken_detektierung_ad_wandler
12
** Error: ad.vhd(71): Subprogram '>' is ambiguous. Suitable definitions exist in packages 'std_logic_1164' and 'std_logic_unsigned'.
13
** Error: ad.vhd(71):    (Use the '-explicit' option to disable the previous error check.)

Dein Modul läßt sich gar nicht compilieren :-/

Duke

von Duke Scarring (Gast)


Angehängte Dateien:

Lesenswert?

Definiere sowas vom Typ unsigned:
1
 Signal Maximal_Analog_Amplitude : STD_LOGIC_vector (11 downto 0):="000000000000";
Dann kannst Du damit auch sinvoll rechnen und vergleichen.

Im Anhang mal das gefixte Modul. Ob der Simuli der Testbnech sinnvoll 
ist, kann ich nicht entscheiden. Anererseits sieht die Simulation 
prinzipiell nicht ganz schlecht aus.

Duke

von Igor (Gast)


Lesenswert?

Hi,

sorry der Fehler lag im Code hatte erst gesendet ohne zu komplieren
1
  Schieben :process (Clk_20Mhz_Flanken_Detektierung )
2
    begin
3
      if falling_edge (Clk_20Mhz_Flanken_Detektierung ) then
4
        Flanken_Detektierung_Zwischenpuffer <= Eingang_Flanken_Detektierung_AD_Wandler ;
5
        Aktuelle_Analoge_Amplitude       <=  Flanken_Detektierung_Zwischenpuffer;
6
        if Enable_Trigger = '0' then                            --  WENN FLANKE ERKANNT WIRD DIE MAXIMALE ERKANNTE AMPLITUDE WIEDER AUF NULL GESETZT
7
          Maximal_Analog_Amplitude <= "000000000000";                --  
8
        else
9
          if Aktuelle_Analoge_Amplitude > Maximal_Analog_Amplitude then
10
            Maximal_Analog_Amplitude <= Aktuelle_Analoge_Amplitude;
11
          else
12
            Maximal_Analog_Amplitude <= Maximal_Analog_Amplitude ;
13
          end if;
14
        end if;
15
    end if; -- HIER WAR DER FEHLER HATTE END IF VERGESSEN :( SORRY
16
end process Schieben ;
17
18
19
Hm... also kein Fehler gefunden?

von Duke Scarring (Gast)


Lesenswert?

if Enable_Trigger = '0' then      --  WENN FLANKE ERKANNT

In der Simulation ist der ständig 0, so dass auch ständig zurückgesetzt 
wird...

Duke

von Igor (Gast)


Lesenswert?

ja aber warum ist das so?? :)

von Duke Scarring (Gast)


Angehängte Dateien:

Lesenswert?

Dafür schaut man sich an, wo das Signal getrieben wird: im Prozess 
Totzeit
Also steckt dort die Ursache/der Fehler.

Ich habe spaßeshalber mal den elsif-Zweig abegeändert:
1
    elsif cnt <= 19999 then           -- HIER TOTZEIT FUER 1 msek, KEINE  
2
      output_enable  <= '1';          -- 
3
      Enable_Trigger <= '1';
4
      cnt <=cnt+1;

Danach sah es ganz gut aus.

Duke

P.S.: Wo darf ich die Rechnung hinschicken? ;-)

von Igor (Gast)


Lesenswert?

:)

Aber so ganz verstehe ich das nicht. Ich verwende für den Schmitt 
trigger das Signal
1
 Enable_Trigger
, d.h Wenn Enable_Trigger = '1' darf der Schmitt trigger loslaufen.

Wenn der Schmitt trigger eine Flanke erkannt hat, soll das 
Enable_Trigger für 1 milisekunde auf 0 gesetzt werden daher das cnt <= 
19999 Enable_Trigger = '0'....und dannach wieder auf '1' gesetzt werden.

Zusammengefasst Enable_Trigger = '1' dann ist der Schmitt Trigger 
scharf. Wenn Schmitt trigger eine Flanke erkannt hat schaltet er das 
Enable_Trigger auf 0 für eine milisekunde aus. in der Zeit können 
signale kommen werden aber nicht von schmitt trigger erkannt.


Hm?????



P.s Kann die Rechnung auf in Form von einer Schokolade gesendet werden 
:)

von Igor (Gast)


Lesenswert?

Hat den niemand eine Idee? Ich verstehe es nicht warum in der Simulation 
das Enable_Trigger ständig auf null ist (augeschlossen von der obigen 
korrektur) da der Enable_Trigger nur nach einer erkannten flanke für 1 
msek auf null gehen soll.

Und das beste ist das es auf dem Oszi funktioniert, ich gebe ein 
kontinuierliches Rechtecksignal, und der ausgang reagiert auch immer nur 
flanken in abstand von 1 msek....

D.h in der Realität funktioniert es aber nicht in der simulation...

:(

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.