Konstanten berechnen >2**32

#7391782
Lesenswert?

Hoffe, heute könnt ihr mir mal helfen, da ich endlich mal eine Frage für euch habe :-)

In einem existierendem Code wird eine Konstante berechnet die einer 2 entspricht in einem fixed-point Format gegeben durch Generics als Wortbreite (WIDTH) und Stellen hinter dem Punkt (FRACTIONAL):

1
constant CONST2    : signed((2*WIDTH)+1 downto 0) :=
2
    to_signed(2*2**(2*FRACTIONAL), (2*WIDTH)+2);

Das klappt auch, so lange FRACTIONAL < 15 ist. Darüber überläuft dann der 32bit Integertyp von VHDL.

Zuerst dachte ich, die Antwort finde ich schon im Forum in einer nicht so alten Diskussion, aber das hilft mir noch nicht: Beitrag "Re: große Dezimalwerte in VHDL zuweisen"

Wie rechne ich das aus, ohne VHDL2019?

PS: Das 2*WIDTH kommt, weil die Konstante zusammen mit multiplizierten Werten benutzt wird.

#7392135
Lesenswert?

Christoph Z. schrieb:

In einem existierendem Code wird eine Konstante berechnet die einer 2 entspricht in einem fixed-point Format gegeben durch Generics als Wortbreite (WIDTH) und Stellen hinter dem Punkt (FRACTIONAL):

Aber der Code macht das nicht. Der Code erzeugt ein signed. Aber du willst doch ein sfixed oder ufixed wenn ich das richtig lese?!

Aber mit WIDTH und FRACTIONAL kannst du dir die 2 als langen std_logic_vector selber bauen und dann nach ufixed casten. Oder gleich die Integer 2 nach ufixed konvertieren.

Das hier finde ich recht hilfreich: https://freemodelfoundry.com/fphdl/Fixed_ug.pdf

to_sfixed (std_logic_vector) würde ich verwenden oder gleich to_sfixed (integer).

Jürgen S. schrieb:

Muss der Code derart skalierbar sein?

Naja, ist zwar nicht mein Code, aber wenn man Komponenten schreibt, dann sollen die doch möglichst generisch sein. Wenn ich einen FIFO schreibe dann soll die Tiefe/Breite/... später per Generic einstellbar sein. So muss man dann auch nur eine Komponente warten. Für mich ist das also guter Stil was der TO erreichen möchte.

Gast #7392392
Lesenswert?

Christoph Z. schrieb:

Hoffe, heute könnt ihr mir mal helfen, da ich endlich mal eine Frage für euch habe :-)

Klar, darauf haben "wir" gewartet, das "Du" Dir eine Frage aus dem A... extra für "uns" pullst.

Die Lösung ist doch simple, du benutzt den datentyp std_logic_vector durchgängig. Für Ausdrücke länger als 32 bit berechnest Du die teilterme, die die mit dem Verkettungsoperator "&" zu der gewünschten breite zusammenfügst. Bei To_unsigned dagegen haste wieder den beschränkten Datentyp integer im funktionsargument. Gück doch in den Quellcode der standard libs die du verwendest.

Wenn du den Unterschied zwischen einem int-Datentyp (scalar) und einen std_logic_vector (array, 'string') verstamden, löst sich die Denkblockade wie von selbst auf. Aber das dazu nötige intellektuelle Inventar bringt nicht jeder mit ...

BTW:

#7392398
Lesenswert?

wenn uns die IEEE working group den Potenz-Operator für signed in der numeric_std nicht programmiert, müssen wir ihn halt selber schreiben:

1
function "**"(basis : signed; exponent : signed) return signed is
2
          variable l  : natural := basis'length * exponent'length;
3
          variable b  : signed(l - 1 downto 0) := resize(basis, l);
4
          variable e  : signed(l - 1 downto 0) := resize(exponent, l);
5
          variable retv : signed(l - 1 downto 0);
6
begin
7
    if exponent = 0 then
8
        retv := resize(x"1", l);
9
        return retv;
10
    end if;
11
    while e mod 2 = 0 loop -- even?
12
        b := resize(b * b, l);
13
        e := e / 2;
14
    end loop;
15
    -- odd
16
    retv := b;
17
    while true loop
18
        e := e / 2;
19
        if e = 0 then
20
            exit;
21
        end if;
22
        b := resize(b * b, l);
23
        if e mod 2 = 1 then
24
            retv := resize(retv * b, l);
25
        end if;
26
    end loop;
27
    return retv;
28
end function "**";

