mikrocontroller.net

Forum: FPGA, VHDL & Co. Codecheck Erstlingswerk VHDL Newbie :)


Autor: Ralph H. (guru)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, anbei stelle ich mal den fertigen VHDL Code für einen XC9572 zur 
Kontrolle. Es ist mein Erstlingswerk in Sachen CPLD & VHDL.
Der Code stellt eine 1:1 Hardwarenachbildung eines 
Bildwiederholspeichers dar und funktioniert auch in der realen 
Schaltung, aber ich möchte
1. wissen, wo die Profis etwas anders/besser machen würden... und
2. hab ich beim Testen einige Erfahrungen gemacht die mir unerklärlich 
sind und die ich gern mal am realen Code erläutert haben möchte. Die 
konkreten Fragen formuliere ich in einem weiteren Beitrag.
Danke Euch allen die mal drüber schauen :-)

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde versuchen:

1. weniger Takte zu nehmen (ok ist ein CPLD, da muß man u.U. etwas 
tricksen)
2. daraus folgen auch weniger Prozesse (damit gewinnt die 
Übersichtlichkeit)
3. bessere Bezeichner (weißt Du in zwei Wochen noch, was QD43_44_20 
macht?)
4. ieee.numeric_std.all statt dem Synopsis-Quatsch und last but not last
5. ein Testbench zum Simulieren dazuzupacken.

Duke

Autor: Ralph H. (guru)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
> 1. weniger Takte zu nehmen (ok ist ein CPLD, da muß man u.U. etwas
> tricksen)
Wie soll ich das tun ??? die Takte sind doch nötig um das Bild zu 
zeichnen.
> 2. daraus folgen auch weniger Prozesse (damit gewinnt die
> Übersichtlichkeit)
Nun ich hab das schön extra immer gemacht und finde es so ansich schön 
übersichtlich, denn jeder Prozess stellt eine eigene Baugruppe dar.
> 3. bessere Bezeichner (weißt Du in zwei Wochen noch, was QD43_44_20
> macht?)
Ja ich weiß das später noch ganz genau, weil ich ja reale Hardware 
nachgebildet habe und eben genau die IC Bezeichnungen verwendet habe !

> 4. ieee.numeric_std.all statt dem Synopsis-Quatsch und last but not last
Hm.. was soll das ändern ? bzw. verbessern ?
> 5. ein Testbench zum Simulieren dazuzupacken.
Ok hier ist sie...

Gruß Ralph

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralph H. schrieb:
>> 4. ieee.numeric_std.all statt dem Synopsis-Quatsch und last but not last
> Hm.. was soll das ändern ? bzw. verbessern ?
Das wird definiert
use IEEE.STD_LOGIC_unsigned.ALL; --nötig für die Zähler !
Wehe, da kopiert mal einer (und sei es du selber) einen Codeabschnitt 
aus deiner Datei und kopiert die irgendwohin, wo oben steht:
use IEEE.STD_LOGIC_signed.ALL; --nötig für die Zähler !
Wie werden dann Vergleiche interpretiert?

Sowas kann dir mit der numeric_std nicht passieren, denn da haben die 
Signale definierte Typen signed oder unsigned

>> 5. ein Testbench zum Simulieren dazuzupacken.
> Ok hier ist sie...
:-)

