Forum: FPGA, VHDL & Co. Suche max. Bitvektor


von pico (Gast)


Lesenswert?

Hallo Zusammen,

ich möchte gerne eine beliebige Anzahl an Bitvektoren auf den 
Maximalwert untersuchen. Zu Beginn und zur Überschaubarkeit habe ich 4 
12 Bit Vektoren, welche ich vergleichen möchte.

Hier der Code:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
5
6
entity MAX is
7
    Port (   CLK     : in STD_LOGIC;
8
      --  max_value : out  STD_LOGIC_VECTOR (11 downto 0);
9
        result   : out STD_LOGIC_VECTOR (1 downto 0)
10
      );
11
end MAX;
12
13
architecture Behavioral of MAX is
14
--signal max_value : STD_LOGIC_VECTOR (11 downto 0) := "000000000000";
15
signal comparison : STD_LOGIC_VECTOR (1 downto 0);
16
17
signal value1 : STD_LOGIC_VECTOR (11 downto 0) := "000000000011";
18
signal value2 : STD_LOGIC_VECTOR (11 downto 0) := "000000000111";
19
signal value3 : STD_LOGIC_VECTOR (11 downto 0) := "010101010101";
20
signal value4 : STD_LOGIC_VECTOR (11 downto 0) := "000000000001";
21
22
begin
23
24
wait until rising_edge(CLK);
25
  comparison <= (value1 > value2) & (value3 > value4); 
26
  case comparison is
27
    when "00" => result <= value2 > value4;
28
    when "01" => result <= value2 > value3;
29
    when "10" => result <= value1 > value4;
30
    when others => result <= value1 > value3;
31
  end case;  
32
33
end Behavioral;

Es wird jedoch immer auf die wait Anweisung und den Case verwiesen, dass 
dort ein Fehler ist. --




Wenn ich das in einen Prozess mache, funktioniert es ebenfalls nicht.

1
process (CLK)
2
  comparison <= (value1 > value2) & (value3 > value4); 
3
  case comparison is
4
    when "00" => result <= value2 > value4;
5
    when "01" => result <= value2 > value3;
6
    when "10" => result <= value1 > value4;
7
    when others => result <= value1 > value3;
8
  end case;
9
end process;

Wäre über einen Hinweis sehr dankbar, Viele Grüße,

pico

von P. K. (pek)


Lesenswert?

pico schrieb:
> Wenn ich das in einen Prozess mache, funktioniert es ebenfalls nicht.

Zum einen machst Du in Deinem Prozess nichts mit dem CLK (e.g. if 
rising_edge(CLK)...), zum zweiten stimmen die Typen nicht überein, 
welche Du zuweist ("result" ist ein 2-Bit-Vektor und das Resultat von 
">" ist ein Boolean...)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

pico schrieb:
> Es wird jedoch immer auf die wait Anweisung und den Case verwiesen
Im ersten Fall musst du das wait in einen Prozess packen.

Im zweiten Fall hast du 1.ein Syntaxproblem
1
process (CLK)   BEGIN
und 2. ein Verständnisproblem, denn in dem Prozess wird gar kein Takt 
verwendet!

Prinzipiell braucht dieser Vergleicher aber sowieso keinen Takt...

> comparison <= (value1 > value2) & (value3 > value4);
Ein Vergleich ergibt true oder false. Ein Signal vom Typ std_logic 
kennt aber nur die Werte U,X,0,1,L,H,W,Z,-
In dieser Aufzählung ist kein true und kein false dabei. Deshalb 
kann auch eine Aneinanderkettung von Vergleichsergebnissen nie an einen 
std_logic_vector erfolgen!

Überhaupt:
Mit Vektoren rechnet man nicht!
Ist z.B. 1110 größer als 0110?
Es ist größer, wenn die Vektoren unsigend sind.
Es ist kleiner, wenn die Vektoren signed sind!

Zusammenfassend: dein Problem liegt hauptsächlich erst mal in der 
strengen Typverwaltung von VHDL. Da kann man nicht einfach irgendwas 
zusammenpappen und vergleichen und hoffen, das das dann tut...

von pico (Gast)


Lesenswert?

Vielen Dank für den sehr ausführlichen und guten Hinweis. Ich merke 
immer wieder, wieviele Dinge zu beachten sind. Da hat man eine Idee, 
welche für einen total logisch ist und stellt in der Umsetzung immer 
wieder fest, dass die Realisierung doch noch von anderen Voraussetzungen 
abhängig ist ;-)

Gruß, pico

von Duke Scarring (Gast)


Lesenswert?

pico schrieb:
> use IEEE.STD_LOGIC_ARITH.ALL;

Wenn das kein Bestandscode ist, soondern was Neues würde ich ihn gleich 
umbauen:
Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"

Duke

von pico (Gast)


Lesenswert?

Ich habe das Problem jetzt mit einer State Machine und mit if 
Anweisungen gelöst. Ich vergleiche also immer zwei Bitvektoren und 
schreibe den größeren der beiden in einen Maximalvektor. Also Vektor 1 
mit 2, daraus den Maximalwert mit Vektor 3 usw....

Für wenige Elemente ist dies ja noch überschaubar, jedoch ist diese 
Methode für eine Menge größer 2000 Elemente mit Hilfe einer Statemachine 
überhaupt geeignet? Ich habe nämlich für n Elemente n-1 States.

Oder wie kann man dieses Problem eleganter und recheneffizienter lösen?

von Duke Scarring (Gast)


Lesenswert?

pico schrieb:
> Oder wie kann man dieses Problem eleganter und recheneffizienter lösen?
Wie liegen denn Deine Elemente vor? Seriell oder parallel?
Reicht Deine Zeit aus, um sich die Elemente nacheinander anzuschauen?

Duke

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

pico schrieb:
> für eine Menge größer 2000 Elemente
Woher kommen denn diese Elemente? Die sind doch sicher in einem RAM. Es 
macht keinen Sinn, 2000 Stück 12-Bit-Werte in distributed RAM oder gar 
Flipflops zu speichern....

> jedoch ist diese
> Methode für eine Menge größer 2000 Elemente mit Hilfe einer Statemachine
> überhaupt geeignet? Ich habe nämlich für n Elemente n-1 States.
Sinnvollerweise hast du da maximal 3 States:
1. nächste Adresse berechnen
2. Wert lesen
3. vergleichen und speichern

von Duke Scarring (Gast)


Lesenswert?

Lothar Miller schrieb:
> Sinnvollerweise hast du da maximal 3 States:
Ich würde noch einen vierten ergänzen:

> 1. nächste Adresse berechnen
> 2. Wert lesen
> 3. vergleichen und speichern
4. zurücksetzen

Duke

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.