Forum: FPGA, VHDL & Co. std_logic zu std_logic_vector


von Mark W. (kram) Benutzerseite


Lesenswert?

Hallo,

wie kann ich ein Signal std_logic zu einem Signal std_logic_vector 
vervielfachen?
Ich benoetige mehrer Ausgaenge, die exakt das Gleiche tun.
Ich habe ein Design, was fuer einen Ausgang, das tut, was es soll, nun 
wollte ich das Design nicht verzigfachen, nur weil mehrere Ausgange 
benoetigt werden.

P.S.: Den entsprechenden VHDL Code kann ich morgen nachreichen, da 
gerade am Handy.

von Sei nett zu jedem deppen, er koennte morgen dein C (Gast)


Lesenswert?

1
s_exa_slv <= (others => s_exa_sl);

von Mark W. (kram) Benutzerseite


Lesenswert?

Sei nett zu jedem deppen, er koennte morgen dein C schrieb im Beitrag 
#5912783:
>
1
> s_exa_slv <= (others => s_exa_sl);
2
>

Danke, hat funktioniert.
Ich hatte es vorher so probiert, hat in diesem Fall aber nicht geklappt.
1
s_exa_slv(15) <= s_exa_sl;
2
s_exa_slv(14) <= s_exa_sl;
3
--usw...

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


Lesenswert?

Mark W. schrieb:
> Ich hatte es vorher so probiert, hat in diesem Fall aber nicht geklappt.
Müsste aber. Welche Fehlermeldung hast du da erhalten?

von Mark W. (kram) Benutzerseite


Lesenswert?

Lothar M. schrieb:
> Mark W. schrieb:
>> Ich hatte es vorher so probiert, hat in diesem Fall aber nicht geklappt.
> Müsste aber. Welche Fehlermeldung hast du da erhalten?

Fehlermeldung(bei Synthesis):
ERROR - c:/allmyfiles/latticediamondprojects/pulser03/pulser03.vhd(42): 
net PD_OUT_P[15] is constantly driven from multiple places at instance 
PD_OUT_P, on port q[15]. VDB-1000
Done: error code 2
Also VHDL checking geht durch, nur beim Synthetisieren gibt es obige 
Fehlermeldung.

Hier ist der Code:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.all;
3
4
entity PULSER_DRIVE is
5
     port(
6
         PD_CLK   : in std_logic;
7
     PD_MODE   : in std_logic;
8
         PD_OUT_P   : out std_logic_vector(15 downto 0);
9
     PD_OUT_N  : out std_logic_vector(15 downto 0)
10
         );
11
end PULSER_DRIVE;
12
13
14
architecture ARCH of PULSER_DRIVE is
15
16
signal IDATA_P : std_logic_vector(63 downto 0):= "0000000000000000000000000000000010111111111111111111111111111111";
17
signal IDATA_N : std_logic_vector(63 downto 0):= "0000000000000000000000000000000001111111111111111111111111111111";
18
signal TEST : std_logic;
19
20
begin
21
22
    SM_PISO : process (PD_CLK)
23
    
24
    begin
25
        if PD_CLK'event and PD_CLK = '1' then
26
      case PD_MODE is
27
        when '0' =>
28
          PD_OUT_P <= "1111111111111111";
29
          PD_OUT_N <= "1111111111111111";
30
        when '1' =>
31
          TEST <= IDATA_P(63);
32
            for PLOOP in 62 downto 0 loop
33
          IDATA_P(PLOOP+1) <= IDATA_P(PLOOP);
34
          end loop;
35
          PD_OUT_N <= (others => IDATA_N(63));
36
            for NLOOP in 62 downto 0 loop
37
          IDATA_N(NLOOP+1) <= IDATA_N(NLOOP);
38
          end loop;
39
        when others =>
40
          null;
41
      end case;
42
        end if;
43
    end process SM_PISO;
44
  
45
PD_OUT_P(15) <= TEST;
46
PD_OUT_P(14) <= TEST;
47
48
end ARCH;
Es gibt 2x16 Ausgaenge, wie es jetzt bei PD_OUT_N ist, geht es.
Es soll das Pattern ausgegeben werden immer wenn MODE 1 ist. Mit der 
Laenge des MODE Pulses bestimme ich wie viele Bits rausgehen.

von Dussel (Gast)


Lesenswert?

Mark W. schrieb:
> net PD_OUT_P[15] is constantly driven from multiple places at instance
> PD_OUT_P,
Da wird PD_OUT_P 0 bis 15 zugewiesen
1
PD_OUT_P <= "1111111111111111";
und da nochmal PD_OUT_P 14 und 15
1
PD_OUT_P(15) <= TEST;
2
PD_OUT_P(14) <= TEST;

