Forum: FPGA, VHDL & Co. Viele Componenten mit loop oder so erzeugen


von Bernt (Gast)


Lesenswert?

Hallo,

ich habe in einer eigen work.shift Bibliothek ein Shift-Register 
erstellt.
Dieses verwende ich nun in einem Header Project ganz normal mit:

Shift: entity work.shift
port map (
Q => Q,
A => A,
CE => CE,
CLK => CLK,
D => D
);


wie macht man das am besten wenn man nicht nur eins sondern z.B. 2 
moechte also sowas:

Shift_0: entity work.shift
port map (
Q => Q(0),
A => A,
CE => CE(0),
CLK => CLK,
D => D(0)
);

Shift_1: entity work.shift
port map (
Q => Q(1),
A => A,
CE => CE(1),
CLK => CLK,
D => D(1)
);


Fuer zwei kann man das ja noch von Hand machen, aber wie wenn ich z.B. 
100 oder so moechte? Kann man da loop oder for oder so was verwenden?

Danke fuer alle Antworten!

von soren (Gast)


Lesenswert?

das geht mit:

for i in 0 to x generate

  Shift_inst: entity work.shift
  port map (
    Q => Q(i),
    A => A,
    CE => CE(i),
    CLK => CLK,
    D => D(i)
  );

end generate;

musst halt nur bedenken, dass dann alle signale mit einem index, wie zum 
beispiel D(i) dann ein bus sind


cheers,
soren

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


Lesenswert?

Bernt schrieb:
> ich habe in einer eigen work.shift Bibliothek ein Shift-Register
> erstellt.
Die Schiebefunktionen aus der numeric_std sind dir bekannt?
1
  --============================================================================
2
  -- Shift and Rotate Functions
3
  --============================================================================
4
5
  -- Id: S.1
6
  function SHIFT_LEFT (ARG: UNSIGNED; COUNT: NATURAL) return UNSIGNED;
7
  -- Result subtype: UNSIGNED(ARG'LENGTH-1 downto 0)
8
  -- Result: Performs a shift-left on an UNSIGNED vector COUNT times.
9
  --         The vacated positions are filled with '0'.
10
  --         The COUNT leftmost elements are lost.
11
12
  -- Id: S.2
13
  function SHIFT_RIGHT (ARG: UNSIGNED; COUNT: NATURAL) return UNSIGNED;
14
  -- Result subtype: UNSIGNED(ARG'LENGTH-1 downto 0)
15
  -- Result: Performs a shift-right on an UNSIGNED vector COUNT times.
16
  --         The vacated positions are filled with '0'.
17
  --         The COUNT rightmost elements are lost.

von Bernt (Gast)


Lesenswert?

Vielen Dank schon mal fuer die Antworten:

@soren: wo genau muss ich die for schleife setzen? Ich erhalte immer 
eine Fehler wenn ich das einfach vor die componenten deklaration setze

@Lothar: nein das war mir noch nicht bekannt! Schaut sehr interessant 
aus und werd ich mir gleich mal naeher anschauen.

Gruss

von soren (Gast)


Lesenswert?

musst natürlich noch nen label davorsetzen... sorry, ganz vergessen ^^

label_name:
for i in 0 to x generate

  Shift_inst: entity work.shift
  port map (
    Q => Q(i),
    A => A,
    CE => CE(i),
    CLK => CLK,
    D => D(i)
  );

end generate;


soren

von Bernt (Gast)


Lesenswert?

Hah, sehr cool danke!

von Bernt (Gast)


Lesenswert?

Ich haette noch mal eine Frage dazu,

wie kann man denn mehrere std_logic_vector Signale erzeugen und wie kann 
man dann auf ein einzelnes oder mehrere Bits darin zugreifen.

Wir kann man z.B. soetwas schneller schreiben:


out : std_logic_vector(4 downto 0);



signal v1: std_logic_vector(3 downto 0);
signal v2: std_logic_vector(3 downto 0);
signal v3: std_logic_vector(3 downto 0);
signal v4: std_logic_vector(3 downto 0);
signal v5: std_logic_vector(3 downto 0);


process(clk)
begin

out(0) <= v1(2);
out(1) <= v2(2);
out(2) <= v3(2);
out(3) <= v4(2);
out(4) <= v5(2);

end process;


Danke!

von berndl k. (bernd_l)


Lesenswert?

Bernt schrieb:
> Wir kann man z.B. soetwas schneller schreiben:

z.B. indem man einen std_logic_vector (19 downto 0) und dann 'alias' 
verwendet. Oder indem man ein array (1 to 5) of std_logic_vector (3 
downto 0) verwendet. Dann kannst du mit 'for ... loop' arbeiten (im 
process, sonst 'for ... generate').

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


Lesenswert?

berndl keinnachname schrieb:
> Oder indem man ein array (1 to 5) of std_logic_vector (3 downto 0)
> verwendet.
Hierzu ein paar erläuternde Worte:
http://www.lothar-miller.de/s9y/categories/32-Arrays

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.