Forum: FPGA, VHDL & Co. Counter läuft über Grenzen


von Christian Q. (osx)


Lesenswert?

Ich wollte einen Zähler implementieren aber habe komisches Verhalten: 
Wenn ich die Komponente mit der breite 4 benutze erwarte ich, dass 
stelle mit jedem Takt hochzählt bis es bei 3 wieder auf 0 gesetzt wird. 
Leider zählt er bis über 3 hinaus und ich finde die Ursache dafür nicht.
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
4
-- arithmetic functions with Signed or Unsigned values
5
use IEEE.NUMERIC_STD.ALL;
6
7
entity counter is
8
   generic (
9
    breite_i : integer := 1
10
   );
11
    Port ( clk_i : in  STD_LOGIC;
12
           reset_i : in  STD_LOGIC;
13
           out_o : out  STD_LOGIC_VECTOR(0 to breite_i-1));
14
end counter;
15
16
architecture Behavioral of counter is
17
  signal counter: STD_LOGIC_VECTOR(0 to breite_i-1) := (others => '0');
18
  signal stelle: integer range 0 to breite_i-1 := 0;
19
  signal desc: bit := '0';
20
begin
21
22
a: process (clk_i) is
23
begin
24
if rising_edge(clk_i) then
25
    if reset_i = '1' then
26
      counter <= (others => '0');
27
      stelle <= 0;
28
      desc <= '0';
29
    else
30
      if stelle >= (breite_i-1) then
31
        stelle <= 0;
32
        desc <= '1';
33
      elsif stelle = 0 then
34
        stelle <= 0;
35
        desc <= '0';
36
      end if;
37
      
38
      -- Hier soll weitere Logik folgen (und die Zuweisung auf counter), mit der Benutzung von desc. Aber erst muss das Zählen unter Einhaltung des Grenzen funktionieren.
39
      stelle <= stelle + 1;
40
      
41
      report "desc ist " & bit'image(desc) severity error;
42
      report "stelle ist " & integer'image(stelle) severity error;
43
    end if;
44
  end if;
45
end process;
46
47
out_o <= counter;
48
49
50
end Behavioral;
Die Ausgabe ist:
1
at 15 ns(1): Error: stelle ist 0
2
at 25 ns(1): Error: stelle ist 1
3
at 35 ns(1): Error: stelle ist 2
4
at 45 ns(1): Error: stelle ist 3
5
at 55 ns(1): Error: stelle ist 4
6
at 65 ns(1): Error: stelle ist 5
7
at 75 ns(1): Error: stelle ist 6
8
at 85 ns(1): Error: stelle ist 7
Kann jemand erklären wo das Problem liegt?

: Bearbeitet durch User
von Duke Scarring (Gast)


Lesenswert?

Christian Q. schrieb:
> ich finde die Ursache dafür nicht
Bei mir ist 2^4 = 16.
Wenn er nur von 0 bis 3 zählen soll, reichen auch zwei Bit als 
Zählerbreite.

Duke

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Christian Q. schrieb:
> stelle <= stelle + 1;
In einem Prozess "gewinnt" die letzte Zuweisung an ein Signal. Und 
während des Prozesses behält das Signal seinen Anfangszeit. Deshalb 
zählt der Zähler einfach weiter.

Der vorhergehende Reset ist wird also einfach "überschrieben"... ?

: Bearbeitet durch Moderator
von Christian Q. (osx)


Lesenswert?

Die einfachste Lösung war es gerade Variablen für desc und stelle zu 
benutzen. Somit funktioniert der code, wie ich erwartet habe. Leider 
nicht synthetisierbar - wie ich es lösen kann nur mit Signalen sehe ich 
nicht.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Christian Q. schrieb:
> Leider nicht synthetisierbar
Warum nicht?

> wie ich es lösen kann nur mit Signalen sehe ich nicht.
1. Zähle zuerst hoch und mach dahinter deine Resetgeschichte.
Oder
2. Zähle in einem "else" hoch.

von Theor (Gast)


Lesenswert?

