mikrocontroller.net

Forum: FPGA, VHDL & Co. Zähler problem


Autor: gast (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
hab da ein kleines Problem mit einem Zähler. Der sollte hochzählen 
sobald der Eingang ErrorIn bei rising_edge(clock) und CountEna = 1 high 
ist. Das funktioniert bei einzelnen bits aber bei drei hintereinander 
folgenden eins zählt er nur einmal hoch. Bin bis jetzt bei der 
Fehlersuche nicht fündig geworden. Könnte mir jemand helfen ?
Danke im Voraus.

Hier die quellcode:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;

entity ErrorCounter is
    generic( n : natural := 4 );
       port( clock :  in std_logic;
             reset :  in std_logic;
          CountEna :  in std_logic;  -- is 1 when synchronity is given
           ErrorIn :  in std_logic;  -- Error detected
          CarryOut : out std_logic;  -- Triggers incrementation of Cnt 
No2
        ErrorCount : out std_logic_vector(n-1 downto 0) );
end entity ;

architecture ErrorCounter_arch of ErrorCounter is

type state_type is (s0,s1,s2,s3,s4,s5,s6,s7,s8,s9);

signal curr_state,next_state : state_type;
signal s_counter : std_logic_vector(n-1 downto 0);

constant tdelay      : time := 50 ns;
constant tperiod     : time := 15000 ns;

begin
Sync_proc : process(clock,reset,CountEna)
     begin
         if reset = '1' then
            curr_state <= s0;
         else
            if  rising_edge(clock) and CountEna = '1' then
                curr_state <= next_state;
            end if;
         end if;
end process;
state_proc: process(next_state,ErrorIn)
    begin
        CarryOut <='0';
        case curr_state is
            when s0 =>
                ErrorCount <= "0000";
                if (ErrorIn = '1') then
                   next_state <= s1;
                else
                   next_state <= s0;
                end if;

            when s1 =>
                ErrorCount <= "0001";
                if (ErrorIn = '1') then
                   next_state <= s2;
                else
                   next_state <= s1;
                end if;

            when s2 =>
                ErrorCount <= "0010";
                if (ErrorIn = '1') then
                   next_state <= s3;
                else
                   next_state <= s2;
                end if;

            when s3 =>
                ErrorCount <= "0011";
                if (ErrorIn = '1') then
                   next_state <= s4;
                else
                   next_state <= s3;
                end if;

            when s4 =>
                ErrorCount <= "0100";
                if (ErrorIn = '1') then
                   next_state <= s5;
                else
                   next_state <= s4;
                end if;

            when s5 =>
                ErrorCount <= "0101";
                if (ErrorIn = '1') then
                   next_state <= s6;
                else
                   next_state <= s5;
                end if;

            when s6 =>
                ErrorCount <= "0110";
                if (ErrorIn = '1') then
                   next_state <= s7;
                else
                   next_state <= s6;
                end if;

            when s7 =>
                ErrorCount <= "0111";
                if (ErrorIn = '1') then
                   next_state <= s8;
                else
                   next_state <= s7;
                end if;

            when s8 =>
                ErrorCount <= "1000";
                if (ErrorIn = '1') then
                   next_state <= s9;
                else
                   next_state <= s8;
                end if;

            when s9 =>
                ErrorCount <= "1001";
                if (ErrorIn = '1') then
                   next_state <= s0;
                   CarryOut <= '1';
                else
                   next_state <= s9;
                end if;
        end case;
end process;
end architecture ;

Autor: BigR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
curr_state noch mit in die Sensitvity Liste aufnehmen.
state_proc: process(next_state,ErrorIn,curr_state)

Autor: Stefan Hanke (stefanhanke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guck dir mal genau deine Sensitivitätslisten an.
gna, zu spät ...
 -- stefan

Autor: na (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In die erste Liste gehört vor allem nur clock und reset. Außerdem das 
count enable dann nicht per "and" verknüpfen sondern nach rising_edge 
eine neue if-Anweisung einführen.
In die zweite Liste gehört alles wovon du liest. Also curr_state aber 
dafür fliegt next_state raus, denn das schreibst du nur.

Autor: Christian Peters (kron)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mir kommt das Ganze irgendwie zu kompliziert vor.
Ist das nicht so einfacher?
process (clock)
if (rising_edge(clock)) then
  if (countEna = '1' and ErrorIn = '1') then
    ErrorCount <= ErrorCount + 1;
    CarryOut <= '0';
    if (ErrorCount = "1001") then
      CarryOut <= '1';
      ErrorCount <= "0000";
    end if;
  end if;
end if;
end process;

Ist jetzt nur so schnell geschrieben, aber
so ähnlich sollte es gehen.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die hilfreichen antworten, in der verzweifelte Suche nach dem 
Problem hatte ich weiteren Fehlern eingebaut. jetzt geht alles.
Besten Dank.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.