www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Probleme mit std_logic_vector und unsigned


Autor: Nobbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe vor kurzem gelesen, dass man bei der Verwendung von 
ieee.numeric_std.all die Signale in der Entity trotzdem als 
std_logic_vector definieren sollte. Nun habe ich mein Modul umgebaut und 
aus meinen unsigned Signale std_logic_vector gemacht. Prinzipiell sollte 
das doch das Selbe sein, oder? Immerhin wird doch der std_logic_vector 
in diesem Fall auch als unsigned deklariert. Liege ich da richtig?
Jetzt habe ich bei meiner Berechnung immer wieder eine Fehlermeldung:
"RESIZE type specified in Qualified Expression must match 
std_logic_vector type that is implied for expression by context"
Bei folgender Berechnung:
ENTITY 
...
ta       : IN STD_LOGIC_VECTOR(BIT_SIZE - 1 DOWNTO 0);
kr       : IN STD_LOGIC_VECTOR(BIT_SIZE - 1 DOWNTO 0);
dividend : OUT STD_LOGIC_VECTOR(BIT_SIZE - 1 DOWNTO 0);
...
END ENTITY;
...
dividend <= RESIZE(kr * ta, BIT_SIZE); -- BIT_SIZE := 16
Bei der vorherigen Deklaration aller Signale als unsigned gab es keine 
Probleme.
Des weiteren hätte ich noch eine prinzipielle Frage zu numeric_std.
Wie programmiert man am Besten mit dieser library? Also sollte man alle 
Signaldeklarationen in der Entity als std_logic beschreiben und dann im 
Code den cast machen oder schon zu beginn unterscheiden ob signed oder 
unsigned?
Vielen Dank.

Autor: Nobbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, habe nur selbst eine Möglichkeit gefunden das Problem zu lösen.
dividend <= std_logic_vector(RESIZE(UNSIGNED(kr) * UNSIGNED(tv), BIT_SIZE));

Nur kommt mir die Lösung nicht sonderlich geschickt vor. Immerhin, wenn 
ich das nun durch meinen gesamten Code so durchziehe, dann besteht der 
ja zur hälfte nur noch aus typecasts. Ist es hier nicht sinnvoller die 
Entity wie folgt zu deklarieren?
ENTITY 
...
ta       : IN UNSIGNED(BIT_SIZE - 1 DOWNTO 0);
kr       : IN UNSIGNED(BIT_SIZE - 1 DOWNTO 0);
dividend : OUT UNSIGNED(BIT_SIZE - 1 DOWNTO 0);
...
END ENTITY;

Das Synthesetool macht das mit, aber bei der Simulation mit ModelSim 
bekomme ich Probleme, da mein TopDesign diesem Modul Signale vom Typ 
std_logic_vector zuweist und ich in dem Modul bis vor kurzem noch 
UNSIGNED verwendet habe.
Wäre super wenn mir da vielleicht jemand bisschen helfen könnte.
Danke

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Typfehler sollte klar sein, die resize will vmtl einen unsigned und 
du gibst einen std_logic_vector. Du kannst problemlos einen 
std_logic_vector slv mit unsigned(slv) zu einem unsigned machen.

Bzgl prinzipiellem Umgang würde ich innerhalb von entities alles, bei 
dem ein numerischer Datentyp Sinn macht als unsigned deklarieren, den 
Rest als std_logic_vector. Also zb Zähler auf die du Inkrement- oder 
andere numerische Operationen machst als unsigned, dann geht die 
Rechnerei ohne casten. Ein Register, in dem du einzelne Bits abfragst 
als std_logic_vector.

An Port-Grenzen würde ich nur std_logic_vector verwenden.

lg
Matthias

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

Bewertung
0 lesenswert
nicht lesenswert
Nobbi schrieb:
> Nur kommt mir die Lösung nicht sonderlich geschickt vor.
Warum? Ist doch sauber... ;-)
VHDL ist eben mit der strengen Typprüfung etwas geschwätzig.

> Das Synthesetool macht das mit,
Die Synthese kann einiges, was nicht ganz VHDL-konform ist...
> aber bei der Simulation mit ModelSim
> bekomme ich Probleme, da mein TopDesign diesem Modul Signale vom Typ
> std_logic_vector zuweist und ich in dem Modul bis vor kurzem noch
> UNSIGNED verwendet habe.
Klar, wieder die Typprüfung: unsigned /= std_logic_vector

Ich mache das normalerweise ganz einfach nach einem strengen 
Formalismus:
ENTITY 
...
ta       : IN STD_LOGIC_VECTOR(BIT_SIZE - 1 DOWNTO 0);
kr       : IN STD_LOGIC_VECTOR(BIT_SIZE - 1 DOWNTO 0);
dividend : OUT STD_LOGIC_VECTOR(BIT_SIZE - 1 DOWNTO 0);
...
END ENTITY;
...
signal lta       : UNSIGNED(BIT_SIZE - 1 DOWNTO 0);
signal lkr       : UNSIGNED(BIT_SIZE - 1 DOWNTO 0);
signal ldividend : UNSIGNED(BIT_SIZE - 1 DOWNTO 0);
...
-- Signalumwandlungen
lta <= unsigned(ta);         
lkr <= unsigned(kr);
dividend <= std_logic_vector(ldividend);
...
ldividend <= RESIZE(lkr * lta, BIT_SIZE); -- BIT_SIZE := 16
...

Autor: Nobbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Antworten.
Ich denke ich werde das jetzt auch so durchführen, dass ich in der 
Entity die Signale als std_logic_vector deklariere und dann im Modul das 
so erledige wie lkmiller.
Danke nochmal ;-).

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Nobbi:
Solange wie Du im FPGA bleibst, würde ich unsigned/signed verwenden, 
wenn das Signal als Zahl interpretiert wird.

1. Spart man sich das casten und

2. weiss dann der nächste Designer (das könntest auch Du sein), der was 
am Modul ändern muß, gleich wie das Signal zu interpretieren ist.

Ich habe inzwischen immer ein top.vhd in dem die ganzen Pins deklariert 
sind. Die Logik wird in einem eigenen Block zusammengefasst und im 
top-Level instanziiert. Die Castings zwischen der Außenwelt (std_logic) 
und der inneren Logik erfolgen dann im top-Level.
Außerdem lassen sich dort wunderbar DDR- und Tristate-Treiber 
unterbringen.

Somit sind das ucf-File und die Entity von dem top-Modul für 
verschiedene Projekte (auf der selben Hardware) nutzbar.

Duke

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.