Zählgrenzen als Input

OP #5033033
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.
Gast #5033125
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.
OP #5033523
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;
#5033614
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren