hi,
also x"01" ist hexadezimalschreibweise.
und wenn du das bit zu weit nach links oder rechts schiebst, dann
"fällt" es raus.
verhindern sollte dies der befehl ROR, der das zu weit geschobene bit
auf der anderen seite wieder anfügt.
ich habe den befehl noch nie benutzt, und kann deshalb auch nix zu
beisteuern woran es liegen könnte. geht rol evtl. nur mit einem
bit_vector? du hast da standardlogic verwendet.
an der uni wird uns beigebracht, das man std_logic immer meiden soll
wenn man es nicht unbedingt benötigt(bin aber auch nich so der vhdl
crack um das beurteilen zu können)
Achja und was ist der unterschied zwischen bit_vector und
STD_LOGIC_VECTOR?
Mit dem bit_vector kann ich nicht bit_vector <= bit_vector + 1 rechnen
und mit dem STD_LOGIC_VECTOR kann ich nicht STD_LOGIC_VECTOR <=
STD_LOGIC_VECTOR rol 1 machen. Wieso?
Welches soll man wann nehmen?
hi,
also mit standard_logic kann man tristate verhalten erlangen. du kannst
den ausgang damit auf 1, 0 oder hochohmig setzen. bit_vector ist nur 0
oder 1
zum programmieren von solchen countern braucht vhdl aus irgendeinem
grund auch std_logic. wieso das so ist, das kann ich dir jedoch nicht
erklären.
hier mal dein program ein wenig verändert...
du musst den counter z.b. auch wieder auf null setzen.
wenn du einen vergleich auf die x"10" machst, dann muss die vektorlänge
auch übereinstimmen...du hattest da ja vorher eine länge von 24 oder
sowas
1
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
useIEEE.STD_LOGIC_ARITH.ALL;
4
useIEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
entityledShifteris
7
Port(RESET:inbit;
8
CLOCK:inbit;
9
DIR:inbit;
10
LEDS:outbit_vector(7downto0));
11
endledShifter;
12
13
architectureBehavioralofledShifteris
14
15
signalclk_div_counter:STD_LOGIC_VECTOR(4downto0);
16
signalledTMP:bit_vector(7downto0):="00000001";
17
signalclk_149hz:bit:='0';
18
19
begin
20
clk_div:process(RESET,CLOCK)
21
begin
22
ifRESET='1'then
23
clk_div_counter<=(others=>'0');
24
clk_149hz<='0';
25
elsifCLOCK='1'andCLOCK'eventthen
26
ifclk_div_counter=x"10"then
27
clk_149hz<='1';
28
clk_div_counter<=(others=>'0');
29
else
30
clk_div_counter<=clk_div_counter+1;
31
clk_149hz<='0';
32
endif;
33
endif;
34
endprocessclk_div;
35
36
led_shift:process(clk_149hz)
37
begin
38
ifclk_149hz='1'andclk_149hz'eventthen
39
ledTMP<=ledTMProl1;
40
endif;
41
endprocessled_shift;
42
43
LEDS<=ledTMP;
44
endBehavioral;
hattest du das ganze mal simuliert? ich kann dir da nur modelsim
empfehlen(kenne nur das)
dann sieht man schon eher wo es hakt.
achso:
Clock z.b. muss eigentlich nie std_logic sein, sondern immer bit!
Desweiteren ist es wichtig ein ResetBit zu haben. Zu Anfang gibt es ja
keinen definierten Zustand, sondern alles hängt irgendwie in der Luft
rum
@Axel Preuss: Also auf der Uni haben wir nur std_logic Typen verwendet
und in der Arbeit habe ich in inzwischen einigen 10k Zeilen VHDL Source
Code von unseren Leuten, Zulieferern oder auch einfach wenn man so im
Netz schmökert nie bit oder bit_vector gesehen. Diesen Datentyp sehe ich
eigentlich immer nur in Büchern.
Was ist die Begründung dafür, dass man bit und bit_vector verwenden
soll?
moin,
wenn ich std_logic benutze ohne das es einen Grund dafür gibt, dann
kriege ich das von meinem Prof. um die Ohren geknallt. :)
Wie ich schon sagte, ich bin nicht so der VHDL Crack um das beurteilen
zu können, aber evtl. ist bit_vector ne Ecke resourcenschonender??
Auf nem Mikrocontroler verwende ich ja auch nur Variablen mit dem
kleinst möglichen Wertebereich und benutze nicht für alles long oder
float, obwohl das natürlich genauso gehen würde.
Aber vielleicht sagt da auch jemand was zu der mehr Ahnung von VHDL hat,
was da sinnvoll ist.
Eigentlich verwendet niemand im FPGA-Design bit oder bit_vector, nicht
zuletzt weil die U und X-Zustände in der Simulation sehr nützlich sind.
Direkt mit std_logic_vector zu rechnen (mit Hilfe von
std_logic_(un)signed) ist kein guter Stil, dafür gibt es die Typen
signed und unsigned (siehe Rechnen in VHDL).
Auf die Ressourcen kann es nicht ankommen, am Schluss landet ein
Clock-Signal typischerweise eh im Clock-Netzwerk.
Ich schaue mir grad den Draft für die Konventionen für synthetisierbares
VHDL durch, da steht:
"The allowed types for clock signals shall be: BIT, STD_ULOGIC and their
subtypes (e.g. STD_LOGIC) with a
minimum subset of '0' and '1'. Only the values ‘0’ and ‘1’ from these
types shall be used in expressions representing
clock levels and clock edges (See 6.1.2)."
Insofern kann man argumentieren, dass man es bei std_logic leichter
falsch machen kann, als bei zb bit, weil man da auch ein 'H' in der
Clock haben könnte.
Eine eigene Frage?
Dieser Thread ist über 18 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.