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
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); |
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
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...
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
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
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.
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);
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; |
> 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.
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
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
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;
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.