Forum: FPGA, VHDL & Co. Mittelwertberechnung aus vier 8-Bit Zahlen


von Jan O. (Firma: keine) (quamstar)


Lesenswert?

Hey Leute,

bin grade an einem Projekt wo ich einen Mittelwert aus vier 8 Bit Zahlen 
ermitteln muss.

Meine Idee war das ich die Summe der 8 Bit Zahlen durch 2 faches 
Rechtsschieben durch 4 Teilen kann. Nur leider hänge ich Syntaxtechnisch 
momentan fest und bekomme die Division nicht hin. Es sind nur ganze 
Zahlen wichtig,d.h Nachkommastellen werden abgeschnitten. Vielleicht 
kann mir jemand von euch helfen

Danke im Voraus

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


Lesenswert?

Jan Budro schrieb:
> Nur leider hänge ich Syntaxtechnisch
Du hast Glück.
Denn du kennst wenigstens die Sprache, die du verwenden willst... :-/

> Vielleicht kann mir jemand von euch helfen
Vielleicht postest du mal, was du schon hast...

> Nur leider hänge ich Syntaxtechnisch
> momentan fest und bekomme die Division nicht hin.
Ich würde das in VHDL z.B. so machen:
1
ergebnis(7 downto 0) <= summe(9 downto 2);

von Jan O. (Firma: keine) (quamstar)


Lesenswert?

Hab das mal so gemacht:


Entity AVERAGE is
    Port ( CLK : in STD_LOGIC;
     VAL1 : in  STD_LOGIC_VECTOR (7 downto 0);
           VAL2 : in  STD_LOGIC_VECTOR (7 downto 0);
           VAL3 : in  STD_LOGIC_VECTOR (7 downto 0);
           VAL4 : in  STD_LOGIC_VECTOR (7 downto 0);
           VAL_MTW : out  STD_LOGIC_VECTOR (7 downto 0);
           LOAD_VAL : in  STD_LOGIC);
end AVERAGE;



architecture Behavioral of AVERAGE is

signal SUMME : STD_LOGIC_VECTOR (10 downto 0);

begin

process (CLK)
begin

    if rising_edge (CLK) then
      if LOAD_VAL = '1' then
      SUMME <= VAL1 + VAL2 + VAL3 + VAl4;
      VAL_MTW(7 downto 0) <= SUMME(9 downto 2);
      end if;
    end if;
end process;


wenn das wirklich so einfach ist, wäre das ja fast gelacht. Hab dann 
tatsächlich zu kompliziert gedacht. Werde das erstmal durch die TB jagen 
und dann ma bescheid geben.

Vielen Dank erstmal

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


Lesenswert?

Jan Egal schrieb:
> wenn das wirklich so einfach ist, wäre das ja fast gelacht.
Ist es. Es geht sogar noch mehr:
http://www.lothar-miller.de/s9y/archives/65-Vektormanipulation.html
Denn in der Hardware muß da ja nichts irgendwohin geshiftet werden, 
sondern nur ein wenig anders verdrahtet... ;-)

BTW:
Mit Vektoren rechnet man nicht.
Nimm besser das numeric_std-Package
http://www.lothar-miller.de/s9y/archives/14-Numeric_Std.html
und die darin enthaltenen Datentypen signed und unsigned. Dann weiß 
jeder, ob das jetzt vorzeichenbehaftet ist, oder nicht...

von D. I. (Gast)


Lesenswert?

Jan Egal schrieb:

> process (CLK)
> begin
>
>     if rising_edge (CLK) then
>       if LOAD_VAL = '1' then
>       SUMME <= VAL1 + VAL2 + VAL3 + VAl4;
>       VAL_MTW(7 downto 0) <= SUMME(9 downto 2);
>       end if;
>     end if;
> end process;

Wenn du damit leben kannst dass das Ergebnis 2 Takte Latenz hat reicht 
das, ansonsten würde ich die Zuweisung außerhalb des Prozeses machen