Autor: Ralph H. (guru)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Sowas kann dir mit der numeric_std nicht passieren, denn da haben die
> Signale definierte Typen signed oder unsigned
OK aber dann funktionieren die Zähler nicht mehr so schön einfach. :-(

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralph H. schrieb:
> OK aber dann funktionieren die Zähler nicht mehr so schön einfach. :-(
Doch:
  signal  QD43_44_20  : UNSIGNED (8 downto 0)  := (others => '0'); -- Ausgang D43,D44,D20 Zähler
  :
  if rising_edge(TaktD43) then QD43_44_20 <= QD43_44_20 + 1 ; end if ; --zählen..
  if QD43_44_20 = 320     then QD43_44_20 <= "000000000"    ; end if  ; --max. bis 320
Nur das ändert sich:  STD_LOGIC_VECTOR --> UNSIGNED

Und da im Beitrag "Re: 32Bit Zähler zählt nur bis 255." ist auch 
noch ein Tipp..

Autor: Ralph H. (guru)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK Danke Lothar, aber wenn ich dann den Wert QD43_44_20 ausgeben will 
z.B. durch Ausgang <= QD43_44_20 ; dann hab ich doch versch. Datentypen 
oder ?
Ausgang wäre ja  STD_LOGIC_VECTOR ..

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da hilft ein Cast weiter:
  std_vektor <= std_logic_vector(QD43_44_20);

Die Übergänge von integer via signed/unsigned nach std_logic habe ich 
mir da mal aufgemalt: 
http://www.lothar-miller.de/s9y/archives/14-Numeric_Std.html

Das ist letzlich wesentlich durchschaubarer als die Synopsys-Libs mit 
ihren conv_... Funktionen.

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralph H. schrieb:
> OK Danke Lothar, aber wenn ich dann den Wert QD43_44_20 ausgeben will
> z.B. durch Ausgang <= QD43_44_20 ; dann hab ich doch versch. Datentypen
> oder ?
> Ausgang wäre ja  STD_LOGIC_VECTOR ..

Richtig. Dort darfst Du casten
Ausgang <= std_logic_vector(QD43_44_20);

Würde ich aber nur machen, wenn aus dem Chip rausgeht. Sonst den Typ 
beibehalten, das schafft gleich Klarheit im übergeordneten Modul...

Duke

Autor: Ralph H. (guru)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK das werd ich dann heute abend mal ausprobieren. Aber nochmal für mein 
Verständnis... diese Änderung es ist nur nötig, damit ich mich später 
mal nicht wundere, wenn ich Codeschnipsel hiervon verwende, weil die 
falsche Biliothek (..unsiged) benutzt wurde.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralph H. schrieb:
> diese Änderung es ist nur nötig, damit ich mich später
> mal nicht wundere, wenn ich Codeschnipsel hiervon verwende, weil die
> falsche Biliothek (..unsiged) benutzt wurde.
Ja. Und um die genormte numeric_std verwenden zu können... ;-)

Autor: Ralph H. (guru)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Lothar und Duke... Ich hab das nun geändert und mir gemerkt in Zukunft 
so zu verwenden. Gibt es noch Verbesserungen ? Wenn nein dann mal meine 
1.Frage..
Beim Betrachten des Zählerstandes von QD19 in der Testbench ist mir 
aufgefallen, das der Zählerstand 6 für eine halbe Taktperiode 
eingenommen wird, obwohl es 0 sein müsste. Dafür ist der Zählerstand 0 
auch nur ne halbe Taktperiode lang.
Ich hab mir da mal nur den Zähler QD19 in einer extra Architecture mit 
Testbench unter die Lupe genommen. Dort ist das Verhalten nicht zu 
sehen.
Habt ihr ne Erklärung dafür ?

Autor: Annexe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
D19:
  process(VDCLK)        -- Basis ist VDCLK Takt der durch 6 geteilt wird
  begin
  if rising_edge(VDCLK) then QD19 <= QD19 + 1 ; end if ;--zählen..
  if QD19 = 6        then QD19 <= "000"     ; end if ;--max. bis 6
  end process D19;

Wird da die erste if-Schleife nicht einfach zu früh beendet, so dass das 
Rücksetzen letztendlich asynchron verläuft?
In der Simulation wird QD19 auch nicht von der Sensitivitätsliste 
erfasst und zudem erst, nachdem der Zähler den Wert 6 angenommen hat, 
zurücgesetzt?

Autor: Annexe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigentlich sollte da am Ende kein ? sondern ein ! stehen :)
Durch das process(VDCLK) wird der process auch bei der fallenden Flanke 
aktiviert, wodurch er genau eine halbe Taktperiode noch bei 6 steht.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Annexe schrieb:
> if-Schleife
Siehe http://www.if-schleife.de

Annexe schrieb:
> Durch das process(VDCLK) wird der process auch bei der fallenden Flanke
> aktiviert, wodurch er genau eine halbe Taktperiode noch bei 6 steht.
Allerdings nur in der Simulation.
In der Hardware wird das tatsächlich (wie vermutet) als asynchroner 
kombinatorischer Reset ausgeführt werden...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.