Suche max. Bitvektor

Gast #2741793
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
#2741807
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...)
Moderator (Firma: Titel) Persönliche Seite #2741827
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...
Gast #2741849
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
Gast #2742993
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?
Moderator (Firma: Titel) Persönliche Seite #2743071
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

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