Der Code verwendet die ( https://de.wikipedia.org/wiki/Bin%C3%A4re_Exponentiation ) Binäre Exponentation, die die Anzahl der notwendigen Multiplikationen minimiert.

Damit lassen sich signed-Variablen (fast) beliebiger Länge potenzieren.

Gast #7392399
Lesenswert?

BTW:

So muss man dann auch nur eine Komponente warten. Für mich ist das also guter Stil was der TO erreichen möchte.

Welche Wartung willst du an einer KONSTANTEN vornehmen?! Eine Konstante änderbar vorzusehen ist ne reichlich blödsinnige Idee. Da macht dann fehlersuche richtig Spass, wenn dann irgendein scriptkiddy eine Bibliothek importiert und aus Langeweile kommentarlos PI := 22/7 vorgibt. Eine Konstante ist kein Parameter.

Das codebesipiel aus: Beitrag "Re: Konstanten berechnen >2**32"

Falls man hier wegem Stil Krümmel kacken möchte, dann könnte man darauf hinweisen, das manche VHDL-Übersetzer es überhaupt nicht mögen, wenn mehr als ein return in einer Funktion auftaucht. Oder irgendwo mittendrin statt am Schluß der Funktion. Aber das lediglich ein Krümel, etwas schwerer wiegt der sparsame Umgang mit erläuternden Kommentaren....

Beitrag #7392425 wurde von einem Moderator gelöscht.
Beitrag #7392428 wurde von einem Moderator gelöscht.
Beitrag #7392446 wurde von einem Moderator gelöscht.
Beitrag #7392459 wurde von einem Moderator gelöscht.
#7392484
Lesenswert?

DSGV-Violator schrieb:

Welche Wartung willst du an einer KONSTANTEN vornehmen?! Eine Konstante ist kein Parameter.

Christoph Z. schrieb:

In einem existierendem Code wird eine Konstante berechnet [...] gegeben durch Generics

Der Wert der Konstanten wird zum Synthesezeitpunkt durch die zwei Generics parametriert.

Jürgen S. schrieb:

Ich schreibe Konstanten immer als echte Konstanten hin und nicht als Ergebnis von Rechnungen. Muss der Code derart skalierbar sein?

Ja. Bisher war der code NICHT skalierbar, fix auf 18 bit breite geschrieben und oh wunder, im aktuellen Projekt brauchen wir jetzt 22 bit oder mehr.

Gustl B. schrieb:

Aber der Code macht das nicht. Der Code erzeugt ein signed. Aber du willst doch ein sfixed oder ufixed wenn ich das richtig lese?!

Uhh, so weit sind wir hier noch nicht, das wir durchgängig sfixed einsetzen. Dieser Code wurde jetzt endlich mal "sanft" überarbeitet, damit er keine längst obsoleten Firmen internen Libraries mehr braucht, numeric_std nutzt und die alte testbench läuft unverändert fehlerfrei durch (parallel zu meiner mit wesentlich höherer coverage...)

DSGV-Violator schrieb:

Für Ausdrücke länger als 32 bit berechnest Du die teilterme, die die mit dem Verkettungsoperator "&" zu der gewünschten breite zusammenfügst.

Da es sich hier in dem Fall um eine dezimale 2 handelt, also eine einzelne binäre '1' an der richtigen Stelle, werde ich mir das wohl so zusammen bauen, weil es hier einfach zum Ziel führt.

Danke @mfro für die Idee mit der Potenzfunktion für signed Typen!

Beitrag #7392497 wurde von einem Moderator gelöscht.
Beitrag #7392506 wurde von einem Moderator gelöscht.
Beitrag #7392516 wurde von einem Moderator gelöscht.
Beitrag #7392551 wurde von einem Moderator gelöscht.
Beitrag #7392681 wurde von einem Moderator gelöscht.
Gast #7392684
Lesenswert?

DSGV-Violator schrieb:

Die Lösung ist doch simple, du benutzt den datentyp std_logic_vector durchgängig. Für Ausdrücke länger als 32 bit berechnest Du die teilterme, die die mit dem Verkettungsoperator "&" zu der gewünschten breite zusammenfügst.

Eigentlich wird empfohlen, zum Rechnen überhaupt keine Vektoren zu benutzen. Dafür gibt es die einschlägigen Variablenklassen.

Beitrag #7392686 wurde von einem Moderator gelöscht.
#7393313
Lesenswert?

DSGV-Violator schrieb:

Welche Wartung willst du an einer KONSTANTEN vornehmen?! Eine Konstante änderbar vorzusehen ist ne reichlich blödsinnige Idee.

Ja ist es das?

Als Beispiel will man einen Testbildgenerator schreiben dem man die Bildauflösung als Generic mitgeben kann.

Klar kann man dann drinnen alles nur mit diesen Generics rechnen, aber es ist durchaus sinnvoll dort Konstanten zu definieren für Frontporch, Backporch, ... und die sind dann von den Generics abhängig. Konstanten sind eben oft dazu da um Ausdrücke zu vereinfachen. Damit eine konstante Rechnung, abhängig von Generics, nicht öfter an vielen Stellen, sondern nur einmal an einer STelle im Code steht.

Und das ist auch gut und sinnvoll, denn es ist wartbarer Code weil ein Fehler in der Berechnung nur einmal bei der Konstantenzuweisung gefixt werden muss.

Gast #7393320
Lesenswert?

Georg B. schrieb:

Eigentlich wird empfohlen, zum Rechnen überhaupt keine Vektoren zu benutzen. Dafür gibt es die einschlägigen Variablenklassen.

Variablenklassen? In VHDL? Lass mal sehen!

So wie Du das hier in den Raum wirfst, klingt das eher nach heißer Luft eines Wichtigtuers statt einem tatsächlichen Expertenrat- Zumal ein type wie *_vector oder keine class ist.

Und bezüglich variables in VHDL heisst es eigentlich: "Only fools and experts uses variables".

https://nandland.com/variables-vs-signals/

Wahrscheinlich willst lediglich darauf hinweisen, das in einer Simualtion skalare typen wie int i.d.R. weniger runtime benötigen als arrays wie signed greifst aber bezügliche der Fachtermini ins Klo respektive bewegst Dich im Umfeld einer anderen Beschreibungssprache als VHDL.

Gast #7393334
Lesenswert?

Gustl B. schrieb:

Und das ist auch gut und sinnvoll, denn es ist wartbarer Code weil ein Fehler in der Berechnung nur einmal bei der Konstantenzuweisung gefixt werden muss.

Du verwechselst die Termini "Konstante" und "Parameter".

https://math.stackexchange.com/questions/1290373/difference-between-variables-parameters-and-constants

In dem genannten Beispiel (Videocontroller) macht man es eigentlich so das man die generic-Sätze als constant in unterschiedlichen packages definiert. Oder unterschiedlich benamste Konstanten benutzt (bspw.: C_V_Pulse_start_800x600 und C_V_Pulse_start_1024x768). Oder unterschiedliche records (bspw. 800x600.C_V_Pulse_start). Andernfalls riskiert man den Überblick zu verlieren vor lauter 'gefixten' aka veränderten aber nicht unbenannten Konstanten.

#7393342
Lesenswert?

DSGV-Violator schrieb:

Du verwechselst die Termini "Konstante" und "Parameter".

Ne.

Ja, man kann ein Package mit Konstanten machen und dann in der Komponente einbinden oder man kann generic Packages verwendet, ...

Man kann aber auch Konstanten in der Komponente berechnen die nur von Generics abhängen. Vielleicht nicht so schön, aber immer noch besser als an vielen Stellen vom Code die gleiche Berechnung stehen zu haben. Ich finde also das was der TO vor hat durchaus OK und gut auch wenn es vielleicht noch elegamnter ginge (das weiß man aber nicht weil der Kontext fehlt).

Gast #7393361
Lesenswert?

... Konstanten in der Komponente berechnen die nur von Generics abhängen. Vielleicht nicht so schön,

Wenn ich mich recht erinner wird das vom modelsim und XST mit ner warning ("Non-locally static" o.ä. ) quittiert. Auch die Verwendung eines Functionsaufrufes (bei der Typ-Convertierung bspw.) kann bei der Konstantendeclaration (unnötige?) warnings/errors hervorbringen.

Ja, manche lesen sich alle Warnings während der Compilaton/Synthese durch, andere nicht. Und ja, 'ne warning ist nur 'ne warning.

BTW: https://stackoverflow.com/questions/29764083/why-cant-i-call-a-function-in-a-constant-declaration-that-is-defined-in-the-sa

https://stackoverflow.com/questions/42767377/is-function-call-in-defining-a-constant-valid-vhdl

Persönliche Seite #7393417
Lesenswert?

Gustl B. schrieb:

Naja, ist zwar nicht mein Code, aber wenn man Komponenten schreibt, dann sollen die doch möglichst generisch sein. Wenn ich einen FIFO schreibe dann soll die Tiefe/Breite/... später per Generic einstellbar sein.

Generell stimme ich da zu, aber man muss Aufwand und Nutzen abwägen. Die Skalierbarkeit erfordert einen nicht unerheblichen Mehraufwand und das nicht nur beim Programmieren. Die Möglichkeiten, die sich daraus ergeben, müssen auch untersucht und gfs. eingeschränkt werden - gerade bei Anforderungen an den Code in bestimmten Branchen. Bei der Verifikation ist es auch einfach durchsichtiger mit tatsächlich konstanten Werten zu arbeiten, die evident sind und nicht nachvollzogen werden müssen.

Und was man auch sehen muss: Die Skalierbarkeit muss dann auch durchgezogen werden, wenn sie Sinn machen soll, was oft nicht der Fall ist. D.h. man hat eine skalierbare Komponente, die aber gar nicht skaliert werden kann, weil der Rest des Codes die Situation einfriert und fixiert. Da muss dann wieder dokumentiert werden, was skalierbar ist und wie und welche Einschränkungen vorliegen. Als black box, um die man sich scheinbar nicht kümmern muss, ist das zunächst gut und schön, ich kann aber dutzende Fälle benennen, wo dann irgendwas nicht funktierte weil der Ersteller nicht alles berücksichtigt hat.

Ich hatte gerade eben wieder so einen Fall mit einer Komponente, die ein Array von Signalen verwendet, das man theoretisch einfach hätte um einige Signale erweitern können müssen, indem man den Wert größer wählt. Ging aber aus unerfindlichen Gründen nicht. Tief im design war irgendwas dann doch noch festgenagelt und es gab sich offenbar widersprechende Generics. Trotz aufwändiger Suche war es nicht zu lösen. Eine scheinbar intelligente und als fertig angesehene Komponente, die man auf die Schnelle hätte einsetzen sollen, die aber am Ende einen Haufen Stress gemacht hat. Einfach stumpf runterprogrammiert, um es per COPY und PASTE zu erweitern, hätte es einfacher gemacht und auch in der Zeit noch funktioniert. (Der Entwickler selber empfahl am Ende, es neu zu machen).

Persönliche Seite #7393447
Lesenswert?

Gustl B. schrieb:

Als Beispiel will man einen Testbildgenerator schreiben dem man die Bildauflösung als Generic mitgeben kann.

Das mag sinnvoll sein, allerdings muss man dann eben auch hergehen und alle Variablen und Signale von dem Bildformat abhängig machen und nicht jedes Element einzeln aus Konstanten zu berechnen, wie es oft gemacht wird. Dann ist es nämlich möglich, unmögliche Videoformate und timings vorzugeben, d.h. die Komponente in einen nicht funktionierenden Zustand zu bringen, weil intern Zählerabfragen und Überläufe in den möglichen Formaten getestet funktionierten, aber in den ungetesten, die man der Flexibilität wegen eingebaut hatte, ausgefallen waren. Das sind einfach zu viele Möglichkeiten.

Wenn das dann von Außen nicht richtig angefahren wird, versagt das System dann in ungünstigen Fällen, weil die keiner auf dem Schirm hatte und es nicht simuliert wurde. Kunden von mir sind schon einige male mit solchen Sachen schwer auf den Hintern gefallen und dies auch deshalb weil die Komponente mal erweitert wurde und die Skalierbarkeit a) mangels Verständnis und b) wegen der Komplexität nicht stringent durchgezogen wurde.

