Forum: FPGA, VHDL & Co. ich weiss nicht was ich genau machen soll


von pedro (Gast)


Lesenswert?

In diesem Praktikum wird das Zählsignal VOA zunächst im Verhältnis 4:1 
geteilt, damit Sie die Zähl-impulse bei der Inbetriebnahme Ihrer 
Gesamtschaltung einfacher beobachten können. Die Schal-tung des 4:1 
Teilers wird von uns vorgegeben. Die aus VOA mit Hilfe des 4:1 Teilers 
erzeugten Zähl-impulse fQ sollen mit einem zyklischen 8-Bit-Zähler 
gezählt werden. Der Zähler soll abhängig von der Drehrichtung des Bandes 
aufwärts oder abwärts zählen und jederzeit auf den Initialwert (0000 
0000)2 zurücksetzbar sein.

Entwickeln Sie den Zähler in VHDL. Nutzen Sie dazu die im Anhang 
angegebene Schnittstelle zaehler8Bit. Weisen Sie mit einer funktionalen 
Simulation nach, dass Ihr Zähler zyklisch arbeitet und insbesondere beim 
Aufwärtszählen (up=1) nacheinander die Zählerstände 255, 0, 1 und beim 
Abwärtszählen (up=0) nacheinander 0, 255, 254,… durchläuft.

bitte helfen Sie mir !

von FPGA-User (Gast)


Lesenswert?

Soll jetzt jemand diese Aufgabe für Dich lösen und die Lösung hier 
reinstellen oder hast Du eine konkrete Frage, was Du nicht verstanden 
hast ?

von pedro (Gast)


Lesenswert?

das ist was ich bis jetzt gemacht habe, aber ich debke mal das ist 
falsch!
ich hätte gern die richtige lösung



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

entity zaehler8Bit is
  port(
    Reset: in std_logic;        -- reset
    clk: in std_logic;          -- the count signal
    up: in std_logic;           -- direction (up=1/dn=0)
    zaehlwert: out std_logic_vector(7 downto 0) -- the counter
  );
end zaehler8Bit;

architecture a of zaehler8Bit is

signal zaehler : unsigned(7 downto 0);

begin
   process (Clk,Reset,up)
   begin
      if (Reset = '1') then
     counter <= (others => '0');
      elsif (rising_edge(Clock)) then
            if (Enable = '1') then
               zaehler <= counter + 1;
            end if;

      end if;

      Cnt <= std_logic_vector(counter);

   end process;

end zaehler8Bit_arch;


danke

von Hans (Gast)


Lesenswert?

> ich hätte gern die richtige lösung

wer hätte die nicht gern?

von Falk (Gast)


Lesenswert?

Mein Mathelehrer sagte immer "Nur selber denken macht geistig fett."

Recht hat er.

MFG
Falk

P.S. Du bist auf dem richtigen Weg.

von pedro (Gast)


Lesenswert?

das problemm ich hab nicht mehr viel zeit zu denken , das muss ich 
schnell wie möglich abgeben

von Falk (Gast)


Lesenswert?

Tja, beim nächstem Mal eher anfangen. Der Schmerz muss jetzt sein, das 
ist (hoffentlich) der Lerneffekt.

MfG
Falk

von pedro (Gast)


Lesenswert?

danke euch für ihren ganz besondere hilfe !!!
ihr seit die besten " papler "

das ist es falls jemand es braucht

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

entity zaehler8bit is
port(
     up: in std_logic;
     clk: in std_logic;
     reset: in std_logic;
     Q: out std_logic_vector(7 downto 0));
end zaehler8bit;
  architecture zaehler of zaehler8bit is
begin
process(clk)
variable cnt: integer range 0 to 255;
begin
if (reset = '1') then
     cnt:=0;
