Hallo Ihr!
ich habe heute Nachmittag kein Eis gegessen, sondern mich mit 7-Segment
Displays herumgeschlagen. Als vhdl Neuling ergaben sich Fragen und
Probleme bei denen ihr mir vielleicht helfen mögt. Ich hänge den Code
mit meinen Fragen als Kommentar hinten an. Ich kann mir denken, daß
dererlei Fragen langsam allen aus dem Hals heraushängen erbitte dennoch
Geduld.
1
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
useIEEE.NUMERIC_STD.ALL;
4
5
entitySevenSeg_vhdis
6
Port(clk:inSTD_LOGIC;
7
dat:inSTD_LOGIC_VECTOR(15downto0);
8
segments:outSTD_LOGIC_VECTOR(6downto0);
9
anodes:outSTD_LOGIC_VECTOR(3downto0));
10
endSevenSeg_vhd;
11
12
architectureBehavioralofSevenSeg_vhdis
13
--ist es richtig, daß ich für solche Zähler integer verwenden sollte?
14
signalanode_cnt:integerrange0to3:=0;
15
signalbcd_val:STD_LOGIC_VECTOR(3downto0);
16
begin
17
18
--Ist es wirklich so, daß ich bei einem integer range 0..3 den Überlauf
19
--"zu Fuß" machen muss, oder läuft der zu Null über?
20
anode_selector:process
21
begin
22
waituntilrising_edge(clk);
23
ifanode_cnt<3then
24
anode_cnt<=anode_cnt+1;
25
else
26
anode_cnt<=0;
27
endif;
28
endprocessanode_selector;
29
30
segment_mux:process
31
begin
32
waituntilrising_edge(clk);
33
--nehme ich die Auswahl der Anode in den wait until mit auf, ich bin etwas
34
--eingeschüchtert, weil es heißt, ALLES vom Takt zu steuern.
35
anodes<=(others=>'0');
36
anodes(anode_cnt)<='1';
37
--lässt sich der case (so integer für anode_cnt korrekt war) anders schreiben
38
--und vor ALLEM: warum ergibt das den Fehler
39
--'type conversion of type std_logic_vector) is an unconstrained array.'
> --ist es richtig, daß ich für solche Zähler integer verwenden sollte?> signal anode_cnt : integer range 0 to 3 := 0;
Nein, ich würde hier unsigned benutzen. Dann brauchst du nur unten
einmal eine Konversion.
> --Ist es wirklich so, daß ich bei einem integer range 0..3 den Überlauf> --"zu Fuß" machen muss, oder läuft der zu Null über?
Ja. Bei einem unsigned(1 downto 0) ist er natürlich "kostenlos" dabei.
> wait until rising_edge(clk);> --nehme ich die Auswahl der Anode in den wait until mit auf, ich bin> etwas> --eingeschüchtert, weil es heißt, ALLES vom Takt zu steuern.
Nein, die Zuweisung soll immer, mit jeder Taktflanke stattfinden.
> anodes <= (others=>'0');> anodes(anode_cnt) <= '1';
Hier bräuchtest du dann die Konvertierung zu integer, also
anodes(to_integer(anode_cnt))...
> --lässt sich der case (so integer für anode_cnt korrekt war) anders> schreiben> --und vor ALLEM: warum ergibt das den Fehler> --'type conversion of type std_logic_vector) is an unconstrained array.'> case( std_logic_vector(to_unsigned(anode_cnt, 2)) ) is
Die Fehlermeldung verstehe ich ad hoc gerade nicht. Das to_unsigned()
kann man sich dann auch sparen.
> when "00" => bcd_val<=dat(3 downto 0);> when "01" => bcd_val<=dat(7 downto 4);> when "10" => bcd_val<=dat(11 downto 8);> when others => bcd_val<=dat(15 downto 12);> end case;> end process segment_mux;>> Wenn das alles mal funktioniert und ich das Modul woanders benutze,> kann ich dann jederzeit dat aktualisieren, oder sollte man das in ein> internes FF speichern, wenn gerade ein neuer Zyklus bei anode 0 beginnt?> Also damit alle Stellen für ein und dieselbe 16-bit Zahl angezeigt> werden.
Das durchschalten der einzelnen Segmente passiert in der Regel ja sehr
schnell, so dass man keinen Unterschied sehen wird - das von dir
beschriebene Verhalten hast du ja in jedem Fall: Wenn die ersten beiden
Segmente schon geändert sind haben die restlichen ja trotzdem noch
kurzzeitig den alten Wert.
> Habe ich noch etwas vergessen oder sinnentleert gemacht?
Ich würde empfehlen, die Zuweisung an segements synchron zu machen. Du
beschreibst ja einen Multiplexer der etwas Logik benötigt um das
Ergebnis zu berechnen. Hier gibst du das Ergebnis ja direkt auf LEDs
aus, da spielt das keine Rolle. In anderen Fällen könnte es ohne
Register aber zu timing Problemen kommen, weil die Berechnung einige
Zeit dauert und zusätzlich noch die Zeit bis zur Ausgabe durch
Laufzeiten unterschiedlich ist.
Ich danke euch vielmals - solche Hilfe ist doch hilfreich. Möglichst
viel an Denkweisen und Schreibweisen kennenlernen ist doch optimal wenn
man keine Vorlesung mit Menschen im Rücken hat.
Ich werde sacken lassen und mich bei Problemen später nochmals melden.
Darf ich euch noch mals um Hilfe bitten?
Ich habe die Anzeige prima hinbekommen. In einer entity an einen Zähler
gehängt etc. pp. Nun dachte ich versuche mich an der component
Schreibweise da geht ja ohnehin kein Weg dran vorbei.
Klappt aber leider nicht und ich kann das Problem nicht finden. Ich habe
die Mux-Zeit für die Segmente und die Zählgeschwindigkeit zu hoch für
das Testboard - das habe ich gemacht, in der Hoffnung beim Simulieren
etwas zu finden. Außer daß die Segmente durchdrehen kann ich aber nichts
daraus ziehen :-(
Vielleicht darf man bei dem port map keine umwandlung in
std_logic_vector(unsigned) machen?
Vielleicht kann mir ja einer meinen Fehler erklären.
> Vielleicht darf man bei dem port map keine umwandlung in> std_logic_vector(unsigned) machen?
Ob daran was ist, das kannst du ja leicht selber ausprobieren. Einfach
ein signal std_logic_vector definieren und das als Übergabeschnittstelle
verwenden. Aber wenn der Fehler da wäre, hätte die Synthese dir schon
eine Warnung ums Ohr gehauen...
Was ist deine Taktfrequenz?
Was die Zielplattform?
Welche Toolchain?
Grausam das alles, mir fiel jetzt folgende Warnung auf:
"Due to other FF/Latch trimming, FF/Latch <bcd_val_14> (without init
value) has a constant value of 0 in block <SevenSeg_vhd>. This FF/Latch
will be trimmed during the optimization process."
Also scheint da grob was nicht zu stimmen? Und vor allem ist doch
bcd_val nur 4 bits lang wie kommt da _14 etc zustande? Die _14 kann man
nämlich durch _4..._14 ersetzen?
Ich denke nich sollte wenigstens den Zwischenstand verkünden:
Ich konnte gesten Abend noch wenigstens ein Problem im Zusammenhang mit
der wirren Anzeige finden und zwar beim Auswählen der aktuellen Stelle -
falsche Transistoren :-(.
Es zeigt sich mir nur wieder a) Fehler können so(!) dämlich sein und an
ganz anderer Stelle stecken als vermutet und b) es ist wahrscheinlich
annährend aussichtslos für Andere so etwas in Form eines Forenposts zu
finden.
Von daher werde ich in Zukunft versuchen, meine Anfragen so zu
reduzieren, daß es auf allgemeine und ganz spezielle vhdl/fpga Fragen
reduziert wird, die ja einige wirklich erstklassig beantworten können.
schönen Tag an alle