von Günter (. (dl4mea)


Lesenswert?

Lothar Miller schrieb:
> Mit Vektoren rechnet man nicht.
> Nimm besser das numeric_std-Package
> http://www.lothar-miller.de/s9y/archives/14-Numeric_Std.html
> und die darin enthaltenen Datentypen signed und unsigned. Dann weiß
> jeder, ob das jetzt vorzeichenbehaftet ist, oder nicht...

Hallo Lothar,

würdest du kurz drauf eingehen warum signed/unsigned und nicht integer?

Ciao, Günter

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


Lesenswert?

Günter (dl4mea) schrieb:
> würdest du kurz drauf eingehen warum signed/unsigned und nicht integer?
Weil du dann soviel hin- und herkonvertieren mußt... ;-)
BTW: probier mal zwei 34-Bit unsigned als Integer zu addieren...  :-o

Natürlich mache ich z.B. Zähler meist als Integer, denn dann sind 
irgendwelche Verleichs- und Zuweisungsoperationen klar zu lesen.

Günter (dl4mea) schrieb:
>> Mit Vektoren rechnet man nicht.
Zum Hintergrund bitte den 
Beitrag "Re: IEEE.STD_LOGIC_ARITH.ALL obsolete" lesen.

von Jan O. (Firma: keine) (quamstar)


Lesenswert?

Hab auch lange gebraucht bis ich herausgefunden habe, was ich mit den 
Vektoren machen kann. Hier die Lösung die auch funktioniert.

entity AVERAGE is
    Port ( CLK : in STD_LOGIC;
        VAL1 : in  STD_LOGIC_VECTOR (7 downto 0);
           VAL2 : in  STD_LOGIC_VECTOR (7 downto 0);
           VAL3 : in  STD_LOGIC_VECTOR (7 downto 0);
           VAL4 : in  STD_LOGIC_VECTOR (7 downto 0);
        VAL_MTW : out  STD_LOGIC_VECTOR (7 downto 0);
           LOAD_VAL : in  STD_LOGIC);
end AVERAGE;




architecture Behavioral of AVERAGE is


signal  SUMME : STD_LOGIC_VECTOR (10 downto 0);
signal VAL1_10 : STD_LOGIC_VECTOR (10 downto 0);
signal VAL2_10 : STD_LOGIC_VECTOR (10 downto 0);
signal VAL3_10 : STD_LOGIC_VECTOR (10 downto 0);
signal VAL4_10 : STD_LOGIC_VECTOR (10 downto 0);


begin


VAL1_10 <= "000" & VAL1;
VAL2_10 <= "000" & VAL2;
VAL3_10 <= "000" & VAL3;
VAL4_10 <= "000" & VAL4;


process (CLK)
begin

    if rising_edge(CLK) then
      if LOAD_VAL = '1' then
      SUMME <= VAL1_10 + VAL2_10 + VAL3_10 + VAL4_10;
      end if;
    end if;
end process;
VAL_MTW(7 downto 0) <= SUMME(9 downto 2);

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


Lesenswert?

Jan Egal schrieb:
> Hier die Lösung die auch funktioniert.
>
> entity AVERAGE is
Und welche Packages sind dafür nötig?
So wie es aussieht nicht die numeric_std...
Ist es jetzt aber die
use IEEE.STD_LOGIC_UNSIGNED.ALL;
oder die
use IEEE.STD_LOGIC_SIGNED.ALL;