Um das richtig sicher zu machen, müsste es also in allen Lagen eingeschränkt werden und die Kombinationen möglicher Fälle gegen die nicht erlaubten abgegrenzt werden. Das aber geht im Aufwand sehr schnell in Regionen, die es unwirtschaftlich werden lassen.

Da in vielen Bereichen der Code und dessen Funktion - aber auch dessen Varianz (eben jene Verwendbarkeit) detailliert untersucht und dokumentiert werden muss, ist es einfacher und schneller (und auch sicherer) das nur auf die wenigen Fälle zu beschränken, die wirklich benötigt werden und den Rest zu fixieren. Damit muss dann den Entwickler eines Derivats eben die Doku bemühen, um seine Version zu erzeugen, tappt aber dabei auch nicht in die Falle, dass etwas nicht automatisch hinhaut. Er steht auch nicht vor dem Dilemma die Komponente updaten und erweitern zu müssen, um dann alles in die alten Repositories spielen zu müssen und/oder mit einem flick arbeiten zu müssen um seine Arbeit abschließen zu können.

Solche Effekte sind nämlich dann die Konsequenz von "flexiblem" Code, den man aufbläst, um ihn wiederverwertbar zu machen. Der Erstentwickler muss gut nachdenken und weit bauen, sonst kommen nämlich für das Ding doch immer wieder updates oder man hat Aufwand mit unterschiedlichen Ausbaustufen. Und dann schnappt sich jemand die falsche Ausbaustufe und fällt auf die Nase.

Am Ende ist der Aufwand aus Projektsicht meistens höher und ufert aus!

Ich empfehle bei den wachsenden Komplexitäten der FPGA Designs damit allen Kunden und Entwiclern, sich generell genau zu überlegen, wieviel man in resuability stecken will, die am Ende keinen Benefit hat sondern noch Probleme aufwirft. Stattdessen sollte man schauen, dass man designs so weit wie möglich trennt und entflechtet.

DSGV-Violator schrieb:

In dem genannten Beispiel (Videocontroller) macht man es eigentlich so das man die generic-Sätze als constant in unterschiedlichen packages definiert. Oder unterschiedlich benamste Konstanten benutzt (bspw.: C_V_Pulse_start_800x600 und C_V_Pulse_start_1024x768).

Das ist genau das, worauf es hinausläuft. Und für dieses Beispiel würde das nicht einmal reichen, weil es für solche Parameter mehr Variationsmöglichkeiten innerhalb der Video-Modes gibt, je nach Interlaced oder Progressive bzw. Bildfrequenz / Horizontaltakt. Ich habe schon solche Videogeneratoren geschrieben und sie für 24Hz, 50Hz, 60Hz sowie 59,94 und "falsche 50" angepasst. Dazu gab es Videomodes für Kameras die das Rohformat des Sensors ausgeben können.

Schon mit nur einer anderen Wiederholrate und verändertem Rand-Offset für die Messpixel bekommt man eine Matrix für jeden einzelnen Parameter. In einem Fall habe ich das tatsächlich im Code implementiert, weil der Kunde es in im Betrieb umschalten wollte.

In der Regel setze ich aber ein Excelblatt an, dass diese Fälle berücksichtigt und für alle benötigten Kombis einen Codesatz erzeugen kann, gfs mit VHDL-Ausgabe. Dann wird das so erzeugte Excel eingefroren und zu dem ebenfalls eingefrorenen Code beigepackt. Die kriegen einen Namen und die Kombi geht als getestet in die Liste - wird später im Testplan vermerkt und final auch abgehakt und bestätigt. Ende der Fahnenstange.

Ein Entwickler kann dann auf einen getesteten und dokumentierten Code zurückgreifen und damit wissen, dass er etwas funktionables nutzt oder muss es selber bauen und simulieren. Er kann sich dabei von einem ähnlichen Beispiel inspirieren lassen, die Werte übernehmen, um mit dem Master-Excel "seine" Version rasch parametrieren zu lassen. Konstanten für die Vektorbreiten zu nehmen, steht dem nicht entgegen. Sie werden aber nicht im Code berechnet und wenn dann nur in sehr einfachen Fällen.

Auf diese Weise weis der Entwickler, welchen Stand er da in Händen hält und kann komplett agieren.

