Forum: FPGA, VHDL & Co. Summe von 32 Arrayelemente


von Jad A. (jala)


Lesenswert?

Hallo,

bin ein Anfänger in VHDL, und versuche 32 werte (jeweils 4 bits) zu 
quadrieren und die Summe davon zu bilden. Nach ewigen Versuche klappt 
das einfach nicht !


mein Ansatz (ganz simple mit einer For-schleife !) :


Ich bitte euch um Hilfe !
Vielen Dank !


library IEEE;
library work;
library std;

use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
--use ieee.std_logic_arith.all;
use IEEE.numeric_std.all;
use ieee.math_real;


entity main is

        Port (  EIN                        : in std_logic;
                AUS                        : out std_logic_vector(7 
downto 0));

end main;

architecture Behaviour of main is
---********************************************************************* 
***************************************************--
    Signal tmpOut1 : std_logic_vector(7 downto 0);

--Array

    type MessSignal is array (0 to 31) of std_logic_vector(3 downto 0);
    type Cosinus is array (0 to 31) of std_logic_vector(3 downto 0);
    type CosinusQuadrat is array (0 to 31 ) of std_logic_vector(7 
downto 0 );


begin

    main : process(Ein)



variable Cos : MessSignal;
variable Cos2        :CosinusQuadrat ;     -- sum(cos^2)





variable SummeCos      :std_logic_vector(7 downto 0);

            begin
if Ein = '1' then
               Cos(0) := "0101";
               Cos(1) := "1001";
               Cos(2) := "1110";
               Cos(3) := "0000";
               Cos(4) := "0101";
               Cos(5) := "1010";
               Cos(6) := "0011";
               Cos(7) := "1011";
               Cos(8) := "1110";
               Cos(9) := "0101";
               Cos(10) :="0010";
               Cos(11) :="0101";
               Cos(12) :="0110";
               Cos(13) :="0011";
               Cos(14) := "0000";
               Cos(15) :="1101";
               Cos(17) :="0010";
               Cos(18) :="0110";
               Cos(19) :="1101";
               Cos(20) :="1011";
               Cos(21) :="0100";
               Cos(22) :="0011";
               Cos(23) :="1110";
               Cos(24) := "1111";
               Cos(25) :="0110";
               Cos(26) :="0011";
               Cos(27) :="0101";
               Cos(28) :="0110";
               Cos(29) :="0010";
               Cos(30) :="0001";
               Cos(31) := "0010";

for n in 0 to 31 loop

                Cos2(n) := Cos(n)*Cos(n);
                SummeCos := SummeCos + Cos2(n);
end loop;
tmpOut1 <= SummeCos;

else
           Cos(0) := "0000";
               Cos(1) := "0000";
               Cos(2) := "0000";
               Cos(3) := "0000";
               Cos(4) := "0000";
               Cos(5) := "0000";
               Cos(6) := "0000";
               Cos(7) := "0000";
               Cos(8) := "0000";
               Cos(9) := "0000";
               Cos(10) :="0000";
               Cos(11) :="0000";
               Cos(12) :="0000";
               Cos(13) :="0000";
               Cos(14) :="0000";
               Cos(15) :="0000";
               Cos(17) :="0000";
               Cos(18) :="0000";
               Cos(19) :="0000";
               Cos(20) :="0000";
               Cos(21) :="0000";
               Cos(22) :="0000";
               Cos(23) :="0000";
               Cos(24) :="0000";
               Cos(25) :="0000";
               Cos(26) :="0000";
               Cos(27) :="0000";
               Cos(28) :="0000";
               Cos(29) :="0000";
               Cos(30) :="0000";
               Cos(31) :="0000";

           for n in 0 to 31 loop

               Cos2(n) := Cos(n)*Cos(n);
                SummeCos := SummeCos + Cos2(n);
           end loop;

tmpOut1 <= SummeCos;
end if;
            end process;

                AUS   <= tmpOut1;
end Behaviour;

von cler (Gast)


Lesenswert?

Soll das mal eine Schaltung werden?
Sieht irgendwie nach einer Portierung von C nach VHDL aus :|

von Georg A. (georga)


Lesenswert?

Mal vom Sinn oder oder Unsinn abgesehen, fehlt irgendwo eine 
Initialisierung der Summe auf 0 oder so.... So schleppen sich die 
U(ndefined) durch alle Berechnungen. Und wenn du schon numeric_std 
nimmst, kannst/SOLLST du IEEE.STD_LOGIC_UNSIGNED rauswerfen und dir auch 
signed statt den anonymen std_logic_vector leisten. Ist kürzer zu 
schreiben und vor allem immer korrekt. STD_LOGIC_UNSIGED/SIGNED ist 
tabu, selbst wenn es mit STD_ anfängt.

von Jad A. (jala)


Angehängte Dateien:

Lesenswert?

Hii,

Der Sinn dahinter ist die Berechnung der Determinanten von diesem 
Matrix(siehe Anhang).

Vielen Dank Geoge für die Hinweise !

von berndl (Gast)


Lesenswert?

nimm's mir nicht uebel, aber ein Code der bzgl. Einruecken (==Tabulator) 
grausam ist, keine Kommentare enthaelt und dann noch ueber ca. 3 
Bildschirmseiten geht: Sowas gucke ich mir nicht wirklich an! Vielleicht 
verstehst du das Kauderwelsch da oben, ich jedenfalls verstehs nicht...

von Duke Scarring (Gast)


Lesenswert?

Jihad Alayan schrieb:
> mein Ansatz (ganz simple mit einer For-schleife !) :
Willst Du das nur simulieren oder soll Dein Code auch in einem FPGA 
laufen?

Duke

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.