Bitte ändere den Code erstmal so, dass Du die zwei genannten Punkte 
berücksichtigst.

1. Zusammenhang zwischen Bitbreite und Wertebereich. Stichwort 
Logarithmus bzw. Potenz

2. Die letzte Zuweisunge gewinnt!

Dann zeige uns den Code mit einer minimalen Testbench, falls das Problem 
damit nicht gelöst ist.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Christian Q. schrieb:
>    elsif stelle = 0 then
>         stelle <= 0;
>         desc <= '0';
>    end if;
Bei diesem selbstverriegelnden "Hänger" könnte es ohne das nachfolgende 
Hochzählen sogar sein, dass die Toolchain die stelle und desc hart auf 0 
setzt und niemals ändert...

: Bearbeitet durch Moderator
von Christian Q. (osx)


Lesenswert?

Lothar M. schrieb:
>> Leider nicht synthetisierbar
> Warum nicht?
Soweit ich weiß sind Variablen nicht synthetisierbar.

Theor schrieb:
> 1. Zusammenhang zwischen Bitbreite und Wertebereich. Stichwort
> Logarithmus bzw. Potenz

Ich möchte einen "Zeiger" auf die aktuelle Stellen des counters haben, 
da dies eine Besonderheit des Zähleverhaltens ist, die sich somit gut 
lösen lässt.

Theor schrieb:
> 2. Die letzte Zuweisunge gewinnt!

Hier habe ich noch Probleme: Ich habe versucht stelle nur einmalig pro 
Durchlauf zu setzen, damit auch nur eine und somit die letzte Zuweisung 
gewinnen kann. Ich kann nicht im fall stelle = 0 die stelle erhöhen, da 
counter(stelle=0) gesetzt werden soll - andererseits muss ich stelle 
verändern damit er nicht in dem Zweig hängt bzw. immer wieder 
hineinläuft.
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
4
-- Uncomment the following library declaration if using
5
-- arithmetic functions with Signed or Unsigned values
6
use IEEE.NUMERIC_STD.ALL;
7
8
entity counter is
9
   generic (
10
    breite_i : integer := 1
11
   );
12
    Port ( clk_i : in  STD_LOGIC;
13
           reset_i : in  STD_LOGIC;
14
           out_o : out  STD_LOGIC_VECTOR(0 to breite_i-1));
15
end counter;
16
17
architecture Behavioral of counter is
18
  signal counter: STD_LOGIC_VECTOR(0 to breite_i-1) := (others => '0');
19
  signal stelle: integer range 0 to breite_i-1 := 0;
20
  signal desc: bit := '0';
21
begin
22
23
process (clk_i) is
24
begin
25
  if rising_edge(clk_i) then
26
    if reset_i = '1' then
27
      counter <= (others => '0');
28
      stelle <= 0;
29
      desc <= '0';
30
    else
31
      -- Richtung bestimmen
32
      if stelle > (breite_i-1) then
33
        stelle <= 0;
34
        desc <= '1';
35
        report "Richtungsänderung auf desc " severity error;
36
      elsif stelle = 0 then
37
        report "Richtungsänderung auf asc " severity error;
38
        desc <= '0';
39
        -- wenig sinnvoll, hier hakt es
40
        stelle <= stelle + 1;
41
      else
42
        stelle <= stelle + 1;
43
      end if;
44
      
45
      -- Bitmuster setzen
46
      if desc = '1' then
47
        -- löschen
48
        counter(stelle) <= '0';
49
      else
50
        -- setzen
51
        counter(stelle) <= '1';
52
      end if;
53
      
54
      report "stelle ist " & integer'image(stelle) severity error;
55
    end if;
56
  end if;
57
end process;
58
59
out_o <= counter;
60
61
end Behavioral;
1
LIBRARY ieee;
2
USE ieee.std_logic_1164.ALL;
3
 
4
-- Uncomment the following library declaration if using
5
-- arithmetic functions with Signed or Unsigned values
6
--USE ieee.numeric_std.ALL;
7
 
8
ENTITY counterTb IS
9
END counterTb;
10
 
