Forum: FPGA, VHDL & Co. Zähler Signale wollen nicht loslaufen/sich nicht zu 0 setzen lassen gar nichts.


von Cannibal F. (Firma: keine) (cannibalferox)


Lesenswert?

Moin an alle,

ich habe hier folgenden Code. Kurz zur Erklärung es soll eine AES 
Verschlüsselungsimplementation sein, d.h. ich habe meine ganzen Module 
und je nach Runde werden bestimmte ausgeführt (dies ist keine optimierte 
oder sonst was Version wurde komplett von 0 geschrieben als Aufgabe).

Was möchte ich erreichen? Es geht darum, dass ich im Endeffekt die Takte 
pro Runde herausfinden möchte und dann je nach Runde sagen kann, nach X 
Takten wird in die nächste gewechselt. Das wollte ich mit zwei Zähler 
Signalen realisieren. Warum auch immer kann ich sie nicht verändern und 
sie funktionieren überhaupt nicht!! Hier der Code:


Also es geht eigentlich um den P1 Prozess der ist auch eigentlich 
fehlerfrei (habe ihn schon ausgelagert in eine einzelne Datei und da 
zählt er auch), d.h. irgendwo müsste hier in der gesamt Datei der Fehler 
liegen....
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
5
entity encr is
6
  generic(N : integer := 9);         
7
  port(CLK        : in  std_logic;
8
     aReset     : in  std_logic;    -- Eingangssignale
9
     Status     : in  std_logic_vector(3 downto 0);
10
     Key        : in  std_logic_vector(127 downto 0);
11
     InputText  : in  std_logic_vector(127 downto 0);
12
     OutputText : out std_logic_vector(127 downto 0)); -- Ausgangssignal
13
end encr;
14
  :
15
  :
16
  signal Cycles   : unsigned(5 downto 0);
17
  signal Clocks    : unsigned(7 downto 0);
18
19
  :
20
  :
21
22
  FSM : process(Z, CLK, InputText, Key, AddRoundKey_Output, SubBytes_Output, Shiftrow_Input, ExpandKey_buf, Cycles, MixCloumn_output, ExpandKey_OutPut)
23
  begin
24
    FolgeZ <= Z;
25
    if CLK='1' and CLK'event then
26
      case Z is
27
        when 
28
          :