elsif(clk'event and clk = '1') then
  if up='0' then
   cnt := cnt-1;
   else cnt:= cnt+1;
   end if;
end if;
 Q<= conv_std_logic_vector(cnt,8);
end process;
end zaehler;

von kopfschüttel (Gast)


Lesenswert?

und war das jetzt so schwer? Ein Forum ist dazu da um sich Ratschläge 
und Tipps zu holen und nicht um ganze Aufgaben gelöst zu bekommen.

Da muss ich Falk rechtgeben einfach eher anfangen und nicht "beleidigt" 
sein wenn keiner die Aufgabe für DICH löst.

von Hans (Gast)


Lesenswert?

Der richtige Weg wäre gewesen, die Aufgabe mit eigenen Worten 
beschreiben (woher wissen wir z.B., wie VOA verwndet wird?), deinen 
Lösungsversuch posten, beschreiben, worin das Problem besteht 
(Compilerproblem, Ergebnis entspricht nicht der Erwartung), und wo du 
den Fehler vermutest.

von high_speed (Gast)


Lesenswert?

Damit pedro  noch was sinnvolles lernt.

Der VHDL-Code vom 05.12.2006 um 12:08 hat einige Fehler.
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.std_logic_arith.all;
4
5
entity zaehler8bit is
6
port(
7
     up    : in std_logic;
8
     clk   : in std_logic;
9
     reset : in std_logic;
10
     Q     : out std_logic_vector(7 downto 0)
11
   );
12
end zaehler8bit;
13
14
-- Bei Signalbezeichner würde ich den 
15
-- ersten Buchstaben groß schreiben, zum 
16
-- Unterscheiden Schlüsselwörter klein.
17
-- Achte auch auf die Formatierung, bringt
18
-- Vorteile beim Lesen
19
20
architecture zaehler of zaehler8bit is
21
begin
22
23
   process(clk)
24
      variable cnt: integer range 0 to 255;
25
      -- Variablen sollte man vermeiden, 
26
      -- wenn es geht. Typ siehe unten.
27
   begin
28
      if (reset = '1') then
29
         cnt:=0;
30
      elsif(clk'event and clk = '1') then
31
         if up='0' then
32
            cnt := cnt-1;
33
         else 
34
            cnt:= cnt+1;
35
         end if;
36
      end if;
37
      Q<= conv_std_logic_vector(cnt,8);
38
   end process;
39
40
end zaehler;

Der Datentype integer stellt eine 32-Bit-Zahl dar. Für Synthetisierte
Logik sollte er aber nicht verwendet werden, je nach Synthese-Tool kann
er unterschiedlich implementiert werden. Für den angegebenen 
Wertebereich
würde ein 8-Bit-Vektor reichen.
Bei der Simulation kam es beim Überlauf zum Fehler:

# ** Fatal: (vsim-3421) Value 256 for cnt is out of range 0 to 255.
#    Time: 5100 ns  Iteration: 1  Process: /test_zaehler/test/line__16 
File: C:/-???-/zaehler8bit.vhd
# Fatal error at C:/-???-/zaehler8bit.vhd line 25
#

Besser du benutzt ein Signal vom Type std_logic_vector(7 downto 0),
da ist sichergestellt, das es sich in jedem Fall um einen 8-Bit-Vektor
handelt. Ein weiterer Vorteil ist, dass die Simulation sich auch gleich
verhält wie die Logik.
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.std_logic_arith.all;
4
5
entity Zaehler8bit is
6
port(
7
     Up      : in std_logic;
8
     CLK     : in std_logic;
9
     Reset   : in std_logic;
10
     Counter : out std_logic_vector(7 downto 0));
11
end Zaehler8bit;
12
13
14
architecture Zaehler of Zaehler8bit is
15
   signal Counter_int : std_logic_vector(7 downto 0)
16
begin
17
18
   process(CLK)
19
   begin
20
21
      if Reset = '1' then
22
         Counter_int <= (others => '0');
23
      elsif CLK'event and CLK = '1' then
24
         if Up='0' then
25
            Counter_int <= Counter_int - 1;
26
         else
27
            Counter_int <= Counter_int + 1;
28
         end if;
29
      end if;
30
31
   end process;
32
33
   Counter <= Counter_int;
34
35
end Zaehler;

MfG
Holger

von FPGA-User (Gast)


Lesenswert?

@high_speed

"Der Datentype integer stellt eine 32-Bit-Zahl dar. Für Synthetisierte
Logik sollte er aber nicht verwendet werden,..."

Falsch, ich verwende integer immer für synthetisierte Logik (was nicht
zwangsläufig nach sich zieht, dass man es so machen muss ;-))

Ich kann nur den guten Rat geben: verwendet immer den Typ, der am besten 
zu der beschriebenen Funktion passt!
Und bei einem Zähler ist das nun mal integer. Als Kind lernt man doch 
nicht das Zählen mit Flip-Flops oder Standard-Logic-Vectoren, sondern 
eben 1,2,3...!
Und genau so hätte ich es auch implementiert.

Moderne Synthese-Tools können das! Die Zeit des Vorkauens ist vorbei.
Vielleicht sollte man mal einen Contest für lesbaren VHDL-Code 
ausschreiben, damit die Leute von der Bit-Fummelei wegkommen.

Den Simulator bekommt man ganz leicht in den Griff:

cnt := (cnt-1) mod 256; -- damit sieht man gleich den Zählumfang

Und was soll dieses ewige clk'EVENT und clk='1'???

Arbeitet ernsthaft noch jemand mit VHDL-87-Only Compilern?
Das sieht aus wie ein Code, den irgendein dummes Tools, nennen wir
es mal GigaWizardSuperPluginManager oder so produziert.

if rising_edge(clk) heißt die lesbare Version!

Die Lesbarkeit wird bei so kurzem Code weiter erhöht, wenn nach dem
'end' die Labels nicht ständig wiederholt werden.

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.