mikrocontroller.net

Forum: FPGA, VHDL & Co. Problem mit negativem Index


Autor: Hans-Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich übe mich zur Zeit in der Umsetzung von C in VHDL.
Habe noch ein kleines Problem während der Synthese mit Xilinx ISE 10.
Nachfolgend der Auszug aus dem Programmtext.
Das Problem liegt nicht in der Zustandsmaschine.
Der Zustand "forth" wird nicht erreicht weil die Variable i in Zustand 
"second" nicht als negativ erkannt wird.
V und i sind ein Index. v ist nur positive. i kann bzw. muss auch 
negativ werden können damit dies in der Schleife aus dem Zustand 
"second" und "third" erkannt wird und in den Zustand "forth" gesprungen 
wird.
v ist vom Typ index und i vom Typ negativ_index; hat also ein Bit mehr.
Ich kriege die Zuweisung mit Slice nicht so hin das der negative Wert 
von i erkannt wird.
Die Umwandelungen zwischen std_logic_vector und integer sind nur 
Nebensache.

-- Elemente und Index des Heaps bzw. des Dualport-RAM's
subtype element is std_logic_vector (data_width_heap - 1 downto 0);
subtype negativ_index is std_logic_vector (address_width_heap - 1 downto -1);
subtype index is std_logic_vector (address_width_heap - 1 downto 0);
Ein paar hundert Zeilen später:
process_buildheap : process (clock_heap, start_buildheap)
variable v : index;         -- z.B. 8 Bit positive  
variable i : negativ_index; -- 1 bit grösser, i kann negative werden
begin 
  -- v := n/2-1;
  -- for i in v downto 0 loop
    -- downheap(i);
   -- end loop;
    if rising_edge(clock_heap) then
  if start_buildheap = '1' then
  case buildheap_state is
    when zero =>   buildheap_valid <= '0';
    -- n und v sind z.B. 8 Bit
    -- v := n/2-1
  v := std_logic_vector(to_unsigned(to_integer(unsigned(n))/2-1,address_width_heap));
          buildheap_state <= first;
    when first =>  -- 8 Bit an 9 Bit zuweisen mit Slice ?
                  i (address_width_heap-2 downto -1) := v;
                  buildheap_state <= second;
                  -- Start of loop
    when second => -- Prüfe ob negative
                  if to_integer(unsigned(i)) >= 0 then
                    -- downheap_input ist vom Typ index
                         downheap_input <= i (address_width_heap-2 downto -1);
                    start_downheap <= '1';
                            buildheap_state <= third;
                  else
                    -- Wenn negative
                    buildheap_state <= forth;
                  end if;
        when third => if downheap_valid = '1' then
                    start_downheap <= '0';
                    -- Von z.B. 9 Bit decrementieren
                    i := std_logic_vector(to_unsigned(to_integer(unsigned(i)) - 1,address_width_heap+1));
                         buildheap_state <= second;
                  end if;
                  -- End of loop
        when forth => buildheap_valid <= '1';
      end case;
      
    end if;
  end if;
  end process;

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

Bewertung
0 lesenswert
nicht lesenswert
Kannst du mir eklären, was diese Zeile bedeutet:
subtype negativ_index is std_logic_vector (address_width_heap - 1 downto -1);
Ich würde das so interpretieren, dass es nach dem 0. Bit noch
ein -1. Bit gibt. Mithin eine recht unübliche Darstellungsweise.

Auf jeden Fall heißt diese Zeile nicht, dass "negativ_index" bis zum 
Wert -1 gehen kann.


Du wirst übrigens später noch auf wesentlich schwerer zu fassende 
Probleme stoßen, denn ich vermute, dass das nicht der einzige Takt ist:
> if rising_edge(clock_heap) then...
Eine kurze Frage dazu: Wielviele Takte verwendest du?
Wenn die Antwort größer als 1 ist, dann solltest du dir die Geschicht 
mit dem Clock-Enable nochmal genauer anschauen ;-)

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Lothar Miller (lkmiller)

>Eine kurze Frage dazu: Wielviele Takte verwendest du?
>Wenn die Antwort größer als 1 ist, dann solltest du dir die Geschicht
>mit dem Clock-Enable nochmal genauer anschauen ;-)

In der Tat.

Taktung FPGA/CPLD

MFG
Falk

Autor: Hans-Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es wird nur ein Takt verwendet.
Mehrere Takte werden nicht benötigt.
Wie soll ich i definieren damit i auch negativ werden kann und wie 
konvertiere ich i dann in v ? i als integer definieren ?

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

Bewertung
0 lesenswert
nicht lesenswert
> Es wird nur ein Takt verwendet.
Gut ;-)

> i als integer definieren ?
Ja, das ist ein Weg: Subtype zu einem Integer.
Oder die Numeric_Std Lib verwenden und die darin definierten Typ Signed- 
und Unsigned-Vektoren.

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Hans-Werner:

> i kann bzw. muss auch negativ werden können
Ok, also integer oder signed.

> Die Umwandelungen zwischen std_logic_vector und integer sind nur
> Nebensache.
Naja, nein, nicht wirklich, weil:

> if to_integer(unsigned(i)) >= 0 then
Diese Bedingung ist immer wahr, i wird nie negativ interpretiert.
Und damit kann der else-Zweig auch nie ausgeführt werden.

Duke

P.S.: Mit negativen Ranges würde ich bei ISE sehr vorsichtig sein.

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.