ja, if .. generate war die lösung.
das "generate" parallele hw beschreibt, ist mir hoffentlich bewusst. ob
ichs dadurch richtig einsetzte, ist dann noch was andres.
jedenfalls läuft der code jetzt zumindest ohne fehler durch, das
ergebnis ist aber noch net das was ich möchte.
es scheint so, als ob die beiden for generate schleifen nicht bearbeitet
werden, in der simulations seh ich für tG(1) .. tG(len - 1) nur 'U's
hat jmd dazu noch nen hinweis für mich?
1 | library IEEE;
|
2 | use IEEE.STD_LOGIC_1164.ALL;
|
3 | use work.common.all;
|
4 |
|
5 | entity KoggeStoneAdder is
|
6 | port (
|
7 | P: in std_logic_vector;
|
8 |
|
9 | G: in std_logic_vector;
|
10 | cin: in std_logic;
|
11 | sum: out std_logic_vector;
|
12 | cout: out std_logic
|
13 | );
|
14 | end KoggeStoneAdder;
|
15 |
|
16 | architecture Behavioral of KoggeStoneAdder is
|
17 | signal len: natural := log2(P'length + 1);
|
18 | --signal dist: integer;
|
19 |
|
20 | type tmpArr is array(len - 1 downto 0) of std_logic_vector((P'high - P'low + 1) downto 0);
|
21 | signal tP: tmpArr;
|
22 | signal tG: tmpArr;
|
23 |
|
24 | begin
|
25 | --P, G, Cin in tmp Feld laden
|
26 | tG(0)(0) <= cin;
|
27 | tP(0)(0) <= '1';
|
28 |
|
29 | tG(0)(G'Length downto 1) <= G;
|
30 | tP(0)(G'Length downto 1) <= P;
|
31 |
|
32 |
|
33 | stGen0: for i in 1 to (len - 1) generate
|
34 | stGen1: for j in 0 to G'Length generate
|
35 |
|
36 |
|
37 | g1: if (j < 2 ** i) generate
|
38 | tG(i)(j) <= tG(i - 1)(j);
|
39 | tP(i)(j) <= tP(i - 1)(j);
|
40 | end generate;
|
41 |
|
42 |
|
43 | ifGen: if (j >= 2 ** i) generate
|
44 | prfxInst: Prefix port map(tG(i - 1)(j), tP(i - 1)(j),
|
45 | tG(i - 1)(j - 2 ** i), tP(i - 1)(j - 2 ** i),
|
46 | tG(i)(j), tP(i)(j));
|
47 | end generate;
|
48 |
|
49 | end generate;
|
50 | end generate;
|
51 |
|
52 | sum <= tG(0)(G'Length - 1 downto 0);
|
53 | cout <= tG(0)(G'Length);
|
54 |
|
55 |
|
56 | end Behavioral;
|