Forum: FPGA, VHDL & Co. [vhdl] for generate, vektoren zuweisen..


von dunno.. (Gast)


Lesenswert?

Guten Morgen an alle..


folgendes problem:

ich habe einen BCD Addierer, welcher 2 4 bit vektoren + carry addiert, 
und ein carry ausgibt.

dieser BCD Addierer soll nun benutzt werden, um einen N stellen BCD 
addierer zu realisieren.
der hat natürlich N*4 Bit eingänge, und soll intern als component den 
BCD Addierer verwenden, mittels einer for.. generate anweisung.

leider hab ich grad irgendwie schwierigkeiten mit der syntax, wie sage 
ich der for generate, das bei jedem i 4 bit des eingangsvektors an den 
eingang der komponente gelegt werden müssen?

dank im vorraus..
1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
entity BCDAddRC is
5
generic (n: natural :=4);                --Wortbreite
6
      
7
   port (A, B  : in std_logic_vector (4*n-1 downto 0);  --n*4 Bit Eingangsvektoren fuer Summanden
8
      CIN  : in std_logic;                --1 Bit Eingang fuer Uebertrag
9
      S    : out std_logic_vector (4*n-1 downto 0);  --n*4 Bit Summe
10
      COUT  : out std_logic);                --1 Bit Ausgang fuer Uebertrag
11
end entity BCDAddRC;
12
13
architecture VERHALTEN of BCDAddRC is
14
  signal C : std_logic_vector (0 to n);    
15
  
16
  component BCDAdd is
17
    port (CA, CB  : in std_logic_vector (3 downto 0); --4 Bit Eingangsvektoren fuer Summanden
18
      CCIN  : in std_logic;                --1 Bit Eingang fuer Uebertrag
19
      CS    : out std_logic_vector (3 downto 0);  --4 Bit Summe
20
      CCOUT  : out std_logic);                --1 Bit Ausgang fuer Uebertrag
21
  end component BCDAdd;
22
  
23
begin
24
C(0) <= CIN;                          --Eingang des gesamtuebertrages
25
gen : for i in 0 to n-1 generate
26
  fm: BCDAdd port map ( A( i*4, i*4+1, i*4+2, i*4+3),
27
                 B( i*4, i*4+1, i*4+2, i*4+3),
28
                 C(i),
29
                 S(i*4, i*4+1, i*4+2, i*4+3),
30
                 C(i+1));
31
end generate gen;
32
COUT <= C(n);
33
34
end architecture VERHALTEN;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

dunno.. schrieb:
> wie sage ich der for generate, das bei jedem i 4 bit des
> eingangsvektors an den eingang der komponente gelegt werden müssen?
Ausrechnen?
1
-- so vielleicht:
2
 fm: BCDAdd port map ( A(i*4+3 downto i*4),
3
                       B(i*4+3 downto i*4),
4
                       C(i),
5
                       S(i*4+3 downto i*4),
6
                       C(i+1));
7
 
8
-- oder so:
9
 fm: BCDAdd port map ( CA(3) => A(i*4+3),
10
                       CA(2) => A(i*4+2),
11
                       CA(1) => A(i*4+1),
12
                       CA(0) => A(i*4+0),
13
                       CB(3) => B(i*4+3),
14
                       CB(2) => B(i*4+2),
15
                       CB(1) => B(i*4+1),
16
                       CB(0) => B(i*4+0),
17
                       CCIN  => C(i),
18
                       CS(3) => S(i*4+3),
19
                       CS(2) => S(i*4+2),
20
                       CS(1) => S(i*4+1),
21
                       CS(0) => S(i*4+0),
22
                       CCOUT => C(i+1));
23
24
-- ich würde es mit expliziten Zuweisungen machen:
25
 fm: BCDAdd port map ( CA    => A(i*4+3 downto i*4),
26
                       CB    => B(i*4+3 downto i*4),
27
                       CCIN  => C(i),
28
                       CS    => S(i*4+3 downto i*4),
29
                       CCOUT => C(i+1));

von Malte (Gast)


Lesenswert?

Lothar Miller schrieb:
> -- ich würde es mit expliziten Zuweisungen machen:
>  fm: BCDAdd port map ( CA    => A(i*4+3 downto i*4),
>                        CB    => B(i*4+3 downto i*4),
>                        CCIN  => C(i),
>                        CS    => S(i*4+3 downto i*4),
>                        CCOUT => C(i+1));

Finde ich auch immer am schönsten, Zuweisung nach Position ist immer 
eine beliebte Fehlerquelle.

von dunno.. (Gast)


Lesenswert?

dank an euch beide, mir war nicht bewusst, das man downto oder to da 
verwenden kann..

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.