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 !
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 ?
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
> ich hätte gern die richtige lösung
wer hätte die nicht gern?
Mein Mathelehrer sagte immer "Nur selber denken macht geistig fett." Recht hat er. MFG Falk P.S. Du bist auf dem richtigen Weg.
das problemm ich hab nicht mehr viel zeit zu denken , das muss ich schnell wie möglich abgeben
Tja, beim nächstem Mal eher anfangen. Der Schmerz muss jetzt sein, das ist (hoffentlich) der Lerneffekt. MfG Falk
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;
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.
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.
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.