Damit werden die beiden letzten zweimal zugewiesen. Das funktioniert in 
Hardware nicht.

von Mark W. (kram) Benutzerseite


Lesenswert?

Dussel schrieb:
> Mark W. schrieb:
>> net PD_OUT_P[15] is constantly driven from multiple places at instance
>> PD_OUT_P,
> Da wird PD_OUT_P 0 bis 15 zugewiesen
>
1
PD_OUT_P <= "1111111111111111";
> und da nochmal PD_OUT_P 14 und 15
>
1
PD_OUT_P(15) <= TEST;
2
> PD_OUT_P(14) <= TEST;
>
> Damit werden die beiden letzten zweimal zugewiesen. Das funktioniert in
> Hardware nicht.

Ja, habe mir schon gedacht, dass das was damit zu tun hat, dass ich es 
außerhalb des Prozesses gemacht habe. Allerdings sind die Zuweisungen ja 
nie gleichzeitig, denn MODE kann ja nur 1 oder 0 sein.
Naja, die Schreibweise innerhalb des Prozesses gefaelt mir auch besser, 
weil sie kuerzer ist.

von Dussel (Gast)


Lesenswert?

Mark W. schrieb:
> Allerdings sind die Zuweisungen ja nie gleichzeitig,
> denn MODE kann ja nur 1 oder 0 sein.
1
PD_OUT_P(15) <= TEST;
2
PD_OUT_P(14) <= TEST;
wird immer 'ausgeführt'.
Manchmal zusätzlich noch
1
PD_OUT_P <= "1111111111111111";
Das kann in normaler Hardware nicht gehen.
In der Simulation funktioniert es übrigens, weil std_logic aufgelöst 
wird. Dann kommt 'X' raus, wenn die beiden Zuweisungen unterschiedlich 
sind. Das gibt so schöne Muster X0X0X0X0X0 und man wundert sich erstmal, 
wenn man das zum ersten Mal sieht. ;-)

von Dussel (Gast)


Lesenswert?

Was soll der Code eigentlich bringen? Selbst wenn du die Zuweisungen 
unten weglässt, wird PD_OUT_P nur einmal auf 1 gesetzt und bleibt dann 
für immer so.

von Mark W. (kram) Benutzerseite


Lesenswert?

Dussel schrieb:
> Was soll der Code eigentlich bringen? Selbst wenn du die Zuweisungen
> unten weglässt, wird PD_OUT_P nur einmal auf 1 gesetzt und bleibt dann
> für immer so.
Nein, wenn MODE 0 ist, dann sind die Ausgaenge auf 1 gesetzt. Wenn MODE 
1 ist, dann wird das Pattern IDATA_X entsprechend ausgegeben, 1 Bit pro 
Takt. Und zwar so lange, wie MODE 1 bleibt. Also um das ganze Patterns 
auszugeben muss MODE fuer 64 Taktzyklen 1 sein.

Edit: Ich habe dafuer eine Parallel zu Serial Schieberegister 
modifiziert.

: Bearbeitet durch User
von Dussel (Gast)


Lesenswert?

Jetzt sehe ich es. Über TEST soll das zugewiesen werden. Aber wie schon 
gesagt, so geht das nicht, weil PD_OUT_P nicht gleichzeitig im Prozess 
und außerhalb etwas zugewiesen bekommen kann.
Du könntest ein Hilfssignal im Prozess erzeugen, dass du unten zuweist. 
Oder du weist direkt im Prozess an PD_OUT_P zu.

von Mark W. (kram) Benutzerseite


Lesenswert?

Dussel schrieb:
> Jetzt sehe ich es. Über TEST soll das zugewiesen werden. Aber wie schon
> gesagt, so geht das nicht, weil PD_OUT_P nicht gleichzeitig im Prozess
> und außerhalb etwas zugewiesen bekommen kann.
> Du könntest ein Hilfssignal im Prozess erzeugen, dass du unten zuweist.
> Oder du weist direkt im Prozess an PD_OUT_P zu.

Ja, TEST hatte ich jetzt nur nochmal eingebaut, um die Fehlermeldung zu 
produzieren. So wie es im obigen Code bei PD_OUT_N ist geht es und ich 
bin damit zufrieden.

von Dussel (Gast)


Lesenswert?

Dann ist ja alles geklärt. Erfahrungsgemäß ist das ein relativ häufiger 
Fehler Jetzt weißt du, was die Meldung bedeutet. ;-)

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.