Forum: FPGA, VHDL & Co. Zählgrenzen als Input


von Sophie G. (sophie_90)


Lesenswert?

Hallo,

ich bräuchte mal euren Rat. Ich will mir einen 0-99 Auf/Ab-Zähler 
basteln, welcher bestimmte Zählgrenzen, welche als Input reingehen, 
verarbeiten kann.
Die Zählgrenzen werden über Schieberegister eingestellt. Die Auswertung 
welche Zählgrenze grad anliegt, hab ich über eine case-Anweisung 
geschrieben. Das funktioniert auch alles einwandfrei.

Hier mal die case-Anweisung, welche die Schieberegisterauswertung als 
Eingang bekommt:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity bereich_case is
    Port (
        bereich : in integer range 1 to 13;
        c_min : buffer integer range 0 to 99;
        c_max : buffer integer range 0 to 99);

end bereich_case;

architecture Behavioral of bereich_case is
begin

process(bereich,c_min,c_max)

 begin

case bereich is

  when 1   => c_min <= 0;
       c_max <= 99;

  when 2   => c_min <= 0;
       c_max <= 49;

  when 3   => c_min <= 50;
       c_max <= 99;

  when 4   => c_min <= 0;
       c_max <= 9;

  when 5   => c_min <= 10;
       c_max <= 19;

  when 6   => c_min <= 20;
       c_max <= 29;

  when 7   => c_min <= 30;
       c_max <= 39;

  when 8   => c_min <= 40;
             c_max <= 49;

  when 9   => c_min <= 50;
       c_max <= 59;

  when 10 => c_min <= 60;
       c_max <= 69;

  when 11 => c_min <= 70;
       c_max <= 79;

  when 12 => c_min <= 80;
       c_max <= 89;

  when 13 => c_min <= 90;
             c_max <= 99;

end case;
end process;

end Behavioral;



Diese geht auf den Zähler.
Hier der Zähler:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity up_down is

  port
  (
    clk  : in std_logic;
    reset  : in std_logic;
    enable  : in std_logic;
    updown   : in std_logic;
    c_min : in integer range 0 to 99;
          c_max : in integer range 0 to 99;
    q     : out integer range 0 to 99
  );

end up_down;

architecture rtl of up_down is
  signal direction : integer;

begin

  process (updown)
  begin

    if (updown = '1') then
      direction <= 1;
    else
      direction <= -1;
    end if;
  end process;


  process (clk,c_min,c_max)
    constant min: integer:= 0;
    constant max: integer:= 99;
    variable cnt: integer range min to max;

  begin
    min <= c_min;
    max <= c_max;

    if (rising_edge(clk)) then

      if reset = '1' then
        cnt := 0;

      elsif enable = '1' then
        cnt := cnt + direction;

      end if;
    end if;

    q <= cnt;

  end process;

end rtl;



Er meckert aber ständig rum und ich weiß einfach nicht woran es liegt. 
Ich hoffe ihr habt eine Idee.

von Clem (Gast)


Lesenswert?

Sophie G. schrieb:
> Er meckert aber ständig rum und ich weiß einfach nicht woran es liegt.

Ohne wirklich den Code anzuschauen könntest du ja auch einfach mal die 
Fehlermeldungen anschauen beziehungsweise posten...

Könnte ja nur helfen.

von Sophie G. (sophie_90)


Lesenswert?

Entweder er muckt rum weil min und max keine konstanten, wenn ich das 
ändere, stört er sich auf einmal, dass keine Signale sind. Schwierig 
dann zu sagen, wo dann der Fehler liegt.

von Schlumpf (Gast)


Lesenswert?

Warum willst du die Variable "cnt" zur dynamisch "begrenzen"?
    variable cnt: integer range min to max;
Willst du damit den Überlauf festlegen?

von Sophie G. (sophie_90)


Lesenswert?

Das war der Gedanke ja

von Sophie G. (sophie_90)


Lesenswert?

Übrigens meinte ich nicht schieberegister, sondern schiebeschalter

von Schlumpf (Gast)


Lesenswert?

Sophie G. schrieb:
> Das war der Gedanke ja

Besser wäre es, den Zähler so bauen, dass auf min und max verglichen und 
entsprechend zurückgestellt wird.

Beispielhaft so:
1
if cnt = max then cnt <= min;

Und du solltest diese wilde Mischung aus Signalen, Konstanten und 
Variablen sein lassen.

von Bitwurschtler (Gast)


Lesenswert?

Lies den Synthese guide für "deinen" FPGA. Beispielsweise wenn du Vivado 
von Xilinx benutzt die UG901: 
http://www.xilinx.com/support/documentation/sw_manuals/xilinx2014_4/ug901-vivado-synthesis.pdf

Da steht beispielsweise auf S. 149 mittig ein wichtiger Hinweis.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Schlumpf schrieb:
> Und du solltest diese wilde Mischung aus Signalen, Konstanten und
> Variablen sein lassen.
Ganz wichtig: beim "sein lassen" von hinten her anfangen...

von Sophie G. (sophie_90)


Lesenswert?

Ich bekomme die Zählgrenzen in dem Zähler einfach nicht verarbeitet :(

von Sophie G. (sophie_90)


Lesenswert?

Hab den Zähler nochmal überarbeitet. Als Fehler erscheint: min must 
represent signal.

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity up_down_counter is

  port
  (
    clk     : in std_logic;
    reset     : in std_logic;
    enable     : in std_logic;
    updown     : in std_logic;
    c_min : in integer range 0 to 99;
          c_max : in integer range 0 to 99;
    q       : out integer range 0 to 99
  );

end up_down_counter;

architecture rtl of up_down_counter is
  signal direction : integer;
  constant min: integer;
  constant max: integer;
begin

  process (updown)
  begin
    -- Determine the increment/decrement of the counter
    if (updown = '1') then
      direction <= 1;
    else
      direction <= -1;
    end if;
  end process;


  process (clk,c_min,c_max)

    variable  cnt: integer;

  begin

    if cnt=max then
    cnt:=min;
    end if;

    if (rising_edge(clk)) then

      if reset = '1' then
        cnt := min;

      elsif enable = '1' then
        cnt := cnt + direction;

      end if;
    end if;

    q <= cnt;
    min <= c_min;
    max <= c_max;
  end process;

end rtl;

von Burkhard K. (buks)


Lesenswert?

Sophie G. schrieb:
>Als Fehler erscheint: min must represent signal.

Mein Synthesetool meckert bei folgenden Konstrukt:
1
   dum_proc: process(clk)
2
      constant const: std_logic;
3
   begin
4
      if rising_edge(clk) then
5
         const := '1';
6
      end if;
7
   end process;

und zwar:
  "Deferred constant const is allowed only in package declaration"
  "const is not a variable"
bzw. "const is not a signal" wenn ich die Zuweisung in const <= '1' 
ändere.

Viel wichtiger ist die erste Fehlermeldung - ein Process ist kein 
Package - und nur dort scheinen deferred constants zulässig. Warum 
machst Du daraus nicht ganz normale Signale?

: Bearbeitet durch User
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.