Mittelwertberechnung aus vier 8-Bit Zahlen

OP (Firma: keine) #1976279
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
Moderator (Firma: Titel) Persönliche Seite #1976287
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);
OP (Firma: keine) #1976336
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
Moderator (Firma: Titel) Persönliche Seite #1976547
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...
Gast #1976582
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
#1976633
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
Moderator (Firma: Titel) Persönliche Seite #1976653
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.
OP (Firma: keine) #1976838
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);
Moderator (Firma: Titel) Persönliche Seite #1976878
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;
Gast #1977185
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.
Gast #1977214
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
Moderator (Firma: Titel) Persönliche Seite #1977784
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?

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