11
ARCHITECTURE behavior OF counterTb IS 
12
    
13
    -- Component Declaration for the Unit Under Test (UUT)
14
 
15
    COMPONENT counter
16
   generic(breite_i : positive);
17
    PORT(
18
         clk_i : IN  std_logic;
19
         reset_i : IN  std_logic;
20
         out_o : OUT  std_logic_vector(0 to 3)
21
        );
22
    END COMPONENT;
23
24
   --Inputs
25
   signal clk_i : std_logic := '0';
26
   signal reset_i : std_logic := '0';
27
28
   --Outputs
29
   signal out_o : std_logic_vector(0 to 3);
30
31
   -- Clock period definitions
32
   constant clk_i_period : time := 10 ns;
33
34
BEGIN
35
 
36
  -- Instantiate the Unit Under Test (UUT)
37
   uut: counter 
38
    generic map ( breite_i => 4)
39
    PORT MAP (
40
          clk_i => clk_i,
41
          reset_i => reset_i,
42
          out_o => out_o
43
        );
44
45
   -- Clock process definitions
46
   clk_i_process :process
47
   begin
48
    clk_i <= '0';
49
    wait for clk_i_period/2;
50
    clk_i <= '1';
51
    wait for clk_i_period/2;
52
   end process;
53
 
54
55
   -- Stimulus process
56
   stim_proc: process
57
   begin
58
  
59
      reset_i <= '1';
60
    wait until rising_edge(clk_i);
61
    wait for 2 ns;
62
    assert(out_o = "0000") report "0. Reset hat falsche Initialausgabe" severity error;
63
    reset_i <= '0';
64
    
65
    wait until rising_edge(clk_i);
66
    wait for 2 ns;
67
    assert(out_o = "1000") report "1. ist nicht 1000" severity error;
68
    
69
    wait until rising_edge(clk_i);
70
    wait for 2 ns;
71
    assert(out_o = "1100") report "2. ist nicht 1100" severity error;
72
    
73
    wait until rising_edge(clk_i);
74
    wait for 2 ns;
75
    assert(out_o = "1110") report "3. ist nicht 1110" severity error;
76
    
77
    wait until rising_edge(clk_i);
78
    wait for 2 ns;
79
    assert(out_o = "1111") report "4. ist nicht 1111" severity error;
80
    
81
    wait until rising_edge(clk_i);
82
    wait for 2 ns;
83
    assert(out_o = "0111") report "5. ist nicht 0111" severity error;
84
    
85
    wait until rising_edge(clk_i);
86
    wait for 2 ns;
87
    assert(out_o = "0011") report "6. ist nicht 0011" severity error;
88
    
89
    wait until rising_edge(clk_i);
90
    wait for 2 ns;
91
    assert(out_o = "0001") report "7. ist nicht 0001" severity error;
92
    
93
    wait until rising_edge(clk_i);
94
    wait for 2 ns;
95
    assert(out_o = "0000") report "8. ist nicht 0000" severity error;
96
    
97
    wait until rising_edge(clk_i);
98
    wait for 2 ns;
99
    assert(out_o = "1000") report "9. ist nicht 1000" severity error;
100
    
101
    reset_i <= '1';
102
    wait until rising_edge(clk_i);
103
    wait for 2 ns;
104
    assert(out_o = "0000") report "10. Reset hat keine Wirkung" severity error;
105
    reset_i <= '0';
106
    
107
    report "Ende der TB" severity failure;
108
      wait;
109
   end process;
110
111
END;
1
at 15 ns(1): Error: Richtungsänderung auf asc 
2
at 15 ns(1): Error: stelle ist 0
3
at 25 ns(1): Error: stelle ist 1
4
at 35 ns(1): Error: stelle ist 2
5
at 45 ns(1): Error: stelle ist 3
6
at 55 ns(1): Error: Richtungsänderung auf desc 
7
at 55 ns(1): Error: stelle ist 4
8
INFO: Simulator is stopped.
stelle wird wieder größer als 3 und der Simulator schmiert wohl ab, beim 
Zugriff auf counter(4), was er jedoch nur mit "INFO: Simulator is 
stopped." kenntlich macht.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Christian Q. schrieb:
> der Simulator schmiert wohl ab
Der hat einfach nur angehalten....

