mikrocontroller.net

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


Autor: Jan O. (Firma: keine) (quamstar)
Datum:

Bewertung
0 lesenswert
nicht 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

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

Bewertung
0 lesenswert
nicht 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:
ergebnis(7 downto 0) <= summe(9 downto 2);

Autor: Jan O. (Firma: keine) (quamstar)
Datum:

Bewertung
0 lesenswert
nicht 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

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

Bewertung
0 lesenswert
nicht 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-Vektor...
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...

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Günter (dl4mea) (dl4mea)
Datum:

Bewertung
0 lesenswert
nicht 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

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

Bewertung
0 lesenswert
nicht 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.

Autor: Jan O. (Firma: keine) (quamstar)
Datum:

Bewertung
0 lesenswert
nicht 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);

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

Bewertung
0 lesenswert
nicht 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...
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity AVERAGE is
  Port( 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);
end AVERAGE;

architecture Behavioral of AVERAGE is
signal  SUMME  : unsigned (9 downto 0);
begin
  SUMME <= resize(unsigned(VAL1),10) + resize(unsigned(VAL2),10) +
           resize(unsigned(VAL3),10) + resize(unsigned(VAL4),10);

  VAL_MTW <= std_logic_vector(SUMME(9 downto 2));
end behavioral;

Autor: Wissender (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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

Bewertung
0 lesenswert
nicht 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

Autor: Jan O. (Firma: keine) (quamstar)
Datum:

Bewertung
0 lesenswert
nicht 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;

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

Bewertung
0 lesenswert
nicht 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.

Autor: Jan O. (Firma: keine) (quamstar)
Datum:

Bewertung
0 lesenswert
nicht 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?

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

Bewertung
0 lesenswert
nicht 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...
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

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.