Hier mein Kontervorschlag zum Thema: das LOAD_VAL und der Takt scheint 
mir für eine (kombinatorische) Addition unnötig, deshalb lasse ich das 
weg...
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity AVERAGE is
6
  Port( VAL1 : in  STD_LOGIC_VECTOR (7 downto 0);
7
        VAL2 : in  STD_LOGIC_VECTOR (7 downto 0);
8
        VAL3 : in  STD_LOGIC_VECTOR (7 downto 0);
9
        VAL4 : in  STD_LOGIC_VECTOR (7 downto 0);
10
        VAL_MTW : out  STD_LOGIC_VECTOR (7 downto 0);
11
end AVERAGE;
12
13
architecture Behavioral of AVERAGE is
14
signal  SUMME  : unsigned (9 downto 0);
15
begin
16
  SUMME <= resize(unsigned(VAL1),10) + resize(unsigned(VAL2),10) +
17
           resize(unsigned(VAL3),10) + resize(unsigned(VAL4),10);
18
19
  VAL_MTW <= std_logic_vector(SUMME(9 downto 2));
20
end behavioral;

von Wissender (Gast)


Lesenswert?

> Hier mein Kontervorschlag zum Thema: das LOAD_VAL und der Takt scheint
> mir für eine (kombinatorische) Addition unnötig, deshalb lasse ich das
> weg...

Mehr noch, es läuft dem Latenzaspekt zuwider! Das wird schwer zu 
steuern, wann was berechnet werden soll und wann gelatched. Die Laderei 
impliziert ja ein wenig ein Latch auf Datentaktebene, was so noch nicht 
funktieren würde.

Ausserdem sollte man noch runden!

SUMME <= ... +... +... +...  + 2

beovr man die letzten Stellen verwirft.

von D. I. (Gast)


Lesenswert?

Wissender schrieb:
>> Hier mein Kontervorschlag zum Thema: das LOAD_VAL und der Takt scheint
>> mir für eine (kombinatorische) Addition unnötig, deshalb lasse ich das
>> weg...
>
> Mehr noch, es läuft dem Latenzaspekt zuwider! Das wird schwer zu
> steuern, wann was berechnet werden soll und wann gelatched. Die Laderei
> impliziert ja ein wenig ein Latch auf Datentaktebene, was so noch nicht
> funktieren würde.
>
> Ausserdem sollte man noch runden!
>
> SUMME <= ... +... +... +...  + 2
>
> beovr man die letzten Stellen verwirft.

Äh nein

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


Lesenswert?

D. I. schrieb:
>> Ausserdem sollte man noch runden!
> Äh nein
Oder doch?

Nehmen wir mal die Werte:
1 + 1 + 2 + 3     = 7 --> Mittelwert 7/4 = 1
bzw:
1 + 1 + 2 + 3 + 2 = 9 --> Mittelwert 9/4 = 2

von Jan O. (Firma: keine) (quamstar)


Lesenswert?

Sehr clevere Idee, somit muss man sich nicht die Nachkommstellen im 
Register anschauen und auswerten:

Ich habe folgende Libs verwendet

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

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


Lesenswert?

Jan Egal schrieb:
> Ich habe folgende Libs verwendet
Böse, böse...
Schau dir mal die Packages an. Da kommen einige Definitionen doppelt 
vor. Also entweder die alten Synopsis-Libs oder die genormte 
numeric_std.

von Jan O. (Firma: keine) (quamstar)


Lesenswert?

Verstehe nicht ganz was du meinst. Hab bisher immer mit denen gearbeitet 
und gab nie probleme. Könntest du mir das evtl. genauer begründen?

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


Lesenswert?

Jan Egal schrieb:
> Könntest du mir das evtl. genauer begründen?
Lothar Miller schrieb:
> Schau dir mal die Packages an.

In beiden Packages ist z.B. der Datentyp unsigned definiert. Und welcher 
unsigned soll mit welchen Konvertierungsfunktionen im Zweifelsfall 
bearbeitet werden?

Beitrag "Re: Problem mit FSM"
Beitrag "Re: IEEE.STD_LOGIC_ARITH.ALL obsolete"
Beitrag "use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL;"
http://www.mikrocontroller.net/articles/Rechnen_in_VHDL#Schlecht:_Direktes_Rechnen_mit_std_logic_vector
Beitrag "[VHDL] unsigned to bit_vector"

> Hab bisher immer mit denen gearbeitet und gab nie probleme.
Der Tag wird kommen...
BTW:
Wenn du nach dem Motto "Viel hilft Viel" arbeitest: Warum bindest du 
dann nicht gleich auch noch vorsorglich alle möglichen anderen Packages 
ein?
Was spricht dagegen, nur die genormte numeric_std zu verwenden?

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.