> Soweit ich weiß sind Variablen nicht synthetisierbar.
Prinzipiell ging das schon immer...
Ob die Verwendung von Variablen sinnvoll ist, das kommt ganz auf die 
spezielle Anweisung an.
Siehe den Klassiker Beitrag "Variable vs Signal"

> at 15 ns(1): Error: Richtungsänderung auf asc
> at 15 ns(1): Error: stelle ist 0
> at 25 ns(1): Error: stelle ist 1
> at 35 ns(1): Error: stelle ist 2
> at 45 ns(1): Error: stelle ist 3
> at 55 ns(1): Error: Richtungsänderung auf desc
> at 55 ns(1): Error: stelle ist 4
> INFO: Simulator is stopped.
Warum textest du dir so den Bildschirm voll? Sieh doch einfach die 
Waveform an, dann kannst du den Verlauf und die Transitionen mit einem 
Blick erfassen.

: Bearbeitet durch Moderator
von Christian Q. (osx)


Lesenswert?

Lothar M. schrieb:
> Warum textest du dir so den Bildschirm voll? Sieh doch einfach die
> Waveform an, dann kannst du den Verlauf und die Transitionen mit einem
> Blick erfassen.

Das war als Hilfe für den interessierten Leser hier gedacht... hätte ich 
es nicht geschrieben hätte jemand gefragt wo denn das Problem sei.

: Bearbeitet durch User
Beitrag #5305362 wurde von einem Moderator gelöscht.
von Theor (Gast)


Lesenswert?

Also gut. Anhand der Asserts sieht man, was Du erwartest.

Das Signal 'stelle' soll wohl die jeweils in einem Takt zu verändernde 
Stelle in counter indizieren. Eine vollständige verbale Beschreibung 
solltest Du bei künftigen Aufgaben immer erstellen.

Es bleibt zum einen die Tatsache, dass Du berücksichtigen musst, dass 
immer die letzte Zuweisung Wirkung hat, aber auch eine andere, die sich 
gewissermaßen daraus ergibt: Nämlich, dass bei jedem erneuten 
Durchlaufen des Prozesses (wenn man das mal so betrachten will) der 
jeweils vorherige Wert eines Signal wirksam ist. Oder anders 
betrachtet, löst erst die Taktflanke eine Veränderung der Signale aus, 
und zwar im wesentlichen die Veränderung aller Signale gleichzeitig.

Du aber gehst augenscheinlich davon aus, dass etwaige im Text 
vorhergehende Zuweisungen in nachfolgenden schon geschehen sind.

An dieser Stelle muss man dann doch mal auf einen beliebten Fehler 
hinweisen. Mit VHDL beschreibst man Strukturen und keine Abläufe.

Ergo kannst Du das nicht so sehen, dass eine Sequenz von Anweisungen 
durchlaufen wird.

Etwas deutlicher wird das, wenn Du Dir mal die Register und 
Logikstruktur im RTL-Viewer anschaust.


Überlege Dir das bitte und versuche es dann noch einmal.

von Theor (Gast)


Lesenswert?

Noch eine Bemerkung: Es gibt verschiedene Punkte, die einen dazu 
verführen können, die Beschreibung einer Entity als die eines Vorganges 
zu betrachten. Ich weiß nicht, was es bei Dir konkret ist, aber hüte 
Dich davor, wie vor der heissen Herdplatte.

Habe möglichst immer das Bild vor Augen, wie bei der jeweiligen 
Taktflanke die jeweiligen Signale in dem Moment stehen, dass sie eine 
Logikschaltung durchlaufen und das das Zeit kostet, so das deren 
Veränderung immer erst nach dieser Zeit gültig sind.
Das gilt auch für Signale, die textlich (d.h. im VHDL-Code) nach aussen 
hin nicht sichtbar sind. Dennoch kann man sie als "rückgeführte" Signale 
in die Logik betrachten. Die brauchen auch Zeit, bis sie mit neuen 
Werten gültig sind.

