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.
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'); |
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 ;)
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 ?
danke schön, aber bei mir D ist eingang ,ich werde vielleicht das mit Testbench machen.
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.
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.
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; |
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 !!
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.
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
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
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.