Findet er einen Fehler im Excel, der bisher noch nicht aufgetaucht war, weil eine Einschränkung oder Problem mit einem neuen Mode übersehen worden war, kann er das selber updaten ohne irgendetwas anderes anfassen zu müssen. Die alten Codes bleiben wie sie sind, weil sie ja getestet wurden und von diesem Fall nicht betroffen sind. Kein Änderungsantrag, kein SW-Update, keine geänderte Common-Komponente, kein SAP-Nachttrag, kein Zeitaufwand für Diskussionen, keine neue Version eines Universalcodes, keine Änderungsmitteilung, keine Info an den Projektleiter oder Design Owner, keine Besprechung und Abstimmung wie man vorgeht, kein garnichts.

Einfach nur ein neues upgedates Excel auf dem Server, das nun etwas mehr kann, als das eigene und einmal COPY & PASTE aus der Excel-Spalte in die Parameterliste des VHDL. Wenn das VHDL ausgebaut werden muss, um einen Fehler abzufangen oder einen neuen Modus zu können, kommt das Ding parallel mit einer neuen Versionsnummer dazu und der nächste Entwickler hat es wieder einfach.

Um es am Beispiel der Videogeneratoren zu zeigen, gibt es dann für jedes Gerät (und nicht Modus) einen eigenen Videogenerator, der genau das kann, was dieses Gerät können muss. Er kann kein bischen weniger oder mehr, sodass Test und Spec 1:1 zusammenpassen. Alle Kombis, die möglich sind, sind genau einmal vorhanden, einmal simuliert und einmal getestet.

Dann kann es auch nicht passieren, dass sich einer beim build script vertut und das falsche in die Kompenten eintreibt und dann wieder was falsches gebaut wird, was erst nach tagelanger Fehlersuche auffällt. Mit einer solchen Aktion ist alles, was an scheinbarer Einsparung bei der Pflege erreicht werden könnte, doppelt und dreifach vernichtet, soforn nicht schon die Einbau der Flexibilität jeglichen Benefit verunmöglicht hatte. Ob ich die Parameter ins Excel haue oder in die Generics, ist ja Wuppe.

Schnelles und sicheres Entwickeln funktioniert generell nicht so, dass es sich der Entwickler einfach macht und lokale Automatisierungen eintreibt, sondern Code klar und explizit macht. Eher sollte man sogar mehr Aufwand in die Entwicklung stecken, um die Varifikation und die Inbetriebnahme zu vereinfachen, denn dort wird die meiste Zeit verbraten.

Gast #7393704
Lesenswert?

Jürgen S. schrieb:

In der Regel setze ich aber ein Excelblatt an, dass diese Fälle berücksichtigt und für alle benötigten Kombis einen Codesatz erzeugen kann, gfs mit VHDL-Ausgabe. Dann wird das so erzeugte Excel eingefroren und zu dem ebenfalls eingefrorenen Code beigepackt.

Das ist ein weiterer Lösungsansatz für das Problem des TO, den Wert der constant nicht per VHDL-Boardmittel zu bestimmen, sondern in einem extra script (Pyzhon,C,TCL/TK,csh,...) das dann den entsprechenden VHDL code als txt-string ausgibt.

So ähnlich wie man bspw bei Register packages macht. Oder um den Zeitpunkt der FPGA-Synthese in den VHDL-code zu bringen. Die generics müsst man dann per command line options übergaben. Oder als .json. Oder ...

Beitrag "Timestamp in Synthese einbauen"

Und das kann man wunderbar in den design flow einbringen, wenn man zur synthese nicht die KlickieKackie-GUI benutzt sondern ein buildscript mitliefert.

Beitrag #7393710 wurde von einem Moderator gelöscht.
Beitrag #7393714 wurde von einem Moderator gelöscht.
Beitrag #7393720 wurde von einem Moderator gelöscht.
Beitrag #7393858 wurde von einem Moderator gelöscht.
Beitrag #7393859 wurde von einem Moderator gelöscht.
Gast #7394469
Lesenswert?

Wieder einer jener threads, der im Grunde wichtige Dinge enhtält, die es zu diskutieren gälte, der aber durch die Art und Weise der Diskussion und des vorgebrachten stils jedermann abschreckt, teilzunehmen.

DSGV-Violator schrieb : ... viel herablassendes Zeug, das die Frage aufkommen lässt, welche Natur diese Person ist.

Gast #7394473
Lesenswert?

Ich erlaube mir eine Antwort:

DSGV-Violator schrieb:

Und bezüglich variables in VHDL heisst es eigentlich: "Only fools and experts uses variables".

https://nandland.com/variables-vs-signals/

Mit solchen pauschalen GUT-SCHLECHT-Aussagen kommt man nicht weiter. Auch hilft es keinem wenn man sie zitiert. Noch dazu im falschen Kontext und Tenor.

Variablen haben ihre Berechtigung dort, wo es sinnvolle Stückelungen von komplizierten Berechnungen braucht und das nicht keineswegs etwas nur für die "Profis".

Gast #7394662
Lesenswert?

Mit solchen pauschalen GUT-SCHLECHT-Aussagen kommt man nicht weiter. Auch hilft es keinem wenn man sie zitiert.

Das ist eine Redewendung wie "a fool with a tool, remains a fool" und keine Bewertung. Natürlich hilft die Regel, nur dann variable statt signal in VHDL zu verwenden, wenn man genau weiß was man damit tut und sich bewusst ist, das man sich damit u.U. Unterschiede im Verhalten in Simulation und Synthese einhandelt.

Variablen haben ihre Berechtigung dort, wo es sinnvolle Stückelungen von komplizierten Berechnungen braucht und das nicht keineswegs etwas nur für die "Profis".

Sorry, du hinterlässt hier den Eindruck nichts über den Unterschied zwischen "variable" in C u.ä.-Programmiersprachen und dem in VHDL/FPGA zu wissen. Und das es 'signal' in VHDL gibt. Und "komplizierte Berechnungen" werden im FPGA nicht "gestückelt" sondern ge-'pipelined'.

Dabei wurde das mehr als einmal durchgekaut:

Beitrag "Globale Variablen in VHDL" Beitrag "VHDL variable vs signal" Beitrag "VHDL: Variable in Prozesse" Beitrag "Variable vs Signal" Beitrag "Variable's Initial Value VHDL"

der aber durch die Art und Weise der Diskussion und des vorgebrachten stils jedermann abschreckt, teilzunehmen.

Vielleicht wird ja hier nicht diskutiert (Palaver unter Gleich-/(Halb|Un)-Wissenden) sondern Wissen/Erfahrung von Wissenden (Befragten) zum Un-/Falsch-Wissenden (Frager) verteilt?

Ja vielleicht geht es ja auch genau darum, Mistige Offtopic-Diskussionen über des Kaisers Bart, seine Stil, seinen Tenor und seine Manieren von Beginn an zu unterbinden?!

Warum treibst du dich überhaupt im Forum herum? Offensichtlich nicht, um (von den Besten) zu lernen!

#7395346
Lesenswert?

DSGV-Violator schrieb:

Und "komplizierte Berechnungen" werden im FPGA nicht "gestückelt" sondern ge-'pipelined'.