29
          if Clocks = to_unsigned(10, Clocks'length) then
30
              :
31
          end if;
32
33
          if Clocks = to_unsigned(10, Clocks'length) and Cycles = to_unsigned(n, Clocks'length) then
34
            FolgeZ <= ENDRUNDE;
35
          end if;
36
          :

: Bearbeitet durch Moderator
von Cannibal F. (Firma: keine) (cannibalferox)


Lesenswert?

Also die Signale Cycles und Clocks bleiben andauernd auf U für undefined 
was ja der Standardwert für std_logic ist

von Burkhard K. (buks)


Lesenswert?

Cannibal F. schrieb:
> Also die Signale Cycles und Clocks bleiben andauernd auf U für undefined
> was ja der Standardwert für std_logic ist

Sag dem Simulator, dass P1 auf aReset reagieren soll (aReset in die 
Sensitivity-Liste des Prozesses aufnehmen).

BTW: Ein Signal "aReset" (also asynchron) zu nennen und dann synchron zu 
verwenden ist eine gute Möglichkeit sich selbst und potentielle 
Code-Reviewer zu verwirren.

Gruß,
Burkhard

von Cannibal F. (Firma: keine) (cannibalferox)


Lesenswert?

Ich weiß! Ich benutze es ja woanders als asynchronen deswegen ja auch 
das Kommentar :D Aber ich will ihn ja synchron haben, ich habe auch mal 
ganz am Anfang nach dem begin nebenläufig Cycles und Clocks auf 0 
gesetzt und selbst das geht nicht sie waren beide weiterhin Undefined, 
also

Cycles <= (others => '0');

z.B.

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


Lesenswert?

In diese Sensitivliste gehört nur clk:
1
  FSM : process(Z, CLK, InputText, Key, AddRoundKey_Output, SubBytes_Output, Shiftrow_Input, ExpandKey_buf, Cycles, MixCloumn_output, ExpandKey_OutPut)
2
  begin
3
    FolgeZ <= Z;
4
    if CLK='1' and CLK'event then
Du vermischt da soweiso auf undurchschaubare Art die Ein- und die 
Zwei-Prozessschreibweise von Prozessen:
http://www.lothar-miller.de/s9y/archives/43-Ein-oder-Zwei-Prozess-Schreibweise-fuer-FSM.html
Wenn du die Einprozesschreibweise haben willst, dann ist nur der CLK im 
der Sensitivliste (wenn überhaupt: 
http://www.lothar-miller.de/s9y/archives/16-Takt-im-Prozess.html)

So wie du es gerade hast, fängst du dir in 0,nichts einen vollkommen 
unnötigen Takt Latency ein.

Zum Thema 'U': das bedeutet 'uninitialized' und damit gleichzeitig, dass 
niemals ein anderer Wert auf das Signal zugewiesen wurde. Lass doch mal 
die Waveform deiner Simu sehen...

von Cannibal F. (Firma: keine) (cannibalferox)


Lesenswert?

Okay das nehme ich gerne aus der Sensetivity Liste raus, ich dachte nur 
das alle Signale die auf der rechten Seite zum Zuweisen stehen auch da 
reingehören.

Hier ist der Screenshot der Wave man sieht genau das eine steigende 
Taktflanke und der Reset gesetzt sind.

http://i.imgur.com/ou0EfbO.png

Übrigens stimmt, bei dem FSM Prozess sollte ja gar kein CLK auftauchen 
(also so haben wir es sonst immer gemacht). Aber wie gesagt das ist ein 
"Projekt" und dort sollen wir den AES von 0 programmieren und die Logik 
war halt, wenn man sieht das sich die Module nichts mehr ändern, kann 
man ja genau sagen wie viel Takte benötigt werden. In der Hauptrunde 
brauche ich 9 Durchgänge, deswegen wird da Cycles immer erst hochgezählt 
wenn Clocks die Anzahl der Takte erreicht. Ich glaube das diese Zeile 
auch eine komb. Schleife erzeugt...

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


Lesenswert?

Cannibal F. schrieb:
> Okay das nehme ich gerne aus der Sensetivity Liste raus, ich dachte nur
> das alle Signale die auf der rechten Seite zum Zuweisen stehen auch da
> reingehören.
In die Sensitivliste gehören alle Signale, die eine Neuberechnung des 
Prozesses im Simulator nötig machen. Dem Synthesizer ist die 
Sensitivliste schnurzegal, bestenfalls meldet er noch mit einer 
Info/Warning: "Hör mal, deine Sensitivliste ist falsch. Die Simulation 
wird nicht zur Realität passen."

Cannibal F. schrieb:
1
 if Clocks = to_unsigned(10, Clocks'length) and Cycles = to_unsigned(n, Clocks'length) then
Mal abgesehen davon, dass beim "Cycles = to_unsigned(n, Clocks'length)" 
das "Clocks" natürlich falsch ist, nimm doch für "Clocks" und "Cycles" 
einfach einen integer (mit "range"). Dann liest sich das gleich viel 
natürlichsprachlicher:
1
 if Clocks = 10 and Cycles = n then

Wenn du eine überarbeitete Version hast, dann poste die doch einfach als 
Anhang mit Endung *.vhd (oder *.vhdl) hier. Und am besten deine 
Testbench mit dazu.

Cannibal F. schrieb:
> Hier ist der Screenshot der Wave man sieht genau
Du kannst im Simulator übrigens ganz leicht auch in einzelne 
Submodule/Komponenten hineinschauen. Da gibt es einen Projektbaum, wo du 
diese Submodule als Äste aufklappen und dann deren Signale in die 
Waveform aufnehmen kannst. Dann siehst du eher, warum da nichts 
passiert und was eigentlich los ist...

: Bearbeitet durch Moderator
von Cannibal F. (Firma: keine) (cannibalferox)


Lesenswert?

Jo ich habe alles selbst gelöst bitte schließen und löschen. Habe mich 
mit einem Kommilitonen unterhalten und den FSM Prozess sauberer gemacht 
und eben besonders die Zuweisungen weggelassen interne Reset Signale 
gesetzt und so den FSM viel viel kleiner und dünner gemacht. Aktuell 
verwende ich auch einfach Binäre Werte für Clock usw. also aktuell passt 
alles habe es geschafft :)

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


Lesenswert?

Cannibal F. schrieb:
> Jo ich habe alles selbst gelöst
Und das ist jetzt geheim? Ein Forum lebt davon, dass der Eine dem 
Anderen hilft. Es wäre doch für Alle anderen, die mal ein ähnliches 
Problem haben, schön zu sehen, wie das schon mal gelöst wurde...

> Aktuell verwende ich auch einfach Binäre Werte für Clock usw.
Du arbeitest mit Flags anstelle von Zählern?

> bitte schließen und löschen.
Gelöscht wird hier nur, wenn Beleidigungen kursieren. Denn sonst wäre 
eine Suchfunktion in "alten" Threads nutzlos.

: Bearbeitet durch Moderator
von Cannibal F. (Firma: keine) (cannibalferox)


Lesenswert?

LOL d.h. ich habe dich gebeten meinen hier geposteten Code zu löschen, 
weil das auch mein Wissen ist. Es ist ja gar kein Angriff, aber hier 
hatte ich eh nicht richtige Ratschläge bekommen. Und bin durch damit, 
also kann man es entfernen, weil das hier keine Hilfe für mich war. Also 
nehmt ihn doch einfach bitte runter ^^

von Strubi (Gast)


Lesenswert?

Na das haben wir ja gern. Für seine Hausaufgaben die Foren anschmeissen, 
und dann soll alles weg, weil es auch Dozenten geben könnte, die 
mitlesen?

Cannibal F. schrieb:
> hatte ich eh nicht richtige Ratschläge bekommen. Und bin durch damit,

Genau die hattest Du bekommen. Wenn Du das anders siehst, hast Du nix 
dabei gelernt.

Lothar M. schrieb:
>> bitte schließen und löschen.
> Gelöscht wird hier nur, wenn Beleidigungen kursieren. Denn sonst wäre
> eine Suchfunktion in "alten" Threads nutzlos.

Die kleine Bosheit muss ich noch loswerden: Vielleicht sieht der TO 
seinen Code inzwischen als Beleidigung an?

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


Lesenswert?

Cannibal F. schrieb:
> LOL d.h. ich habe dich gebeten meinen hier geposteten Code zu löschen,
> weil das auch mein Wissen ist.
Du solltest in Zukunft bei "Verträgen", die du (auch implizit) eingehst, 
vorher die Vertragsbedingungen lesen:
1
Nutzungsrecht an Beiträgen
2
Mit dem Erstellen eines Beitrags erteilt der Autor dem Betreiber des Forums 
3
ein einfaches, zeitlich und räumlich unbeschränktes und unentgeltliches 
4
Recht, den Beitrag im Rahmen des Forums zu nutzen. Das Nutzungsrecht bleibt 
5
auch nach Kündigung der Mitgliedschaft bestehen.
Aus: 
https://www.mikrocontroller.net/articles/Hilfe:Forum_Nutzungsbedingungen

> aber hier hatte ich eh nicht richtige Ratschläge bekommen.
Oh doch. Du weißt es vielleicht nur nicht (zu würdigen). Das kann was 
mit einer gewissen "Alles-für-lau" Mentalität zu tun haben.

> Und bin durch damit, also kann man es entfernen, weil das hier keine
> Hilfe für mich war. Also nehmt ihn doch einfach bitte runter ^^
Es ist zwar nutzlos, weil dein Code schon lange von den Suchmaschinen in 
den Cache genommen wurde, aber weil es dir so wichtig ist werde den 
allergrößten Teil davon aus deinem Post löschen. Nur das, was ich 
sowieso zitiert habe, lasse ich stehen.

: Bearbeitet durch Moderator
von Cannibal F. (Firma: keine) (cannibalferox)


Lesenswert?

Gerne kläre ich euch auf, jetzt wo was gelöscht wurde. Ja genau also ich 
ahne schon das mal ein Dozent das Lesen könnte. Ich war halt 
verzweifelt, weil das mit den Zählern nicht ging. Gerne erkläre ich euch 
auch wie ich die Zähler anbekommen habe, ich bin mir sicher dass es 
einen besseren Weg gibt, aber keiner wollte funktionieren....

Also ich konnte ums verrecken nicht die Zähler initialisieren und 
deswegen haben sie nicht hochgezählt, das erreiche ich gerade nur in dem 
ich am Anfang als Default Wert Clear Signale auf 1 setze und damit die 
Zähler Signale auf 0 zwinge, dann am Anfang in jedem Zustand setze ich 
die Clear Signale auf 0 und sie fangen an zu zählen. Das kann eigentlich 
aber nicht sein, weil in einem anderen Code hatten wir ähnliche Code 
Bauteile (nur in einem anderen Kontext) und dort war das Clear Signal 
Default auf 0 und der Zähler ging trotzdem.... Ich will mit dem Code 
keinen Schönheitswettebewerb gewinnen, sondern er soll auf jeden Fall 
funktionieren und das tut er nun.

Das war ja auch kein Angriff gegen euch dass ihr mir nicht geholfen 
habt, ihr hattet es ja versucht nur wollte ich eben sagen, dass es für 
MICH zum Code Verbessern keine Hilfe war, und ich deswegen es hier 
weghaben wollte. Weil wenn ihr mir wirklich hier und da das gezeigt 
hättet, dann könnte ich das ja nicht sagen. Aber der Kommentar mit dem 
asynchr. Reset oder mit Wave aufklappen darauf bin ich schon lange 
selbst gekommen und es dann halt U da..... Sonst hätte ich euch die 
Infos ja nicht mitteilen können.

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


Lesenswert?

Cannibal F. schrieb:
> das erreiche ich gerade nur in dem ich am Anfang als Default Wert Clear
> Signale auf 1 setze und damit die Zähler Signale auf 0 zwinge, dann am
> Anfang in jedem Zustand setze ich die Clear Signale auf 0 und sie fangen
> an zu zählen. Das kann eigentlich aber nicht sein
Korrekt. Denn du musst einfach mal einen Schritt nach hinten machen: 
woraus besteht so ein Zähler?
Aus Flipflops und Weiterschaltlogik. Die Flipflops im FPGA werden beim 
Laden des FPGAs auf einen Startwert gesetzt, die reale Hardware wird 
also , wenn du nichts weiter angibst, sowieso immer bei "00000" 
loslaufen.

Nur deine Simulation tut das nicht. Deshalb ist also eigentlich die 
Simulation FALSCH und damit wertlos, weil sie nicht der echten Hardware 
entspricht. Oder andersrum: wenn schon der Start nicht klappt, warum 
sollte die Simulation hinterher stimmen?

Du musst dir also einfach mal vergegenwärtigen, welche deiner Signale 
letztlich Flipflops sein werden, und diesen Signalen dann einen 
Initialwert zuweisen.

: Bearbeitet durch Moderator
von CannibalFerox (Gast)


Lesenswert?

Genau das ist mir klar und deswegen läuft ja ein Reset Signal zu Beginn 
des Programms und das hatte nie die FlipFlops initialisiert, das hatte 
mich ja gewundert. Extern ausgelagert nur als Zähler ging das in einer 
vhd mit dem Reset als Eingangssignal, aber in dem hier stehenden Code 
ging das nicht kein Plan woran das lag. Auf jeden Fall geht es jetzt ja.

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.