mikrocontroller.net

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


Autor: Jietre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gute morgen,

Ich hab ein kleines Problem mit meinem Program...
und zwar soll mein Zähler bis 16 Zählen und dann aufhören bis wieder
ein Eingangsimpuls kommt.. Aber der zähler führt ne schleife aus und
wiederholt sich ständig...


      if(clk 'event and clk = '1') then
        if(start='1') then
        count<="0000";
        else

                     CASE count IS
                WHEN "0000" => preset <= '1';
                WHEN "0001" => preset <= '0';
                WHEN "0010" => preset <= '0';
                WHEN "0011" => preset <= '0';
                WHEN "0100" => preset <= '0';
                WHEN "0101" => preset <= '0';
                WHEN "0110" => preset <= '0';
                WHEN "0111" => preset <= '0';
                WHEN "1000" => preset <= '0';
                WHEN "1001" => reset  <= '1';
                WHEN "1010" => reset  <= '1';
                WHEN "1011" => reset  <= '1';
                WHEN "1100" => reset  <= '1';
                WHEN "1101" => reset  <= '1';
                WHEN "1110" => reset  <= '1';
                WHEN others => reset  <= '0';
                    END CASE ;

               count <= count + "0001";

        end if;



Das 2 Prob ist, ich wenn ich statt "When others", "when "1111" schreibe
bekomme ich eine Fehlermeldung, dass nicht alle Zählerzustände des 
zählers (3 downto 0) angegeben wurden ...

Autor: Nagel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"when others" muss man schreiben, es wird aber nicht in Hardware 
umgesetzt.

Autor: Jietre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist dann "when others" = "1111" ?
Weil wenn ich When others ne '1' zuweißse bekomm ich ständig nen reset
und keinen Ausgang.

Hier das ganze Prog. vll. wirds dann verständlicher:



entity PRNG is
    Port ( clk : in  STD_LOGIC;
           start : in  STD_LOGIC;
           q_prng : out  STD_LOGIC);
end PRNG;

architecture Behavioral of PRNG is
signal qi : std_logic_vector(2 downto 0);
signal reset : std_logic;
signal preset : std_logic;
signal count : std_logic_vector (3 downto 0);

begin

    process (clk)
    begin

        if(clk 'event and clk = '1') then
        if(start='1') then
        count<="0000";
        else

                     CASE count IS
                         WHEN "0000" => preset <= '1';
                         WHEN "0001" => preset <= '0';
                WHEN "0010" => preset <= '0';
                WHEN "0011" => preset <= '0';
                WHEN "0100" => preset <= '0';
                WHEN "0101" => preset <= '0';
                WHEN "0110" => preset <= '0';
                WHEN "0111" => preset <= '0';
                WHEN "1000" => preset <= '0';
                WHEN "1001" => reset  <= '1';
                WHEN "1010" => reset  <= '1';
                WHEN "1011" => reset  <= '1';
                WHEN "1100" => reset  <= '1';
                WHEN "1101" => reset  <= '1';
                WHEN "1110" => reset  <= '1';
                WHEN others => reset  <= '0';
                    END CASE ;

               count <= count + "0001";

        end if;


        qi(2) <= qi(0) xor qi(1);
        qi(1) <= qi(2);
        qi(0) <= qi(1);


        if reset = '1' then
        qi <= "000";
        end if;

        if preset = '1' then
        qi <= "101";

        end if;
        end if;

    end process;

  q_prng <= qi(1);

  end Behavioral;

Autor: Frank Buss (foobar)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier eine Antwort zu deinem ersten Posting: Zu Problem 2: Wenn du z.B. 
std_logic_vector verwendest, dann gibt es 9 verschiedene Zustände pro 
Bit. Wenn du z.B. 0 downto 0 für count angibst, dann kommt für folgenden 
Code kein Fehler mehr:
  WHEN "U" => preset <= '1';
  WHEN "X" => preset <= '1';
  WHEN "0" => preset <= '1';
  WHEN "1" => preset <= '1';
  WHEN "Z" => preset <= '1';
  WHEN "W" => preset <= '1';
  WHEN "L" => preset <= '1';
  WHEN "H" => preset <= '1';
  WHEN "-" => preset <= '1';

Zu deinem Hauptproblem: "count" zählt jeden Takt, solange start = 0 ist. 
In manchen Simulationsprogrammen führt das zu einem Fehler, wenn "count" 
überläuft, in Hardware schaltet es meist wieder auf 0 zurück, sodaß der 
Zähler also immer weiterläuft. Ich würde "natural" als Typ für "count" 
verwenden und das dann so schreiben:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity main is
  port(
    clk: in std_logic;
    start: in std_logic;
    preset: out std_logic;
    reset: out std_logic
  );
end main;

architecture rtl of main is
  signal count: natural range 0 to 15;
begin
  process(clk)
  begin
    if rising_edge(clk) then
      if start = '1' then
        count <= 0;
      else
        case count is
          when 0       => preset <= '1';
          when 1 to 8  => preset <= '0';
          when 9 to 14 => reset <= '1';
          when 15      => reset <= '0';
        end case;
        if count < 15 then
          count <= count + 1;
        end if;
      end if;
    end if;
  end process;
end architecture rtl;

So wie du deinen Code ursprünglich formuliert hast, ist dir aber schon 
klar, daß "reset" erst nach einigen Zählschritten wieder auf 1 
zurückgesetzt wird, wenn das nächste start-Signal kommt?

Autor: Jietre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok danke :),

Hab das problem grad selbst gelöst...
Trozdem danke für die hilfe.

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.