mikrocontroller.net

Forum: FPGA, VHDL & Co. std_logic_vector minus 1


Autor: Gabriel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe ein Problem mit einem Standart logic Vector. BITTE sagt mir wie ich 
das rechnen kann.


...
data_in :  IN     std_logic_vector(7 DOWNTO 0) ;
...
SIGNAL count :  std_logic_vector(3 DOWNTO 0 ) ;
...
if count = "0000" then
         txd <= '0'; -- Start-bit
      elsif count >= "1000" then
         txd <= '1';
      else
         txd <= data_in(count - 1); -- GEHT NICHT
      ...

In meinem Code ist natürlich entity, architecture und dgl eingetragen.

DANKE für die Hilfe!!!

Autor: Der Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

probierst doch einfach mal mit nem natural type von range 0 bis 15 für 
count.

Der Besucher

Autor: Der Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach, dir ist klar, das du so wie beschrieben niemals data_in[7] 
selektieren kannst? Aber ich weis ja nicht genau, was du vorhast.
Eine Fehlermeldung wäre auch gut.

Der Besucher

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Am besten wäre aber nicht zu indizieren, sondern zu shiften.
Das kommt der Art, wie FPGA's arbeiten entgegen.

So etwa:

txd <= data(7);
data(7 downto 1) <= data(6 downto 0);

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

Bewertung
0 lesenswert
nicht lesenswert
> txd <= data_in(count - 1); -- GEHT NICHT
Das gibt einen Multiplexer, der wertvolle Logikressourcen verbraucht. 
Besser ist wie schon gesagt, ein Schieberegister. Dazu mußt du 
allerdings die Denkweise komplett umstellen :-/

Bis dahin kannst du es so machen:
  use IEEE.std_logic_1164.all;
  use IEEE.numeric_std.all;
:
:
      txd <= data_in(to_integer(unsigned(count))-1); -- GEHT
Indizieren geht nur mit Integern, deshalb die Umwandlung.
Wenn du die alten Synopsys Libs verwendest (was man nicht tun sollte), 
musst du es so machen:
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
:
:
      txd <= data_in(conv_integer(count)-1); -- GEHT AUCH

Zur Abwechslung kannst du dir mal meine SIO ansehen:
http://www.lothar-miller.de/s9y/categories/42-RS232

Autor: Gabriel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DANKE für Eure Hilfe! Ich hab wieder etwas dazugelernt.

Ich glaube ich werde die Version mit dem Schieberegister ausprobieren.

LG
Gabriel

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.