www.mikrocontroller.net

Forum: FPGA, VHDL & Co. std_ulogic_vector


Autor: Mari Gross (mariaa)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
   D <= (others=>'0');

Autor: Daniel -------- (root)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Mari Gross (mariaa)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Mari Gross (mariaa)
Datum:

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

Autor: Daniel (root) (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
entity add is
    port(x:in std_logic);
end;
architecture add_one of add is
begin
 ---
end;
architecture add_two of add is
begin
 ---
end;

entity add_tb is
end;

architecture add_tb of add_tb is
   signal a: std_logic;
begin

   dut: entity add(add_one) port map(x => a);
   
   stimuli: process
   begin
       a <= '0'; wait for 10 ns;
       a <= '1'; wait for 5 ns;
       -- und so weiter
       wait;
   end process;

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.

Autor: Mari Gross (mariaa)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

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

Autor: Mari Gross (mariaa)
Datum:

Bewertung
0 lesenswert
nicht 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 !!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
Port ( clk : in std_logic;  -- z.B. 50Mhz
       B   : in std_logic_vector (383 DOWNTO 0);
:
architecture........
:
signal Daten : std_logic_vector (191 downto 0);
signal cnt   : integer range 0 to 50000-1 := 0;
:
  process begin
    wait until rising_edge(clk);
    if(cnt=50000-1) then  cnt <= 0;      -- 1 ms vorbei, zuruecksetzen
    else                  cnt <= cnt+1;  -- sonst zaehlen
    end if;
  end process;
:   
  process begin
    wait until rising_edge(clk);
    if(cnt=0) then -- 1 ms vorbei? -> Daten uebernehmen
       for i in 0 to B'high/2 loop 
          Daten(i) <= B(i*2);
       end loop;
    end if;
  end process;
:

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

Autor: Daniel (root) (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mari Gross (mariaa)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.