Das sind verschiedene Dinge.

Ja, es gibt Pipelines, das sind dann mehere Takte.

Man kann Rechnungen aber auch zerteilen und trotzdem in einem Takt laufen lassen. Sinnvoll ist das, wenn die Rechnung von Dingen abhängt. Dann kann man die Einzelteile mit Variablen rechnen und dann abhängig vom Wert dieser Variablen im gleichen Takt daraus ein Ergebnis errechnen und einem Signal zuweisen.

Ist aber auch egal, das mit den Variablen gibt es schlicht nicht in Hardware, da gibt es nur FFs, LUTs, Leitungen, und Spezialkram. Variablen sind nie zwingend notwendig, man kann das immer auch mit Signalen lösen, aber Variablen sind ein sehr hilfreiches Konstrukt, das einem das Leben einfacher macht. Sie verhalten sich aber auch anders als Signale. Das sollte man wissen und sie dementsprechend korrekt verwenden. Aber was schreibe ich hier eigentlich? Jeder der mit irgendwelchen Werkzeugen arbeitet, sollte diese kennen und beherrschen. Mit Variablen sicher umzugehen sollte für einen Entwickler der mit VHDL zu tun hat genauso selbstverständlich sein wie der Umgang mit numeric_std oder ... das ist eben Teil des Handwerkzeugs.

Gast #7395403
Lesenswert?

DSGV-Violator schrieb:

Sorry, du hinterlässt hier den Eindruck nichts über den Unterschied zwischen "variable" in C u.ä.-Programmiersprachen und dem in VHDL/FPGA zu wissen.

Ganz im Gegenteil, der Umstand dass du den Sinn von Variablen im Bezug auf das Aufspalten von Gleichungen nicht verstehst und wild herumzitierst, zeigt, dass du nichts wesentliches kennst.

DSGV-Violator schrieb:

werden im FPGA nicht "gestückelt" sondern ge-'pipelined'.

Falsch. Variablen werden in Prozessen unter anderem dazu benutzt, dass KEINE pipeline entsteht, sondern es in einem Takt berechnet wird. Die Rechung ist nur nicht sinnvoll in einem einzigen VHDL-Konstrukt niederzuschreiben.

Du scheinst mit komplexeren VHDL-Aufgaben nichts zu tun zu haben.

Gast #7395439
Lesenswert?

Sorry, du hinterlässt hier den Eindruck nichts über den Unterschied zwischen "variable" in C u.ä.-Programmiersprachen und dem in VHDL/FPGA zu wissen.

Ganz im Gegenteil, der Umstand dass du den Sinn von Variablen im Bezug auf das Aufspalten von Gleichungen nicht verstehst und wild herumzitierst, zeigt, dass du nichts wesentliches kennst.

Naja, eins drüber steht richtig das es in einer FPGA-Implementierung keine "variables" (mehr) gibt. Was willst Du hier also auf Biegen und Brechen beweisen?

Und was regst Du Dich über angebliches "wildes Herumzitieren" künstlich auf? Es ist üblich, das man seine Aussagen mit Links belegt. Und warum soll man sich die Mühe machen, einem halsstarrigen und in seine Achtelwahrheiten verliebten Famulus vorzukauen und in mundgerechte Stücke zerlegt einzutrichtern, wenn sich der entsprechende Lehrtext mit Klick erreichen lässt? Wenn der Famulus sich weigert, dem Click zu folgen und sich mit dem Lehrtext auseinanderzusetzen - sein Problem, stirbt er halt dumm.

Die Rechung ist nur nicht sinnvoll in einem einzigen VHDL-Konstrukt niederzuschreiben.

Klar kann es "sinnvoll" sein eine komplexere Berechnung in einen einzigen VHDL-Konstrukt bspw. einem process festzuhalten. Die "Lesbarkeit", insbesonders die durch ein Script-Kiddie ist eine andere Frage. Bring doch mal ein konkretes Source-beispiel. Aber bitte in einem neuen thread, den haste schon genug mit off-topic zugemüllt.

Und in Zeiten von VHDL-Generatoren wie simulink und verschlüsselten IP-Netzlisten ist die Rätselei über die Typografie eines VHDL-Pedants ohnehin müßig.

Du scheinst mit komplexeren VHDL-Aufgaben nichts zu tun zu haben.

Jajajaj, wir wissen alle das du nicht bereit ist anzuerkennen, wer hier praktische Erfahrungen hat und wer hier grad nur heisse Luft angereichert mit Pseudo-Buzzwords wie "VHDL-Konstrukte" oder "einschlägige Variablenklasse" aus den Backen drückt. Auch schon damit, das jemand eine andere Herangehensweise hat und in deiner nur nebulös beschriebenen Vorgehensweise keinen Vorteil sieht ist ein Affront für Dich, worauf der Thread mit offtopic wie "Hilfe, ich werde herablassend behandelt" oder "Der xyz hat keine Manieren" zugekackt wird. Echt, damit stiehlt man anderen Leuten nur die Zeit.

#7395552
Lesenswert?

Jürgen S. schrieb:

Generell stimme ich da zu, aber man muss Aufwand und Nutzen abwägen. Die Skalierbarkeit erfordert einen nicht unerheblichen Mehraufwand und das nicht nur beim Programmieren. Die Möglichkeiten, die sich daraus ergeben, müssen auch untersucht und gfs. eingeschränkt werden - gerade bei Anforderungen an den Code in bestimmten Branchen. Bei der Verifikation ist es auch einfach durchsichtiger mit tatsächlich konstanten Werten zu arbeiten, die evident sind und nicht nachvollzogen werden müssen.

Klar muss man den Aufwand und Nutzen abwägen, wir haben auch immer ein begrenztes Budget. Wenn man etwas zum ersten mal macht, dann lieber weniger flexibel und sehr eingeschränkt. Man weiss ja gar noch nicht, ob es so klappen wird und was man braucht. Später stellen sich die Wünsche dann von selber ein, dann entwickelt man es weiter in diese Richtungen, wo mehr flexibilität gefordert wird. Oder eben auch nicht, wenn keine Wünsche bestehen. Die Testbenchs existieren ja, also kann ich da was umbauen und bin sicher, das der frühere use-case noch geht.

Jürgen S. schrieb:

Ich empfehle bei den wachsenden Komplexitäten der FPGA Designs damit allen Kunden und Entwiclern, sich generell genau zu überlegen, wieviel man in resuability stecken will, die am Ende keinen Benefit hat sondern noch Probleme aufwirft.

Geh mal in die Raumfahrt, da zählt design reuse und heritage mehr als alles andere. Ob der alte code jetzt was taugt oder nicht ist egal, am Besten ist er schon mehrere male geflogen.

Neu schreiben braucht eine neue Qualifikation, umschreiben/erweitern erfordert nur eine delta-Qualifikation. Das macht es wirtschaftlich interessant.

DSGV-Violator schrieb:

