Forum: FPGA, VHDL & Co. auf array ( vector) element zugreifen mit integer


von armin (Gast)


Lesenswert?

hi,
ich wollte über einen externen integer Eingang immer ein bestimmtes bit 
auf 0 setzen.

aber ich kann weder mit dem Eingangssignal, noch mit einem internen 
Signal auf die Elemente meines Vectors zugreifen!

Bei der for schleife geht das ja einigermaßen mit dem <index>..

Hat jemand eine Idee? Vielen DAnk
1
library IEEE;
2
use IEEE.std_logic_1164.all;
3
use IEEE.std_logic_unsigned.all;
4
5
entity sch is
6
port(
7
Cin : in bit;
8
count : in integer range 0 to 7;
9
A : out bit_vector(7 downto 0)
10
);
11
end entity sch;
12
13
architecture verhalten of sch is
14
signal reg : bit_vector(7 downto 0)  := "00000001";
15
signal index : integer range 0 to 7 := 0;
16
begin
17
18
-- gesamtes signal auf 0 ;
19
reg <= (reg'range =>'0');
20
-- da ander stelle "index" soll eine 1 geschrieben werden
21
reg(index) <='1';
22
A<=reg;
23
end architecture verhalten;

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


Lesenswert?

armin schrieb:
> ich wollte über einen externen integer Eingang immer ein bestimmtes bit
> auf 0 setzen.
Für die Synthese oder nur für die Simulation?

> aber ich kann weder mit dem Eingangssignal, noch mit einem internen
> Signal auf die Elemente meines Vectors zugreifen!
Warum nicht? Was passiert stattdessen?

: Bearbeitet durch Moderator
von armin (Gast)


Lesenswert?

Es erscheint der Fehler:

** Error: C:/Modeltech_pe_edu_10.4a/schieby.vhd(15): Nonresolved signal 
'reg' has multiple sources.
  Drivers:
    C:/Modeltech_pe_edu_10.4a/schieby.vhd(20):Conditional signal 
assignment line__20
    C:/Modeltech_pe_edu_10.4a/schieby.vhd(22):Conditional signal 
assignment line__22
** Error: C:/Modeltech_pe_edu_10.4a/schieby.vhd(24): VHDL Compiler 
exiting

von armin (Gast)


Lesenswert?

das mit dem range 0 to 7
habe ich nur hingeschrieben, weil ich überhaupt nicht weiter weiß :D

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


Lesenswert?

Was passiert, wenn du sowas probierst:
1
:
2
process (reg) begin
3
  -- gesamtes signal auf 0 ;
4
  reg <= (reg'range =>'0');
5
  -- da ander stelle "index" soll eine 1 geschrieben werden
6
  reg(index) <='1';
7
end process;
8
:

Oder sowas:
1
  reg <= (index=>'1', others =>'0');


BTW: bitte [vhdl] Tags um den Code setzen! Siehe die Beschreibung über 
jedem Texteingabfeld.

: Bearbeitet durch Moderator
von armin (Gast)


Lesenswert?

ok danke!

gute Frage , wieso : ich nehme an für die Simulation . Es soll einfach 
in modelsim simulierbar sein ( Anfänger :D).

Also mit dem folgenden Code geht das.
Ich frage mich , warum das nur mit einem Prozess geht -.- ...

1
process (reg) begin
2
  -- gesamtes signal auf 0 ;
3
  reg <= (reg'range =>'0');
4
  -- da ander stelle "index" soll eine 1 geschrieben werden
5
  reg(index) <='1';
6
end process;

das  erschreckt mich ein bisschen :
1
   reg <= (index=>'1', others =>'0');
es setzt vielleicht das element "index" auf 1 und die anderen auf 0 ;
also auch ohne im Prozess zu sein zu müssen! Das wäre eine sehr 
angenehme Alternative.

danke auf jeden Fall !

Wichtig wäre die Frage (für mich), warum das nicht so geht wie ich es 
gemacht habe !

von armin (Gast)


Lesenswert?

kommen die vhdl - tags eigentlich nicht automatisch ?
nachdem ich die mal angewendet habe, sieht das nämlich so aus, wie bei 
dem ersten post hier, wo ich die nicht explizit angegeben habe.

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


Lesenswert?

armin schrieb:
> wie bei dem ersten post hier, wo ich die nicht explizit angegeben habe.
Aber ich. Hinterher. So viel zur "Automatik"...  ;-)

armin schrieb:
> Wichtig wäre die Frage (für mich), warum das nicht so geht wie ich es
> gemacht habe !
Weil du dort aus zwei nebenläufigen Anweisungen gleichzeitig '0' und 
'1' auf das selbe Signal treibst. Das sagt auch die Fehlermeldung.

VHDL ist nicht wie eine prozedurale Programmiersprache, wo das Programm 
"von oben nach unten" abgearbeitet wird. Das kann man sich in einem 
Prozess ein wenig "hinmauscheln", denn im Prozess "gewinnt" die letzte 
Zuweisung vor dem nächsten wait oder vor dem Prozessende.

: Bearbeitet durch Moderator
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.