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 !
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
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
libraryieee;
2
useieee.std_logic_1164.all;
3
useieee.std_logic_arith.all;
4
5
entityzaehler8bitis
6
port(
7
up:instd_logic;
8
clk:instd_logic;
9
reset:instd_logic;
10
Q:outstd_logic_vector(7downto0)
11
);
12
endzaehler8bit;
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
architecturezaehlerofzaehler8bitis
21
begin
22
23
process(clk)
24
variablecnt:integerrange0to255;
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'eventandclk='1')then
31
ifup='0'then
32
cnt:=cnt-1;
33
else
34
cnt:=cnt+1;
35
endif;
36
endif;
37
Q<=conv_std_logic_vector(cnt,8);
38
endprocess;
39
40
endzaehler;
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.
@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.