Forum: FPGA, VHDL & Co. std_ulogic_vector


von Mari G. (mariaa)


Lesenswert?

hallo,
wie kann ich D mit dem wert 0 einsetzen
  D :  in  std_ulogic_vector (255 DOWNTO 0);
  D soll die große 256 bits hat und alle bits gleich 0?

wie kann ich alle bits mit 0 einsetzen und D als Std_ulogin_vector (255 
downto 0) defeniert ist?

danke schön.

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


Lesenswert?

Gar nicht. Denn D ist ein Eingang  :-o
>  D :  in  std_ulogic_vector (255 DOWNTO 0);
Du mußt an diesem Port lauter '0'en eingeben (z.B. in der Testbench), 
dann ist der Vektor durchgängig '0'.

Wenns ein Signal wäre, ginge es so:
1
   D <= (others=>'0');

von Daniel -. (root)


Lesenswert?

D <= "0000000000.."; 256 mal
D <= x"00000.."; 256/4=64 mal, da x"0" = "0000" ist.
D <= (others => '0'); ist perfekt
D <= (128 => '1', others => '0'); und kann sogar einzelne Bits oder
Bitgruppen auf andere Werte setzen ;)

von Mari G. (mariaa)


Lesenswert?

ich danke dir sehr ,die zwei lösungen sind richtig ,aber das problem D 
soll als Signal defeniert wird .und bei mir D ist eingang!!
soll ich  das mit testbench vielleicht machen ?

von Mari G. (mariaa)


Lesenswert?

danke schön,
aber bei mir D ist eingang ,ich werde vielleicht das mit Testbench 
machen.

von Daniel (root) (Gast)


Lesenswert?

du hast es richtig erkannt, wenn signal in ist, kannst du es
nur lesen.

Möchtest du die entity testen ob alles richtig ist?
1
entity add is
2
    port(x:in std_logic);
3
end;
4
architecture add_one of add is
5
begin
6
 ---
7
end;
8
architecture add_two of add is
9
begin
10
 ---
11
end;
12
13
entity add_tb is
14
end;
15
16
architecture add_tb of add_tb is
17
   signal a: std_logic;
18
begin
19
20
   dut: entity add(add_one) port map(x => a);
21
   
22
   stimuli: process
23
   begin
24
       a <= '0'; wait for 10 ns;
25
       a <= '1'; wait for 5 ns;
26
       -- und so weiter
27
       wait;
28
   end process;
29
30
end;

ich mach so, dass ich testbenches mit suffix _tb markiere.
hat den Vorteil, dass im Ordner im Dateisystem, die beiden
Dateien direkt untereinander stehen.

von Mari G. (mariaa)


Lesenswert?

danke daniel ,ich habe einfach das auch mit testbench gemacht und hat 
geklappt.
ich habe noch eine frage, ich will 6 bits in einem speicher kopieren 
aber es sollte nur die zweite bit kopiert werden zb:
ich habe "110010" ich will nur die zweite kopieren also nur 1,0,1 dh ein 
bit nicht ein bit ja bzw nur die geraden bits.
wie kann man nur die geraden bits speichern?
vielen dank.

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


Lesenswert?

Entweder machst du es komplett von Hand:
1
  signal invect   : std_logic_vector(7 downto 0);
2
  signal evenbits : std_logic_vector(3 downto 0);
3
  signal oddbits  : std_logic_vector(3 downto 0);
4
:
5
  evenbits <= ivec(6)&ivec(4)&ivec(2)&ivec(0);
6
  oddbits  <= ivec(7)&ivec(5)&ivec(3)&ivec(1);

Oder du machst es mit einer Schleife:
1
  signal invect   : std_logic_vector(7 downto 0);
2
  signal evenbits : std_logic_vector(3 downto 0);
3
  signal oddbits  : std_logic_vector(3 downto 0);
4
:
5
  process (invect) begin
6
    for i in 0 to invect'high/2 loop
7
       evenbits(i) <= invect(i*2);
8
       oddbits(i)  <= invect(i*2+1);
9
    end loop;
10
  end process;

von Mari G. (mariaa)


Lesenswert?

hallo Lothar,
danke für deine Hilfe ,das problem ich muss  die geraden Bits von 384 
bits speichern und nach jedem bits sollte eine warte zeit von 1 ms dazu 
machen dh:
.
.
Port (B in  std_ulogic_vector (383 DOWNTO 0);
.
.
architecture........

signal Daten : std_ulogic_vector (0 to 383)

daten<=B    hier sollte nur die geraden bits in Daten kopiert und dazu 
soll für jede gerade bit eine warte zeit von 1ms gemacht werden.

ich kann keine schleife hier benutzen !!

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


Lesenswert?

Jede ms sollen die geraden Bits von B nach daten übertragen werden?

Warum ist der Ausgangsvektor daten auch 384 Bits breit,
wenn nur die geraden Bits zurückgegeben werden sollen?

So würde ich das machen:
1
Port ( clk : in std_logic;  -- z.B. 50Mhz
2
       B   : in std_logic_vector (383 DOWNTO 0);
3
:
4
architecture........
5
:
6
signal Daten : std_logic_vector (191 downto 0);
7
signal cnt   : integer range 0 to 50000-1 := 0;
8
:
9
  process begin
10
    wait until rising_edge(clk);
11
    if(cnt=50000-1) then  cnt <= 0;      -- 1 ms vorbei, zuruecksetzen
12
    else                  cnt <= cnt+1;  -- sonst zaehlen
13
    end if;
14
  end process;
15
:   
16
  process begin
17
    wait until rising_edge(clk);
18
    if(cnt=0) then -- 1 ms vorbei? -> Daten uebernehmen
19
       for i in 0 to B'high/2 loop 
20
          Daten(i) <= B(i*2);
21
       end loop;
22
    end if;
23
  end process;
24
:

> ich kann keine schleife hier benutzen !!
Doch, genau das ist es, was du brauchst.
Sieh dir das VHDL-Thema for-loop nochmal genauer an.

von Daniel (root) (Gast)


Lesenswert?

soll das auch nur für die Testbench sein oder soll das durch dir
Synthese?

Warum kannst du keine Schleife nutzen?
Die Schleife verbraucht keine "Takte" der Clock, falls das dein
Problem mit der Schleife ist.

Grüsse

von Mari G. (mariaa)


Lesenswert?

ich danke euch sehr mit der schleife hat funktioniert aber die warte 
zeit habe ich nicht gewusst wie ich das machen soll weil jedes bit 
braucht 1ms dh nach jedes bit soll eine warte zeit von 1ms dauern bis 
das nächste bit kommt.
warum soll cnt bis 50000-1 zählen ich verstehe nicht!!!
signal cnt   : integer range 0 to 50000-1 := 0;

danke

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


Lesenswert?

> 50000-1
0 bis 49999 sind bei 50MHz genau 50000 Takte = 1ms.
Wenn der Zähler bis 50000 zählen würde, dann sind es 50001 Takte, also 
um 0,02 Promille zuviel gezählt   :-o

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.