Forum: FPGA, VHDL & Co. Problem bei Zähler mit Reset - Bedingung


von Black Friday (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
momentan muss/darf ich mich gerade in die CPLD - programmierung mit
VHDL - einarbeiten. Dazu verwende ich die ISE von Xilinx und das
CoolRunner II - Design Kit.
Als ersten Test habe ich einen Zähler programmiert, der sich bei einem
bestimmten Zählerstand resettet.
Das Programm funktioniert soweit, allerdings gibt ab und zu "Fehler"
bei dem LSB im Moment des resettens (rote Markierung im Analyzer -
Bild).
Kann mir jemand erklären, woher diese rühren und wie ich diese
vermeiden kann?

Hier mein Programm:

library IEEE;
use IEEE.std_logic_1164.all;  -- defines std_logic types
use ieee.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;

entity jc2_top is
    port (
     CLK : in STD_LOGIC;
     Q : inout STD_LOGIC_VECTOR (11 downto 0) := "000000000000"
         );
end jc2_top;

architecture jc2_top_arch of jc2_top is
signal QINT : std_logic_vector (11 downto 0) := "000000000000";
begin


process (CLK)
begin
   if (CLK'event and CLK='1') then       -- CLK rising edge
        QINT <= QINT + 1;
  end if;

    if (QINT > "000000001010") then       -- reset
        QINT <= "000000000000";
     end if;
end process;

Q <= QINT;

end jc2_top_arch;

von Jürgen Schuhmacher (Gast)


Lesenswert?

Schiebe mal die Umschaltoperation in den geclockte Teil hinein, daß das
ein vernüftiges Register ist.

von Black Friday (Gast)


Lesenswert?

@Jürgen Schuhmacher:
Könntest du mir das bitte etwas genauer erklären?
Was (bzw. wo) ist der gelockte Teil?

von Dirk (Gast)


Lesenswert?

Hi,

[vhdl]
library IEEE;
use IEEE.std_logic_1164.all;  -- defines std_logic types
use ieee.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;

entity jc2_top is
    port (
     CLK : in STD_LOGIC;
     Q : inout STD_LOGIC_VECTOR (11 downto 0) := "000000000000"
         );
end jc2_top;

architecture jc2_top_arch of jc2_top is
signal QINT : std_logic_vector (11 downto 0) := "000000000000";
begin


process (CLK)
begin
   if (CLK'event and CLK='1') then       -- CLK rising edge
        QINT <= QINT + 1;

    if (QINT > "000000001010") then       -- reset
        QINT <= "000000000000";
     end if;
   end if;
end process;

Q <= QINT;

end jc2_top_arch;

von Black Friday (Gast)


Lesenswert?

Super, danke, das hat funktioniert (ich musste nur zu meinem Bitmuster
'1' addieren, um das selbe Zählergebnis zu erhalten). Die Störungen
sind aber weg.

Könnte mir aber bitte noch jemand den Unterschied zwischen den beiden
Varianten erklären?

von Rick Dangerus (Gast)


Lesenswert?

Die erste Variante dürfte den Zählerstand auch zurücksetzen, wenn eine
fallende Clock-Flanke kommt (Gibt es noch weitere CLK'Events?).

Die zweite Variante reagiert nur bei der steigenden Flanke.

Rick

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.