Das ist ein weiterer Lösungsansatz für das Problem des TO, den Wert der constant nicht per VHDL-Boardmittel zu bestimmen, sondern in einem extra script (Pyzhon,C,TCL/TK,csh,...) das dann den entsprechenden VHDL code als txt-string ausgibt.

Ja, nutzen wir auch in verschiedenen Ausprägungen. Z. B. Excel um Registeradressen zu verwalten, ist gleichzeitig Dokumentation, VHDL code generierung und Matlab code generierung. Python um AXI slaves aus YAML zu bauen Matlab um Stimuli und expected responses für Testbenches zu rechnen etc.

Markus F. schrieb:

der TO wollte die Konstante "2", dargestellt in einem wohl bereits längst vorliegenden, über Generics steuerbar variablen Fixed-Format initialisieren.

Keine Saturn-Rakete starten.

Nicht Saturn sondern Jupiter :-) Vielleicht hat es was mit Bepi-Colombo und JUICE zu tun.

DSGV-Violator schrieb:

Wenn ich mich recht erinner wird das vom modelsim und XST mit ner warning ("Non-locally static" o.ä. ) quittiert. Auch die Verwendung eines Functionsaufrufes (bei der Typ-Convertierung bspw.) kann bei der Konstantendeclaration (unnötige?) warnings/errors hervorbringen.

Ja, manche lesen sich alle Warnings während der Compilaton/Synthese durch, andere nicht. Und ja, 'ne warning ist nur 'ne warning.

Ja, lesen und VERSTEHEN all dieser log Einträge gehört hier dazu und vordere ich auch ein. In diesem Fall gibt es keine Non-locally static Warnung. An anderer Stelle im selben code schon, kommt drauf an, wie die Konstante dann genutzt wird. In einem Case statement z. B. kommt dann diese Warnung.

Und ja, 'ne warning ist nur 'ne warning.

Es gibt Projekte und Kunden, wo wir am Projektende im Verification Report für jede Warning eine Begründung angeben müssen, wieso sie akzeptabel ist (Waiver). Ein Astronaut hat ein lebendiges interesse daran, ob es nur eine Warnung ist oder doch etwas Wichtiges.

Gast #7395620
Lesenswert?

Keine Saturn-Rakete starten.

Nicht Saturn sondern Jupiter :-) Vielleicht hat es was mit Bepi-Colombo und JUICE zu tun.

Interessant. Kommst Du da nicht ein wenig zu spät? Ich meine letztere Mission wäre vergangene Woche losgeflogen, erstere längst unterwegs?

Also bezugnehmend auf das geflügelte Wort von der "rocket science" war wohl weder eine Planetenmission zum ♄ oder zum ♃ gemeint, sondern schlicht die Trägerrakete "Saturn": https://de.wikipedia.org/wiki/Saturn_(Rakete)

Ja, diese Trägersystemfamilie ist schon ein Prachtstück Deutsch-Amerikanischer Ingenieurskunst aus längst vergangenen Tagen. Ist hier auch schon diskutiert worden, wie es sich gehört, im Offtopic: Beitrag "Die NASA behauptet" Beitrag "Damit wollen die auf dem Mond gewesen sein?"

#7395704
Lesenswert?

Markus F. schrieb:

Interessant. Kommst Du da nicht ein wenig zu spät? Ich meine letztere Mission wäre vergangene Woche losgeflogen, erstere längst unterwegs?

Wir bzw. meine älteren Arbeitskollegen waren beides mal rechtzeitig :-) Jetzt müssen wir gucken, dass wir für die nächsten Missionen rechtzeitig sind. Und da brauche ich jetzt eben Erweiterungen, die die ursprüngliche Rechnung mit Integern nicht mer hergibt. Darum die Frage, wie man das sauber in VHDL machen könnte, so dass es sowohl in der alten Variante wie mit der neuen läuft, also testbar ist.

Da es eine 2 ist, habe ich mir ja dann einen passenden Vektor zusammengebastelt anstatt zu rechnen. Löst mein Problem aber ich hätte gehofft, dass es da eine universellere Lösung gäbe, die ich auch sonst anwenden kann.

DSGV-Violator schrieb:

Also bezugnehmend auf das geflügelte Wort von der "rocket science" war wohl weder eine Planetenmission zum ♄ oder zum ♃ gemeint, sondern schlicht die Trägerrakete "Saturn": https://de.wikipedia.org/wiki/Saturn_(Rakete)

Klar hatte ich das verstanden. Aber Raketen sind im Vergleich ja "einfach", deren Job ist nach 5-20 min erledigt. Unser Zeug fliegt zum Teil erst mal 8 Jahre zum Einsatzgebiet oder in den Anforderungen steht z. B. dass es 15 Jahre funktionieren muss.

#7395767
Lesenswert?

Christoph Z. schrieb:

Unser Zeug fliegt zum Teil erst mal 8 Jahre zum Einsatzgebiet oder in den Anforderungen steht z. B. dass es 15 Jahre funktionieren muss.

... tut's leider nicht immer. Ich habe (das ist schon so lange her, dass es kaum mehr wahr ist) Teile der Telemetriesoftware für ein Raummodul des ERS-1 geschrieben. War gut genug, um den RAMs des 8-Prozessor-Z80-Moduls für ein paar Stunden nach dem Launch beim Latch-Up zuzugucken... War zum Heulen.

Beitrag #7395789 wurde von einem Moderator gelöscht.
Beitrag #7395823 wurde von einem Moderator gelöscht.
Gast #7395833
Lesenswert?

Christoph Z. schrieb:

Klar hatte ich das verstanden. Aber Raketen sind im Vergleich ja "einfach", deren Job ist nach 5-20 min erledigt.

Ist halt ne Frage wo der Ort der "unangenehmsten" Strahlendosis liegt. Das kann auch schon mal der van-Allen-Gürtel in kanapp 1k km Höhe sein oder die südatlantische Anomalie deren Durchquerung in 1700 km Höhe für den Ausfall der Elektronik in den Globalstarsatelliten verantwortlich gemacht wird. Oder die sonde wird völlig unerwartet durch einen Sonnensturm "abgeschossen" wie 2002 "Nozomi" beim Earth swing-by.

Aber auch für solche elektronik und Space Betrachtungen gibt es threads in den passendere subforen:

Beitrag "Mikroprozessor in der Raumfahrt" Beitrag "weltraumtaugliche Mikrocontroller" Beitrag "Elektrotechnik und Raumfahrt?"

Gast #7395941
Lesenswert?

DSGV-Violator schrieb:

Eigentlich wird empfohlen, zum Rechnen überhaupt keine Vektoren zu benutzen. Dafür gibt es die einschlägigen Variablenklassen.

Variablenklassen? In VHDL? Lass mal sehen!

Du hast keine Ahnung von VHDL, außer dem bissle, was du selbst verwendest.

DSGV-Violator schrieb:

wenn man genau weiß was man damit tut und sich bewusst ist, das man sich damit u.U. Unterschiede im Verhalten in Simulation und Synthese einhandelt.

Welche sollten das denn bitte sein? Variablen werden in beiden Welten genau gleich gehandhabt, wer da Unterschiede sieht, hat den Sinn nicht verstanden und aufgrund seines eigenen Unwissens falsche Erwartung gehabt.

