Hallo Leute, ich wollte mir ein Dekadenzähler in VHDL schreiben der von -9 bis 9 zählen sollte, die Hochzählung funktioniert ohne Probleme, aber wenn der Zähler runter zählen sollte da funktioniert es nicht so wie ich das mir gedacht habe: wenn der Zähler von 0 runter zählen sollte, dann zählt er nicht 0, -9, -8, -7..., sondern 0, -1, -2, -3,... Was mache ich da falsch? library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; ------------------------------------------------- entity up_down_counter is port( up_down : in std_logic; count : in std_logic; reset : in std_logic; output : out std_logic_vector (4 downto 0); overflow_up : out std_logic; overflow_down : out std_logic ); end up_down_counter; ------------------------------------------------- architecture verhalten of up_down_counter is signal temp : signed (4 downto 0) := "00000"; signal temp_1 : integer range -10 to 10 := 0; begin P1: process (reset, up_down, count, temp_1) begin if reset = '1' then temp_1 <= 0; elsif temp_1 > 9 then temp_1 <= 0; elsif temp_1 < -9 then temp_1 <= 0; elsif count = '1' and count'event then if up_down = '1' then temp_1 <= temp_1 + 1; else temp_1 <= temp_1 - 1; end if; end if; end process P1; temp <= to_signed(temp_1, temp'length); ------------------------------------------------- ------------------------------------------------- overflow_up <= '1' when (temp_1 = 9 and up_down = '1') else '0'; overflow_down <= '1' when (temp_1 = 0 and up_down = '0') else '0'; ------------------------------------------------- output <=(std_logic_vector(temp)); ------------------------------------------------- end verhalten;
Vorname Nachname schrieb: > if up_down = '1' then > temp_1 <= temp_1 + 1; > else > temp_1 <= temp_1 - 1; Naja, warum sollte er denn da was anderes machen? Wenn er den Bitvektor als Zahl nach dem normalen Signed Integer Zahlenformat interpretiert passiert das.
vielen Dank für den Antwort, aber ich habe nicht ganz verstanden was Sie meinen, ich bin relativ neu in der VHDL...
Vorname Nachname schrieb: > wenn der Zähler von 0 runter zählen sollte, dann zählt er nicht 0, -9, > -8, -7..., sondern 0, -1, -2, -3,... Die nächste Zahl nach 0 ist -1. So lernt man das in der Schule: ...-3,-2,-1,0,1,2,3... Und dann das selbe rückwärts: 3,2,1,0,-1,-2,-3,... Das stimmt also alles. > dann zählt er nicht 0, -9, -8, -7..., Das wäre ja auch ein ganz seltsamer Zähler, der so zählt... > aber wenn der Zähler runter zählen sollte da funktioniert es nicht so > wie ich das mir gedacht habe: Du denkst anders als alle Anderen. Noch ein Wort zu deiner Beschreibung:
1 | P1: process (reset, up_down, count, temp_1) |
2 | begin
|
3 | if reset = '1' then |
4 | temp_1 <= 0; |
5 | elsif temp_1 > 9 then |
6 | temp_1 <= 0; |
7 | elsif temp_1 < -9 then |
8 | temp_1 <= 0; |
9 | elsif count = '1' and count'event then -- huch! hier kommt ein versteckter Takt |
10 | if up_down = '1' then |
11 | temp_1 <= temp_1 + 1; |
12 | else
|
13 | temp_1 <= temp_1 - 1; |
14 | end if; |
15 | end if; |
16 | end process P1; |
Wo hast du diesen Beschreibungsstil gesehen oder gelernt? Man macht keine asynchronen kombinatorischen Resets. Das geht in der Praxis schief weil es dort bei kombinatorischen Übergängen Glitches gibt. Ich würde dir (neben der Verwendung einer leserlichen Formatierung!!) sowas vorschlagen:
1 | P1: process (reset, count) |
2 | begin
|
3 | if reset = '1' then -- muss das sein? |
4 | temp_1 <= 0; |
5 | and count'event then -- zuerst kommt der Takt |
6 | overflow_up <= '0'; |
7 | overflow_down <= '0'; |
8 | if count='1' then |
9 | if up_down = '1' then -- hochzählen |
10 | if temp_1 = 9 -- Überlauf! |
11 | temp_1 <= -9; -- so läuft der Zähler richtig über! |
12 | overflow_up <= '1'; |
13 | else
|
14 | temp_1 <= temp_1 + 1; |
15 | end if; |
16 | else -- runterzählen |
17 | if temp_1 = -9 -- Unterlauf! |
18 | temp_1 <= 9; -- so läuft der Zähler richtig über! |
19 | overflow_down <= '1'; |
20 | else
|
21 | temp_1 <= temp_1 - 1; |
22 | end if; |
23 | end if; |
24 | end if; |
25 | end if; |
26 | end process P1; |
Simuliere diese Beschreibung einfach mal...
:
Bearbeitet durch Moderator
Lothar Miller schrieb: > Wo hast du diesen Beschreibungsstil gesehen oder gelernt? Nirgendwo, ich bin ein Anfänger und lerne aus Büchern. Ich versuche selbst das VHDL-Code für mein Vorhaben zu entwickeln und dann vergleiche ich mit eine richtige schreibweise und korrigiere Fehler (falls welche gibt) > Man macht keine asynchronen kombinatorischen Resets. Das geht in der > Praxis schief weil es dort bei kombinatorischen Übergängen Glitches > gibt. Interessante Information in dem Buch steht so was nicht, ich weiß nicht ob Sie der Autor von der Seite http://www.lothar-miller.de sind, aber da habe ich erklährung für Ihre Anmerkung gefunden. > Simuliere diese Beschreibung einfach mal... Ist die Beschriebung richtig weil der Quartus gibt mir ein Haufen Fehler raus? > and count'event then diese Schreibweise akzeptiert er nicht, ich dachte dass die Takterkennung so beschrieben wird: count = '1' and count'event then > if up_down = '1' then -- hochzählen > if temp_1 = 9 -- Überlauf! > temp_1 <= -9; -- so läuft der Zähler richtig über! Da habe ich ein verständnisproblem: wenn der Zählerstand von temp_1 die 9 erreicht hat, dann wird dem tepm_1 sofort die -9 zugewiesen, oder ist das Zeichen "<=" in diesem Fall als Vergleichsoperator zu verstehen, dann vestehe ich die Logik trotzdem nicht?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.