Hi Leute,
versuche hier ein erstes Programm zum laufen zu bringen.
Mein Ziel ist es eine 8 bit Zahlenfolge immer um eine Stelle nach links
zu shiften. Dafür suchte ich mir den Befehl sll raus im folgenden sehr
ihr mein Programm, nur leider bekomme ich noch einige Fehlermeldung:
Ah, sorry ...
der bit_vector zahl hat Elemente von 7 downto 0.
Wenn du
zahl := zahl(6 downto 0) & '0';
schreibst, dann passiet das:
zahl(7) := zahl(6);
zahl(6) := zahl(5);
zahl(5) := zahl(4);
zahl(4) := zahl(3);
zahl(3) := zahl(2);
zahl(2) := zahl(1);
zahl(1) := zahl(0);
zahl(0) := '0';
Das & hängt hinten an den Vector einfach noch eine '0' ran, damit die
Größe wieder passt.
Die Zeile wird in deinen Prozess statt dem "zahl ssl 1" reingeschrieben.
MfG
Thomas Pototschnig
Auch das ist kein Problem:
"zahl ssl 1" ist also zahl um eins nach links geschoben, diesen Wert
musst du aber jetzt auch noch irgendetwas zuweisen, so steht er einfach
nur in der Gegend rum, also z.B.
geschobene_zahl <= zahl ssl 1
Nimm am besten ein signal statt variable, Variablen benutzt man nur fuer
Zwischenergebnisse in einem Prozess um sich Schreibarbeit zu sparen.
Ausserdem: Du hast ja schon einen Port nahmens zahl, dann darf kein
Signal ebenfalls den Namen zahl tragen!
>signalzahl:bit_vector:="10010110";--Signal zahl is not
2
>constrained.
3
4
signalzahl:bit_vector(7downto0):="10010110";
Zu dem zweiten Fehler kann ich nichts genaues sagen, weil ich sll eben
noch nie verwendet hab. Aber evtl gehts nur mit integer oder man muss
noch was anderes USEn.
MfG
Thomas Pototschnig
> ich muss es zwecks Uni
Sag deinem Lehrer mal, dass diese Libs
> use IEEE.STD_LOGIC_ARITH.ALL;> use IEEE.STD_LOGIC_UNSIGNED.ALL;
nicht mehr Stand der Zeit sind.
Heutzutage nimmt man die
> use IEEE.NUMERIC_STD.ALL;
Und sowas gibt auch nur an Instituten:
> ... bit_vector ...
Wenn du als Ausgangsport einen STD_LOGIC_VECTOR hast,
warum nicht auch zur Berechnung?
1
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
useIEEE.STD_LOGIC_ARITH.ALL;
4
useIEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
entityshiftis
7
Port(CLOCK:inSTD_LOGIC;
8
zahlergebnis:outSTD_LOGIC_VECTOR(7downto0));--Meine 8 bit
> versuche hier ein erstes Programm zum laufen zu bringen.
Du bekommst auf einem FPGA kein Programm zum laufen (es sei denn, du
implementierst einen CPU-Core).
Sondern du versuchst zum ersten Mal Hardware_zu_beschreiben.
> Sondern du versuchst zum ersten Mal Hardware_zu_beschreiben.
Jep danke für den Hinweis, ist natürlich richtig
Danke an Lothar Miller habe deine Hinweise berücksichtig, jetzt hab ich
nur noch einen Fehler
1
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
useIEEE.NUMERIC_STD.ALL;
4
5
6
7
entityshiftis
8
Port(
9
10
CLOCK:inSTD_LOGIC;
11
zahlergebnis:outSTD_LOGIC_VECTOR(2downto0));--Meine 3 bit
12
13
endshift;
14
15
16
architectureBehavioralofshiftis
17
begin
18
19
process(CLOCK)
20
21
signalzahl:STD_LOGIC_VECTOR(2downto0)<="100";
22
begin
23
24
ifCLOCK='1'andCLOCK'eventthen--steigende Flanke
25
26
27
zahlergebnis<=zahlsll1;--zahl shiften um 1 nach links
--vhdl 87
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity shift is
Port ( CLOCK : in STD_LOGIC;
zahlergebnis : out STD_LOGIC_VECTOR (7 downto 0)); --Meine 8
bit
end shift;
architecture Behavioral of shift is
signal zahl :STD_LOGIC_VECTOR(7 downto 0) := "10010110"; --Bereich
angeben.
begin
process (CLOCK)
begin
if rising_edge(CLOCK) then --steigende Flanke
-- zahlergebnis <= zahl sll 1; -- kann man bit_vectoren shiften?
zahlergebnis (0)<= zahl (7);
zahlergebnis (7 downto 1)<= zahl (6 downto 0);
end if;
end process;
end Behavioral;
Marco M. wrote:
> jetzt hab ich nur noch einen Fehler
Nur noch einen syntaktischen Fehler vielleicht...
Aber:
1
process(CLOCK)
2
signalzahl:STD_LOGIC_VECTOR(2downto0)<="100";
3
begin
4
ifCLOCK='1'andCLOCK'eventthen--steigende Flanke
5
zahlergebnis<=zahlsll1;--zahl shiften um 1 nach links
6
endif;
7
endprocess;
Da wird gar nichts geschoben, nur wiederholt um 1 Bit versetzt geladen.
Du lädst bei jeder Taktflanke den Startwert von "zahl" erneut um eins
geschoben in "zaehlergebnis". "zahl" selbst wird nicht verändert.
> Da wird gar nichts geschoben, nur wiederholt um 1 Bit versetzt geladen.> Du lädst bei jeder Taktflanke den Startwert von "zahl" erneut um eins> geschoben in "zaehlergebnis". "zahl" selbst wird nicht verändert.
Genau das will ich doch, eine Variable nach und nach verschieben und in
eine andere Abspeichern und mir dann ausgeben (weiss ich auch nicht wie
ich das machen sol :-))
Zu abderahim:
Danke für deine Hilfe, aber ich muss schon den Operator sll benutzen!
Leider gibts dazu auch keine Beispiele im Netz.
MFG
> Ein Tipp: schenk dir zu Weihnachten das Buch "VHDL-Synthese" -> Reichhardt/Schwarz - ISBN 3486581929.
Genau das hab ich AUflage 4 !
ABer da steht nichts drin über srl und sll :-(
Marco M. wrote:
>> Reichhardt/Schwarz - ISBN 3486581929.> Genau das hab ich AUflage 4 !> ABer da steht nichts drin über srl und sll :-(
Richtig, weils in der alltäglichen harten Praxis keiner verwendet :-/
Lothar Miller wrote:
> Ein Tipp: schenk dir zu Weihnachten das Buch "VHDL-Synthese" -> Reichhardt/Schwarz - ISBN 3486581929.
Wird gemacht ;-)
Ich wollte das Buch schon lange mal beschaffen.
Lothar, was hast du sonst noch für hilfreiche VHDL Literatur auf dem
Schreibtisch liegen? Die Bücher, die im Schrank stehen bleiben,
interessieren mich weniger ;-)
Hallo,
das shiften mit sll oder srl funktioniert nur mit bit_vector
wenn das Signal zahl also bit_vector ist, und es funktioniert.
musst du das ganze noch in std_logic_vector konvertieren!
so dürfte es gehen:
....
zahl <= zahl sll 1 ;
zahlergebnis <=to_stdlogicvector (zahl) ;
.....
gruß
Hallo, mein Compiler findet die sll nicht, scheinbar hab ich nicht die
richtige lib eingebunden. In welcher lib. ist denn die funktion zu
finden?
Vielen Dank.
Thomas Pototschnig schrieb:>> der bit_vector zahl hat Elemente von 7 downto 0.> Wenn du> zahl := zahl(6 downto 0) & '0';> schreibst, dann passiet das:> zahl(7) := zahl(6);> zahl(6) := zahl(5);> zahl(5) := zahl(4);> zahl(4) := zahl(3);> zahl(3) := zahl(2);> zahl(2) := zahl(1);> zahl(1) := zahl(0);> zahl(0) := '0';>> Das & hängt hinten an den Vector einfach noch eine '0' ran, damit die> Größe wieder passt.>> Die Zeile wird in deinen Prozess statt dem "zahl ssl 1" reingeschrieben.
Wie müsste ich das schreiben wen ich anstatt sll, srl machen will?