Die Variablen werden immer und zu jeder Zeit vom Compiler in gleicher Weise behandelt und interpretiert - inbegriffen ihres Auftretens und Position im Code und der sich ergebenden zeitlichen Abarbeitung. Das ist der große Vorteil gegenüber Signalen. Ohne Variablen gäbe es keine Schleifen und somit keine Möglichkeit, identische Gebilde in einem Design mehrfach automatisch aufzubauen.

Gast #7395986
Lesenswert?

Georg B. schrieb:

Eigentlich wird empfohlen, zum Rechnen überhaupt keine Vektoren zu benutzen. Dafür gibt es die einschlägigen Variablenklassen.

Variablenklassen? In VHDL? Lass mal sehen!

Du hast keine Ahnung von VHDL, außer dem bissle, was du selbst verwendest.

Das ist keine Antwort! Was meinst Du mit "einschlägiger Variablen-Klasse" als Ersatz für den Typ Vector?! Tipp: ein Codebeispiel sagt mehr als hundert peinliche Beleidigungsversuche.

wenn man genau weiß was man damit tut und sich bewusst ist, das man sich damit u.U. Unterschiede im Verhalten in Simulation und Synthese einhandelt.

Welche sollten das denn bitte sein? Variablen werden in beiden Welten genau gleich gehandhabt, wer da Unterschiede sieht, hat den Sinn nicht verstanden und aufgrund seines eigenen Unwissens falsche Erwartung gehabt.

Mumpitz! In C u.ä. sind Variablen Speicherstellen (Register, Arbeitsspeicher) im FPGA dagegen Simualtionsobjekte ohne timestamp. Nach der Synthese sind variable oft nur reine Leitungsbündel oder auch mal böse Latches. Kann man gerne im synthesis style guide nachlesen. Dort steht beispielsweise "Chapter 3: XST HDL Coding Techniques The XST VHDL analyzer accepts shared variables, but errors out in the HDL Synthesis step if a shared variable does not describe a valid RAM macro." Oder " WARNING: [Synth 8-327] inferring latch for variable 'Q_reg'"

https://www.xilinx.com/content/dam/xilinx/support/documents/sw_manuals/xilinx14_7/xst.pdf https://docs.xilinx.com/r/en-US/ug901-vivado-synthesis/Flip-Flop-Registers-with-Rising-Edge-Clock-Coding-Example-VHDL

Die Variablen werden immer und zu jeder Zeit vom Compiler in gleicher Weise behandelt und interpretiert - inbegriffen ihres Auftretens und Position im Code und der sich ergebenden zeitlichen Abarbeitung. Das ist der große Vorteil gegenüber Signalen.

Das ist eher ein Nachteil, kein Vorteil, weil die Signalverzögerung im FPGA nun mal real ist. Deshalb entstehen ja u.U. böse Unterschiede zwischen Simulation und "wahren FPGA Leben".

Ohne Variablen gäbe es keine Schleifen und somit keine Möglichkeit, identische Gebilde in einem Design mehrfach automatisch aufzubauen.

Jetzt sprichste aber von den generate resp. loop 'Variablen'. Das ist was anderes als die variable die man in processen/subprogramms deklariert .