von Christian Q. (osx)


Lesenswert?

Ich habe absolut keine Ahnung wie ich solch eine Logik anders 
beschreiben kann.

von Theor (Gast)


Lesenswert?

Christian Q. schrieb:
> Ich habe absolut keine Ahnung wie ich solch eine Logik anders
> beschreiben kann.

Das ist bedauerlich, aber ein Zustand dem Du abhelfen kannst.

Lies bitte meine zwei vorherigen Beiträge und folge den Ratschlägen, Dir 
eine verbale Beschreibung des Ablaufs und eine Skizze der Struktur zu 
erstellen. Schau Dir die Ausgabe des RTL-Viewers an, die sich aus Deinem 
obigen Code ergibt.

Dann stelle bitte gezielte Fragen zu dem was Du nicht verstehst.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Christian Q. schrieb:
> Ich habe absolut keine Ahnung wie ich solch eine Logik anders
> beschreiben kann.
Du musst zuerst wissen, was du willst und brauchst. Male dir eine (von 
mir aus auch virtuelle) Skizze bzw. einen Schaltplan. Und dann 
beschreibe mit der Beschreibungssprache VH-Description-Language das, was 
du da vor dir hast: ein Lauflicht.

Im FPGA selbst gibt es nur Flipflops und LUT/Logik, die miteinander 
verdrahtet werden. Jede deiner Beschreibungen muss dich auf diese 
Elemente abbilden lassen. Wenn es nicht klappt, dann gibt der 
Synthesizer Fehler aus.

Und wenn es geklappt hat sieh dir den RTL Schaltplan des Synthesizers an 
und versuche zu erkennen, wie deine Beschreibung in Hardware umgesetzt 
wird. Hat der Synthesizer deine Beschreibung verstanden und in die 
gewünschte Hardware umgesetzt?

Als Tipp: dieser Lernprozess braucht wochenlange Übung.

Nimm dir mal Zeile für Zeile das Blinklicht und das Lauflicht durch:
http://www.lothar-miller.de/s9y/archives/80-Hello-World!.html
http://www.lothar-miller.de/s9y/archives/61-Lauflicht.html
Spiele damit herum, ändere Kleinigkeiten und sieh, was passiert.

: Bearbeitet durch Moderator
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Christian Q. schrieb:
> Ich habe absolut keine Ahnung wie ich solch eine Logik anders
> beschreiben kann.
Ist dein Ziel das, was du da in der Waveform siehst?
Dann sieht die Lösung so aus: ein Zähler, der bei Erreichen des oberen 
Zählerwerts zurückgesetzt wird. Und ebenfalls bei Erreichen des oberen 
Zählerwerts wird das Flag umgeschaltet, das sagt, ob die Bits gesetzt 
oder zurückgesetzt werden sollen:
1
:
2
      desc <= '0';
3
    else
4
      
5
      if stelle = (breite_i-1) then -- wenn oben
6
        stelle <= 0;                -- zurücksetzen
7
        desc   <= not desc;         -- und flag toggeln
8
      else
9
        stelle <= stelle + 1;       -- sonst: hochzählen
10
      end if;
11
      
12
      -- Bitmuster setzen
13
      if desc = '1' then
14
:

Und es geht sogar noch einfacher:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity counter is
6
   generic (
7
     breite_i : integer := 1
8
   );
9
   Port ( clk_i   : in  STD_LOGIC;
10
          reset_i : in  STD_LOGIC;
11
          out_o   : out  STD_LOGIC_VECTOR(0 to breite_i-1) := (others => '0')
12
         );
13
end counter;
14
15
architecture Behavioral of counter is
16
  signal stelle: integer range 0 to breite_i-1 := 0;
17
  signal desc: std_logic := '0';
18
begin
19
20
process (clk_i) is
21
begin
22
  if rising_edge(clk_i) then
23
    if reset_i = '1' then
24
      stelle <= 0;
25
      desc <= '0';
26
    else
27
      
28
      if stelle = (breite_i-1) then -- wenn oben
29
        stelle <= 0;                -- zurücksetzen
30
        desc   <= not desc;         -- und flag toggeln
31
      else
32
        stelle <= stelle + 1;       -- sonst: hochzählen
33
      end if;
34
      
35
      -- Bitmuster setzen
36
      out_o(stelle) <= not desc;
37
     
38
    end if;
39
  end if;
40
end process;
41
42
end Behavioral;

Die "Testbench" (das ist eigentlich nur ein Taktgenerator) siehe 
Anhang...

: Bearbeitet durch Moderator
von Christian Q. (osx)


Lesenswert?

Danke für die Lösung. Das Problem war ein Denkfehler in den ich mich 
versteift habe, das desc Flag jeweils an beiden Rändern zu setzen statt 
es nur einem Rand zu flippen. Somit eliminiert sich der Fall stelle = 0, 
der mir Probleme gemacht hat:

Christian Q. schrieb:
> Hier habe ich noch Probleme: Ich habe versucht stelle nur einmalig pro
> Durchlauf zu setzen, damit auch nur eine und somit die letzte Zuweisung
> gewinnen kann. Ich kann nicht im fall stelle = 0 die stelle erhöhen, da
> counter(stelle=0) gesetzt werden soll - andererseits muss ich stelle
> verändern damit er nicht in dem Zweig hängt bzw. immer wieder
> hineinläuft.

Das Wellenform-Diagramm stimmt mit meiner Erwartung überein.

So wie ich es gestern verstanden hatte ginge mein Problem nicht so zu 
lösen, da ich alles umstrukturieren und den Ansatz komplett ändern 
müsse. Gut, dass es wohl doch geht und ich dieses bestimmte Problem so 
lösen kann. Dass ich nicht alles in eine Entity packe sondern in mehrere 
und diese mit Signalen verbinde war mir klar aber hier konnte ich solch 
eine Trennung nicht sinnvoll herausfinden.

: Bearbeitet durch User
von Theor (Gast)


Lesenswert?

Christian Q. schrieb:
> Danke für die Lösung. Das Problem war ein Denkfehler in den ich mich
> versteift habe, das desc Flag jeweils an beiden Rändern zu setzen statt
> es nur einem Rand zu flippen. Somit eliminiert sich der Fall stelle = 0,
> der mir Probleme gemacht hat:

Naja. Aus dem Code war ersichtlich, dass desc keine Richtung angibt, 
also nicht etwa "descend" bedeuten sollte, sondern das inverse des 
Wertes, auf den die durch Stelle indizierten Bits zu setzen waren. (Hier 
mal der Tip, wirklich sprechende Signalnamen zu verwenden).
Deswegen mein Rat, zunächst eine verbale Beschreibung zu erstellen.
Ich hätte auch ganz direkt darauf eingehen können, habe das aber aus 
didaktischen Gründen nicht getan. Auch weil ich Dich anregen wollte, 
tatsächlich auch analytische Fehlerbeschreibungen zu liefern.

> Christian Q. schrieb:
>> Hier habe ich noch Probleme: Ich habe versucht stelle nur einmalig pro
>> Durchlauf zu setzen, damit auch nur eine und somit die letzte Zuweisung
>> gewinnen kann. Ich kann nicht im fall stelle = 0 die stelle erhöhen, da
>> counter(stelle=0) gesetzt werden soll - andererseits muss ich stelle
>> verändern damit er nicht in dem Zweig hängt bzw. immer wieder
>> hineinläuft.

Ja. Da hast Du tatsächlich einen Schritt in die richtige Richtung getan. 
Nur eben nicht zu Ende gedacht. Wiederrum bestand die Möglichkeit, Dir 
das direkt zu sagen, aber ich habe es nicht getan, damit Du selbst 
darauf kommst.

> Das Wellenform-Diagramm stimmt mit meiner Erwartung überein.
Gut.

> So wie ich es gestern verstanden hatte ginge mein Problem nicht so zu
> lösen, da ich alles umstrukturieren und den Ansatz komplett ändern
> müsse. Gut, dass es wohl doch geht und ich dieses bestimmte Problem so
> lösen kann. Dass ich nicht alles in eine Entity packe sondern in mehrere
> und diese mit Signalen verbinde war mir klar aber hier konnte ich solch
> eine Trennung nicht sinnvoll herausfinden.

Was Du verstanden hattest, hättest Du früher schreiben sollen (ich nehme 
an, Du beziehst Dich auf meine Antwort). Ich meine das nicht irgendwie 
übel sondern als sachliche Kritik. :-)
Du schriebst aber: "Ich habe absolut keine Ahnung wie ich solch eine 
Logik anders beschreiben kann."
Es blieb offen, in welcher Hinsicht Du "anders" meintest.
Ich habe den Satz so gedeutet, dass er sich direkt auf meinen bezog. Von 
einer anderen Struktur habe ich aber nichts geschrieben (deswegen hielt 
ich es für unwahrscheinlich, dass Du das meintest). Ich habe davon 
geschrieben, Dir bestimmte Dinge im zeitlichen Ablauf vor Augen zu 
halten. Ich hatte mir vorgestellt, dass Du Dir die Zuweisungen noch 
einmal anschaust und wann sie wirksam werden. Nicht, dass Du die 
Beschreibung völlig anders strukturierst.
Das wäre auf weitere Widersprüche im Konzept hinausgelaufen, soviel ist 
klar. Aber wie gesagt, ich wollte Dich nicht allzu direkt darauf 
hinweisen, sondern Dir selbst den Lerneffekt bescheren. Man lernt 
nämlich aus Fehlern eine ganze Menge.


Allerdings ist es richtig, dass es auch andere Lösungen gibt. Das ist 
oft so.

Du könntest das Ding z.B. als Schieberegister betrachten. Das ist eine 
hübsche Übungsaufgabe.
Dann entfällt das Signal Stelle und das ganz benötigt weniger Resourcen.
Die Hauptfrage wäre, welcher Bitwert wird jeweils links eingeschoben? 
Kann man diesen Wert (oder sein inverses) aus einem Bit des 
Schieberegisters ableiten?

Oder Du könntest es als Zähler betrachten, bei der sich der neue 
Zählerstand aus einer Kombinatorik des alten ergibt.

Vielleicht probierst Du das ja mal.

Jedenfalls noch viel Erfolg und alles Gute. :-)

von Christian Q. (osx)


Lesenswert?

Theor schrieb:
> Was Du verstanden hattest, hättest Du früher schreiben sollen (ich nehme
> an, Du beziehst Dich auf meine Antwort).

Mein Fehler.. Was man wirklich weiß ist im Lernprozess meistens noch 
nicht ganz klar.

Theor schrieb:
> Du könntest das Ding z.B. als Schieberegister betrachten. Das ist eine
> hübsche Übungsaufgabe.
1
counter <= (not counter(breite-1)) & counter(0 to breite-2);

Unter der Annahme breite > 1

von Theor (Gast)


Lesenswert?

Christian Q. schrieb:
> Theor schrieb:
>> Was Du verstanden hattest, hättest Du früher schreiben sollen (ich nehme
>> an, Du beziehst Dich auf meine Antwort).
>
> Mein Fehler.. Was man wirklich weiß ist im Lernprozess meistens noch
> nicht ganz klar.

Ich meinte damit, wie Du meine Antwort verstanden hattest. Was ihre 
Aussage war. Das bezog sich nicht auf den Stand Deines Lernprozesses. 
:-)


> Theor schrieb:
>> Du könntest das Ding z.B. als Schieberegister betrachten. Das ist eine
>> hübsche Übungsaufgabe.
>
>
1
counter <= (not counter(breite-1)) & counter(0 to 
2
> breite-2);
>
> Unter der Annahme breite > 1

Ja. Gut. Und so schnell. :-) Prima.

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
Noch kein Account? Hier anmelden.