hallo,
Mir ist bei meinen vhdl Studien etwas langweilig geworden und ich möchte
mich etwas damit auseinandersetzen, wie ich nun konkrete Berechnungen
bzw Algorithmen angehe.
Ich habe dafür einfach mal eine entity für die Berechnung des ggt
gemacht. Simuliert auch.
Nur Frage ich mich - (weil das Stichwort latency ja für mich seit Beginn
eine Hirnzerrung nach sich zieht) - ob ich dort etwas grundsätzlich
anders angehen könnte. Oder besser sollte.
ggt als eine Prozedur implementieren. Wie genau interagiert der Rest der
Schaltung überhaupt mit einer Prozedur. Wenn die Berechnung gestartet
wird, muss ja ein Großteil der Schaltung warten bis busy weggeht. Ist
das in einer Prozedur zu erledigen?
Außerdem Frage ich mich langsam nach konkreten Anwendungen. Sprich ich
würde mir mal eine Hardware kaufen und damit etwas realisieren. Habe nur
noch keinerlei Inspiration. Und auch schwierigkeiten mir vorzustellen,
wie ich mir Algorithmen und 'Berechnungen' in einer Hardware vorstellen
kann und wie diese interagieren.
Den ganz brutalen Performance Zuwachs kann ich mir auch nicht vorstellen
- der tritt auch nur zutage, wenn etwas "parallelisiert" werden kann. ok
aber gebt ihr mir da mal ein Beispiel? Wenn ich eine 3d-2d Projektion
hätte, die ich in einen Bildspeicher schreiben möchte und zur Anzeige
bringe. Wo ist das parallelisierbar.
Geht schon EINIGES über die konkrete Frage zu meiner kleinen
Beschreibung hinaus, aber ich sucher inzwischen fast krampfhaft nach
einem motivierenden, doch für Anfänger beherrschbaren und zerlegbaren
Aufgabe für die es sich lohnt, Hardware zu kaufen. (die auch nciht nach
2 Wochen im Müll landet)
Wer kann möge bitte Rat geben. Im Bezug auf beide Fragen.
hier der code der mich so abschweifen ließ:
1 | library IEEE;
|
2 | use IEEE.STD_LOGIC_1164.ALL;
|
3 | use IEEE.NUMERIC_STD.ALL;
|
4 |
|
5 | entity calc is
|
6 | Port ( clk : in STD_LOGIC;
|
7 | val1 : in STD_LOGIC_VECTOR (7 downto 0);
|
8 | val2 : in STD_LOGIC_VECTOR (7 downto 0);
|
9 | go : in STD_LOGIC;
|
10 | busy : out STD_LOGIC;
|
11 | ggt : out STD_LOGIC_VECTOR (7 downto 0));
|
12 | end calc;
|
13 |
|
14 | architecture Behavioral of calc is
|
15 | type states is (idle, calc);
|
16 | signal state : states := idle;
|
17 |
|
18 | signal a : unsigned (7 downto 0);
|
19 | signal b : unsigned (7 downto 0);
|
20 | begin
|
21 |
|
22 | process begin
|
23 | wait until rising_edge(clk);
|
24 |
|
25 | case state is
|
26 | when idle =>
|
27 | a <= unsigned(val1); --speicher ich die IMMER in ff wenn idle ist, oder reicht ein sichern wenn go gefunden wird?
|
28 | b <= unsigned(val2);
|
29 | if( go = '1' ) then
|
30 | --a <= unsigned(val1);
|
31 | --b <= unsigned(val2);
|
32 | state <= calc;
|
33 | ggt <= (others=>'0');--während berechnung läuft, alten Wert löschen Null anzeigen
|
34 | busy <= '1';
|
35 | else
|
36 | busy <= '0';
|
37 | end if;
|
38 | when calc =>
|
39 | if( a /= 0) then
|
40 | if( to_integer(b) = 0 ) then --fertig, a ist der ggt
|
41 | state <= idle;
|
42 | busy <= '0';
|
43 | ggt <= std_logic_vector(a);
|
44 | else
|
45 | if ( a > b ) then
|
46 | a <= a - b;
|
47 | else
|
48 | b <= b - a;
|
49 | end if;
|
50 | end if;
|
51 | else --wenn a = 0 ist, kann man direkt wieder raus und b als ergebnis nehmen oder kann
|
52 | state <= idle; --das auch IN idle geprüft werden und gar nciht erst in calc gewechselt werden?
|
53 | busy <= '0';
|
54 | ggt <= std_logic_vector(b);
|
55 | end if;
|
56 |
|
57 | end case;
|
58 |
|
59 | end process;
|
60 |
|
61 | end Behavioral;
|