In loop und generate gibt es beispielsweise keinen typ *vector, sondern nur integer oder enum mit range. Und im LRM heisst es an dieser Stelle (loop, generate) nicht "variable" sondern "parameter" , genauer "parameter_specification". (VHDL 2000 abschnitt 635 (generate), 465 (loop), im Gegensatz dazu: 215 (variable declaration)

Kann man auch gerne im LRM aka Standard nachlesen: https://peterfab.com/ref/vhdl/vdlande/generate.html https://edg.uchicago.edu/~tang/VHDLref.pdf

Ehrlich, nachdem du grad öffentlich demonstrierst hast, das du nicht in der Lage bist variables und Schleifenparameter auseinderzuhalten, wird der Unsinn in der Behauptung Beitrag "Re: Konstanten berechnen >2**32" noch offensichtlicher.

Und das Du auch noch 4d später keinerlei Begründung vorbringen kannst sondern nur einen kindischen persönlichen Angriff weist auf eine Lernresistenz, ja -ablehnung hin.

#7396013
Lesenswert?

DSGV-Violator schrieb:

The XST VHDL analyzer accepts shared variables, but errors out in the HDL Synthesis step if a shared variable does not describe a valid RAM macro."

Hier zitierst Du "shared Variable". Das ist was anderes als eine simple Variable.

Die kann man nur innerhalb eines Prozesses benutzen (und bringt ihre Werte nur über Signale nach aussen), die shared Variable kann man - wie ein Signal - prozessübergreifend benutzen.

Gast #7396028
Lesenswert?

Markus F. schrieb:

DSGV-Violator schrieb:

The XST VHDL analyzer accepts shared variables, but errors out in the HDL Synthesis step if a shared variable does not describe a valid RAM macro."

Hier zitierst Du "shared Variable". Das ist was anderes als eine simple Variable.

Das LRM definiert shared variable als Untergruppe der variable, wohl weil das Verhalten das selbe ist.

"There are four classes of objects: constants, signals, variables, and files. The variable class of objects also has an additional subclass: shared variables."

Bei dem Beispiel -hier dualported RAM- funktioniert die Beschreibung in einem einzelnen Prozess nur in sehr wenigen Fällen, wenn überhaupt.

Die kann man nur innerhalb eines Prozesses benutzen (und bringt ihre Werte nur über Signale nach aussen), die shared Variable kann man - wie ein Signal - prozessübergreifend benutzen.

Auch architecture übergreifend? in subprograms darf es wohl wieder nie shared sein. "It is an error if a variable declaration in a subprogram declarative part declares a shared variable. (See 4.3.1.3 and 8.1.4.)"

"Variables declared immediately within subprograms and processes must not be shared variables."

Shared variables sollte auch relativ neu sein, der TO schliesst ja VHDL-2019 explizit aus. shared gibt es ab VHDL-1993. Das sollte aber wohl die heute benutzen tools unterstützen.

https://support.xilinx.com/s/question/0D52E00006hpgdTSAQ/can-vhdl-shared-variables-be-synthesized?language=en_US

Bei Quartus (Altera) könnte es bis 2009 gedauert haben bis sharerd variables unterstütz wurden: https://groups.google.com/g/comp.lang.vhdl/c/5N__T6TLehI

Gast #7396142
Lesenswert?

Bei dem Beispiel -hier dualported RAM- funktioniert die Beschreibung in einem einzelnen Prozess nur in sehr wenigen Fällen, wenn überhaupt.

Huh?

Zwei Taktdomainen erfordern zwei Prozesse mit jeweils eigenen Takt in der sensetivity list. Und dualport Rams werden eben gern an der Grenze zweier unabhängig getaktete Systeme eingesetzt (Sync-Fifo, Framebuffer, mem-cache,...).

Oder welches andere FPGA-Element würde wohl zwei Driver gleichzeitig erlauben?

Eine variable ist ein VHDL-Element und nicht unbedingt ein "FPGA-Element". Wie der Simulator und ggf. Synthese mit mehreren Treibern umgeht ,ist eine Frage der "resolution function" und damit des verwendetetn type.

  • std_logic -> mit resolution function
  • std_ulogic -> without resolution function

Einfach mal in den source code der 1164 Biblithek schauen, sollte doch jeder toolchain beiliegen. Muss man sich mal die zeit nehmen den source zu lesen und ggf einen VHDL-Standard zu Erläuterung der details benutzen.

1
   -------------------------------------------------------------------    
2
    -- resolution function
3
    -------------------------------------------------------------------    
4
    CONSTANT resolution_table : stdlogic_table := (
5
    --      ---------------------------------------------------------
6
    --      |  U    X    0    1    Z    W    L    H    -        |   |  
7
    --      ---------------------------------------------------------
8
            ( 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U' ), -- | U |
9
            ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), -- | X |
10
            ( 'U', 'X', '0', 'X', '0', '0', '0', '0', 'X' ), -- | 0 |
11
            ( 'U', 'X', 'X', '1', '1', '1', '1', '1', 'X' ), -- | 1 |
12
            ( 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', 'X' ), -- | Z |
13
            ( 'U', 'X', '0', '1', 'W', 'W', 'W', 'W', 'X' ), -- | W |
14
            ( 'U', 'X', '0', '1', 'L', 'W', 'L', 'W', 'X' ), -- | L |
15
            ( 'U', 'X', '0', '1', 'H', 'W', 'W', 'H', 'X' ), -- | H |
16
            ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' )  -- | - |
17
        );
18
        
19
    FUNCTION resolved ( s : std_ulogic_vector ) RETURN std_ulogic IS
20
        VARIABLE result : std_ulogic := 'Z';  -- weakest state default
21
    BEGIN
22
        -- the test for a single driver is essential otherwise the
23
        -- loop would return 'X' for a single driver of '-' and that
24
        -- would conflict with the value of a single driver unresolved
25
        -- signal.
26
        IF    (s'LENGTH = 1) THEN    RETURN s(s'LOW);
27
        ELSE
28
            FOR i IN s'RANGE LOOP
29
                result := resolution_table(result, s(i));
30
            END LOOP;
31
        END IF;
32
        RETURN result;
33
    END resolved;

und ggf kann man signaltreiber, die im moment zuviel sind per null abschalten:

https://www2.cs.sfu.ca/CourseCentral/250/ggbaker/VHDL/cookbook/cb-6.pdf

Gast #7396459
Lesenswert?

Markus F. schrieb:

X-Syntheseguidelines empfehlen für das Inferral von echtem Dual Clock Dual Port RAM Shared Variablen.

Grad mal in die UG901 geschaut, da gibt es für symmetrische Datenport die variable und für unsymmetrische signal variante, bei beiden jeweils typ array of std_logic_vector. und damit hätte der TO kein Problem mit der integer 32bit Grenze.

Bei den unsymmetrischen DP-RAMS und bei den FIFO's kann man aber auch mit anschaulicheren Block-memory-Generator o.ä. arbeiten. Nicht das man einen Parameter (read nefore write o.ä.) übersieht. Bei Angabe der Init-werte kann man in diesem Fall auch auf VHDL Boardmittel verzichten.

Eine direkte Empfehlung konnte ich beim Überfliegen nicht ausmachen. Bei Speicher wird meines Wissens häufiger auf den generator als auf handgeschrieben Code verwiesen. Grad bei sync-fifos an Verschiedenen clock domainen tut man es sich mit genrierten Code leichter, bspw beim Vergleich von speicherpointern zur ermiitöung der Füllstandflags.

#7397027
Lesenswert?

Juergen S schrieb :

Naja, 2 x (2 hoch 15) sind zusammen mit dem Vorzeichen eben 32 Bit.

Naja, vielleicht in VHDL. In Realitaet ist

2^15 -> 15 bit +-2^15 -> 16 bit 2* (+-2^15) -> 17 bit

Falls man nun etwas Generisches verwenden will, welches dann ein Vielfaches von 8 bit ist, waeren 24 oder 32 bit voll genuegend.

Gast #7397048
Lesenswert?

Purzel H. schrieb:

Juergen S schrieb :

Naja, 2 x (2 hoch 15) sind zusammen mit dem Vorzeichen eben 32 Bit.

Naja, vielleicht in VHDL. In Realitaet ist

2^15 -> 15 bit +-2^15 -> 16 bit 2* (+-2^15) -> 17 bit

Naja, da haste wohl die (Ingenieurs-) Kurzschrift vom Jürgen gründlich missverstanden oder gar absichtlich fehlinterpretiert um hier jemanden "einen Fehler anzuhängen".

mit:

  • "2 x (2 hoch 15)" ist wohl gemeint das:
  • zwei jeweils 15 bit lange Zahlen (+1bit für Vorzeichen) miteinander multipliziert werden

In dem Fall braucht man für die tatsächliche Realität doch mehr als 17 bit für das Resultat ... Zweiundreißig bit sind da schon angemessen, auch wenn es ein bit weniger auch machen würde.

Das geht auch aus dem Kontext des TO-Postings ("2*WIDTH ... Konstante zusammen mit multiplizierten> Werte benutzt ...") hervor und sollte doch jedem als Digitaltechnik-Grundlage bekannt sein: bei einer Multiplikation reserviert man für das Ergebnis soviel bits wie für die einzelnen Faktoren zusammen. Und eigentlich wird das schon in der Grundschule gelehrt, wenn auch für das Zehner und nicht für das Binärssystem.

Gast #7397322
Lesenswert?

Markus F. schrieb:

DSGV-Violator schrieb:

ist wohl gemeint das:

  • zwei jeweils 15 bit lange Zahlen (+1bit für Vorzeichen) miteinander multipliziert werden

Das nun ganz bestimmt nicht. Das würde bedeuten, dass -1 0x80000001 entspräche und dass wir plötzlich eine positive und eine negative 0 hätten. Das sind zwei 16 Bit lange Zahlen in Zweierkomplementdarstellung. Wenn schon.

Und? Auch im Zweierkomplement entspricht ein bit dem Vorzeichen. Nur das mit der Inversion dieses Vorzeichen-Bits auch der Betrag (Bedeutung der nicht-Vorzeichensbits) der selben ändert, weil der Wertebereich nicht mehr symmetrisch zur 0 ist.

Bei 16 bit 2'er complement hat man den Bereich von:

1
 (-) (2**15)  bis (+) (2**15 - 1).

https://de.wikipedia.org/wiki/Zweierkomplement#Motivation

Die Maximale stellen anzahl wäre bei 2 complement 16bit Faktoren

1
(-) 32768           * (+) 32767           = -1073709056 =
2
1000_0000_0000_0000 * 0111_1111_1111_1111 =
3
1100_0000_0000_0000_1000_0000_0000_0000 (lt. Windows Taschenrechner)

also 32 bit und nicht 17 bit für das Produkt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren