Hi Leute,
ich bin leider noch etwas neu auf dem Gebiet VHDL. Ich versuche gerade
einen Pseudozufallsgenerator zu programmiern. Ich denke mein Code müsste
auch soweit funktionineren nur tut mir der Kompiler immer die Leitungen
weg optimieren. Er sagt sie würden nicht verwendet werden, aber ich habe
sie immer in der PORT MAP verwendet. Ich versteh einfach net was ich
falsch mache. :-(
So möchte ich hier gerne zwei Fragen stellen:
1.)
Hier sind mal die warnings die kommen:
WARNING:Xst:646 - Signal <s_intern<0>> is assigned but never used. This
unconnected signal will be trimmed during the optimization process.
WARNING:Xst:1290 - Hierarchical block <N_1_Stufen[0].G0.G0> is
unconnected in block <e_test_maschine>.
It will be removed from the design.
WARNING:Xst:1290 - Hierarchical block <N_1_Stufen[1].GN_2.G0> is
unconnected in block <e_test_maschine>.
It will be removed from the design.
WARNING:Xst:1290 - Hierarchical block <N_1_Stufen[2].GN_2.G0> is
unconnected in block <e_test_maschine>.
It will be removed from the design.
WARNING:Xst:1290 - Hierarchical block <N_1_Stufen[3].GNN.G_0> is
unconnected in block <e_test_maschine>.
It will be removed from the design.
Ich werde den Code mal im Anhang einfügen. Leider führten meine
bisherigen Ideen nicht zum Erfolg. Vielleicht weiß hier jemand warum die
Leitungen wegoptmiert werden. Ich komme so leider nicht weiter :-(
2.) Vielleicht kann mir noch einer verraten, wie ich eine Konstante für
alle Entitys deklarieren kann. So könnte ich dann mein Schieberigister
und den Rest des Programms über eine Konstante steuern und bestimmen
wieviele Bit es breit ist.
Ich danke schon mal fürs lesen.
Grüße Wisler
Wisler Electronics schrieb:> Ich denke mein Code müsste> auch soweit funktionineren nur tut mir der Kompiler immer die Leitungen> weg optimieren. Er sagt sie würden nicht verwendet werden, aber ich habe> sie immer in der PORT MAP verwendet. Ich versteh einfach net was ich> falsch mache. :-(
Die Tools sind einfach so intelligent, dass sie immer schauen, ob alle
Signale tatsächlich genutzt werden. Wenn sie nicht verbunden oder
konstant sind, werden sie wegoptimiert, um Ressourcen zu sparen. In
99,9% der Fälle tun die Tools das richtige wenn man sich alles genau
anschaut.
Grüße,
Anguel
Die erste Warning ist offensichtlich zutreffend. Bei den anderen nehme
ich stark an, dass da in der Generate-Wüste irgendein Index-Offset
falsch ist, bin jetzt zu faul, das im Kopf einzusetzen ;) Jedenfalls
liegt das nahe, wenn schon s_intern(0) so ziellos ist...
> IF (RESET = '1') THEN --asynchroner Reset
Wenn du schon Xilinx Bausteine verwendest, dann lies mal das WP272.
Was ist denn das für ein unglaublich umständlicher Code?
Mußt du das so machen? Oder hast du das einfach so gelernt?
Ein generisches Schieberegister in VHDL sieht so aus:
1
process (clk) begin
2
if rising_edge(clk) then
3
if shift_enable='1' then
4
reg <= reg(reg'left-1 downto 0) & neues_bit;
5
end if;
6
end if;
7
end process;
Oder kürzer (aber genau gleich) so:
1
process begin
2
wait until rising_edge(clk);
3
if shift_enable='1' then
4
reg <= reg(reg'left-1 downto 0) & neues_bit;
5
end if;
6
end process;
Oder noch kürzer und concurrent/nebenläufig/ohne Prozess:
1
reg <= reg(reg'left-1 downto 0) & neues_bit when rising_edge(clk) and shift_enable='1';
Zuerst einmal danke für die Hilfen, aber weiter gekommen bin ich jetzt
leider noch nicht.
@Anguel S.
Ja das denke ich mir, dass die Tools immer 99,9% das richtige machen.
Deshalb wollte ich einfach mal hier was posten und sehen ob ich
vielleicht einen Denkfehler habe und man das bei VHDL nicht so machen
kann oder darf.
@Georg A.
Hier nochmal die Codezeilen, wo die Warnings kommen. Ich denke schon,
dass s_intern(0) vergeben habe, aber irgendwie sagt der Compiler es wäre
überflüssig un schmeißt sie weg. :-( Siehe die siebte Zeile in dem Code
unten.
@Lothar Miller
Naja irgendwie haben wir das schon so gelernt. :-( Wir sollen eigentlich
immer in Blöcken denken. Da habe ich mir gedacht baust du die ein D-Flip
Flop und dann kannst du es N - mal verwenden und baust dir ein N-Bit
Schieberegister auf. Das funktioniert bis jetzt auch ganz gut. Ich
finde, aber auch dass es so sehr mühsam ist zu programmieren und man
muss immer genau überlegen wie man was macht.
Naja das mit dem Reset wollte ich eigentlich schon asynchron zum Takt
haben. Ist das schlimm oder was meinst du mit der ersten Zeile?
Dein Schieberegister ist natürlich sehr viel kürzer wie meins, nur ich
versteh noch nicht ganz was die Zeile macht:
1
reg<=reg(reg'left-1downto0)&neues_bit;
Das ist doch einfach ein Bit verschieben oder?
Ich hoffe vielleicht kann mit jetzt einer besser helfen, bin halt leider
noch nicht so ganz vertraut mit VHDL. Ich denke da braucht man sehr
lange bis man wirklich mal viel damit machen kann.
Die Konstante global zu machen, wäre für mich schonmal ein Anfang. :-)
So ich habe den Fehler gefunden. Es tut mir leid, aber ich habe wohl
eine Leitung vergessen zu verbinden. Gibt es den keine leichtere
Möglichkeit Blöcke miteinander zu verbinden ohne den Generate Befehl. Da
kann man ja leicht mal durcheinander kommen.
Aber das Problem mit der Konstanten habe ich immer noch :-(
Wie kann ich den eine Konstante deklarieren, dass Sie für alle Entitys
verfügbar ist und ich nicht in jeder Entity sie einzeln deklarieren
muss.
> Ich denke schon, dass s_intern(0) vergeben habe, aber> irgendwie sagt der Compiler es wäre überflüssig un schmeißt sie weg.
Als Ausgang schon, aber welche der anderen Zeilen hat es als Eingang?
> Gibt es den keine leichtere Möglichkeit Blöcke miteinander> zu verbinden ohne den Generate Befehl?
Jein. Ein F*ckup kommt bei dir schon mal daher, dass du die Sonderfälle
vom Anfang und Ende in die Forschleife reinsteckst und nochmal
(zwangsweise) mit if verknüpfst. Das ist doch völlig überflüssig. Die
kann man ohne generate instanziieren (bei nn>=2).
Wisler Electronics schrieb:> Aber das Problem mit der Konstanten habe ich immer noch :-(> Wie kann ich den eine Konstante deklarieren, dass Sie für alle Entitys> verfügbar ist und ich nicht in jeder Entity sie einzeln deklarieren> muss.
Ich bastele mir ein Package z.B. so:
Zuerst einmal Danke für euere Antworten es hat super geklappt. Doch eine
Frage hätte ich noch zu VHDL.
Und zwar bin ich gerade dabei einen Zähler zu bauen, der Funktioniert
auch wunderbar, da ich aber das Ausgangssignal also den Zählerstand
nicht brauche habe ich es in einer Variablen rechnen lassen. Um es so
dem Übergeordneten Block nicht übergeben zu müssen.
Dies geht doch auch oder? Gibt es da noch eine andere Möglichkeit?
Ausserdem kann ich mit dem Zähler einen Anfangswert laden. Doch hier
scheitere ich. Ich weiß nicht wieso der Comiler mir das Signal immer als
Warning bringt. Ich weiße ihm einen Konstanten Wert zu. Dies mache ich
in einem Übergeordneten Modul/Block. Doch hier geht es wohl irgendwie
nicht. Vielleicht kann mir einer erklären woran das liegt. Also ich
verstehe dich Sprache VHDL noch nicht wirklich, da fand ich den Einstieg
in C irgendwie leichter. :-(
1
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
useIEEE.STD_LOGIC_ARITH.ALL;
4
useIEEE.STD_LOGIC_UNSIGNED.ALL;
5
useIEEE.NUMERIC_STD.ALL;
6
7
entitye_mainis
8
PORT(clk_50MHz:INstd_logic);
9
ende_main;
10
11
architecturea_mainofe_mainis
12
13
componente_timer_no_out
14
GENERIC(NN:integer);
15
Port(Clk:inSTD_LOGIC;--Takteingang
16
Rst:inSTD_LOGIC;--Reset
17
--ZZ : out STD_LOGIC_VECTOR (NN-1 downto 0);-- Zählerstand
Wisler Electronics schrieb:> Um es so dem Übergeordneten Block nicht übergeben zu müssen.> Dies geht doch auch oder?
Schon, aber...
> Gibt es da noch eine andere Möglichkeit?
Mach den Zähler besser als Signal, wenn du das Verhalten von Variablen
noch nicht kannst. Du MUSST ja nicht alle Signale auch über den Port der
Entity nach "oben" geben...
Beitrag "Variable vs Signal"Wisler Electronics schrieb:> elsif(clk'event AND clk='1')then --Taktsynchrones Umfeld
Warum, frage ich mich, schreibt das eigentlich alle Welt so umständlich
(und eigetnlich auch falsch)? Es gibt doch die elegante Funktion
rising_edge()...
Wisler Electronics schrieb:> use IEEE.STD_LOGIC_ARITH.ALL;> use IEEE.STD_LOGIC_UNSIGNED.ALL;> use IEEE.NUMERIC_STD.ALL;
Nein, bitte nicht schon wieder...
Siehe den Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"
Und einige mehr...