hallo zusammen ich habe ein IP core fifo 8x8 bit und ein test data_wort 64 bit eingangsignal des Fifo ist DIN 8bit. ich will das wort ins fifo schreiben aber es wird nur die ersten 8 bit gelesen brauche ich ein zähler ? ich komme nicht voran irgendwelche vorschläfe. meine simulation sieht so aus danke im voraus
Du musst deinem FIFO auch die anderen Bits anbieten damit er diese übernehmen kann. Kannst du mal deinen Code zeigen? Nur die Waveform bringt nicht so viel...
:
Bearbeitet durch User
danke für die rückmeldung hier ist mein code ich habe zwei fsm eine zum schreiben und die andere zum lesen aus dem fifo ich beschäftige mich erst seit einpaar wochen mit vhdl
1 | library IEEE; |
2 | use IEEE.STD_LOGIC_1164.ALL; |
3 | |
4 | -- Uncomment the following library declaration if using
|
5 | -- arithmetic functions with Signed or Unsigned values
|
6 | --use IEEE.NUMERIC_STD.ALL;
|
7 | |
8 | -- Uncomment the following library declaration if instantiating
|
9 | -- any Xilinx primitives in this code.
|
10 | --library UNISIM;
|
11 | --use UNISIM.VComponents.all;
|
12 | |
13 | entity fifo_26 is |
14 | end fifo_26; |
15 | architecture Behavioral of fifo_26 is |
16 | |
17 | COMPONENT fifo_generator_v9_3_0 |
18 | PORT ( |
19 | clk : IN STD_LOGIC; |
20 | rst : IN STD_LOGIC; |
21 | din : IN STD_LOGIC_VECTOR(7 DOWNTO 0); |
22 | wr_en : IN STD_LOGIC; |
23 | rd_en : IN STD_LOGIC; |
24 | dout : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); |
25 | full : OUT STD_LOGIC; |
26 | empty : OUT STD_LOGIC |
27 | );
|
28 | END COMPONENT; |
29 | -- inputs
|
30 | signal clk : STD_LOGIC ;--:= '0'; |
31 | signal rst : STD_LOGIC := '0'; |
32 | signal reset: STD_LOGIC ;--= '0'; |
33 | signal din : STD_LOGIC_VECTOR(7 DOWNTO 0); |
34 | signal wr_en : STD_LOGIC ;--= '0'; |
35 | signal rd_en : STD_LOGIC := '0'; |
36 | signal data :STD_LOGIC_VECTOR (63 downto 0):=X"aabbccddeeffaaff"; |
37 | --signal counter : STD_LOGIC_VECTOR(7 DOWNTO 0);
|
38 | --outputs
|
39 | signal dout : STD_LOGIC_VECTOR(7 DOWNTO 0); |
40 | signal full : STD_LOGIC ; |
41 | signal empty: STD_LOGIC ; |
42 | type state_type is (zustand_1,zustand_2,zustand_3,zustand_4,zustand_5); |
43 | signal zwischen_zustand ,naechst_zustand : state_type ; |
44 | type status_type is (status_1); |
45 | signal zwischen_status ,naechst_status : status_type ; |
46 | --type voll_type is (start);
|
47 | --signal zwischen, naechst: voll_type;
|
48 | --clock period definition
|
49 | constant clk_period : time := 20 ns; |
50 | begin
|
51 | your_instance_name : fifo_generator_v9_3_0 |
52 | PORT MAP ( |
53 | clk => clk, |
54 | rst => reset, |
55 | din => din, |
56 | wr_en => wr_en, |
57 | rd_en => rd_en, |
58 | dout => dout, |
59 | full => full, |
60 | empty => empty |
61 | );
|
62 | --clock process definition
|
63 | clk_process: process begin |
64 | clk <= '0'; |
65 | wait for clk_period/2; |
66 | clk <= '1'; |
67 | wait for clk_period/2; |
68 | end process; |
69 | rst_process: process begin |
70 | reset <= '0'; |
71 | wait for clk_period; |
72 | reset <= '1'; |
73 | wait for clk_period; |
74 | reset <= '0'; |
75 | wait; |
76 | end process; |
77 | t_1: process (clk,reset) begin |
78 | if (reset='1') then |
79 | rst<='1'; |
80 | --default state on reset.
|
81 | elsif (clk' event and clk ='1') then --rising_edge(clk) |
82 | rst<='0'; |
83 | --rd_en <='0';
|
84 | zwischen_zustand <= naechst_zustand ; --state change. |
85 | --naechst_zustand<= zustand_1;
|
86 | end if; |
87 | end process; |
88 | --fsm process zum schreiben
|
89 | t_2: process (zwischen_zustand,full) |
90 | begin
|
91 | case zwischen_zustand is |
92 | when zustand_1 => |
93 | wr_en<='0'; |
94 | naechst_zustand <= zustand_2; |
95 | when zustand_2 => |
96 | naechst_zustand <= zustand_3; |
97 | when zustand_3 => |
98 | naechst_zustand <= zustand_4; |
99 | when zustand_4 => |
100 | --if (clk' event and clk ='1') then
|
101 | -- for index in 0 to 7 loop
|
102 | -- din <= data(index*8 to (index*8)+7);
|
103 | din <= data; |
104 | if (full = '0') then |
105 | wr_en <='1' ; |
106 | naechst_zustand <= zustand_4; |
107 | |
108 | else
|
109 | wr_en<='1'; |
110 | naechst_zustand <= zustand_5; |
111 | end if; |
112 | when zustand_5 => |
113 | -- wr_en <='0';
|
114 | naechst_zustand <= zustand_5; |
115 | end case; |
116 | end process; |
117 | t_6: process (clk) begin |
118 | if (clk' event and clk ='1') then |
119 | zwischen_status <= naechst_status; |
120 | end if; |
121 | end process; |
122 | -- fsm process zum lesen
|
123 | t_7: process (zwischen_status,empty) begin |
124 | case (zwischen_status)is |
125 | when status_1 => |
126 | if (empty ='0')then |
127 | rd_en <='1'; |
128 | else
|
129 | rd_en <= '0'; |
130 | end if; |
131 | end case; |
132 | end process; |
133 | end Behavioral; |
danke im voraus
:
Bearbeitet durch Moderator
Beim ersten schnellen drüberschauen springt mir erstmal das hier ins Auge: reno kortes schrieb: > din <= data; din ist ein 8 bit Vektor, data ein 64 bit Vektor. Damit wird din immer die ersten 8 bit von data zugewiesen. Ich vermisse irgendwo die Zuweisung der nächsten 8 bit. z.B. din <= data (63 downto 56) din <= data (55 downto 48) ...
M. D. schrieb: > reno kortes schrieb: >> din <= data; > > din ist ein 8 bit Vektor, data ein 64 bit Vektor. Damit wird din immer > die ersten 8 bit von data zugewiesen. Welcher Compiler/Simulator macht das denn so? Modelsim würde dafür einen Fehler ausgeben...
ja das stimmt aber ich auch schon mit din <= data(63 downto 56) din <= data(55 downto 48) din <= data(47 downto 40) din <= data(39 downto 32) ... probiert aber immer nur die ersten 8bit wie macht er das liest er die alle in einem clk oder jede 8bit in einem clk aber ist die simulation schon richtig überhaupt ich meine die "FULL" UND "EMPTY"
ich habe mir sowas überlegt : if (clk' event and clk ='1') then for index in 0 to 7 loop --da mein fifo ist 8x8 bit din <= data(index*8 to (index*8)+7); aber wo soll ich die schleife einsetzen in einem processs oder fsm ???
reno kortes schrieb: > ich habe mir sowas überlegt : > > if (clk' event and clk ='1') then > for index in 0 to 7 loop --da mein fifo ist 8x8 bit > din <= data(index*8 to (index*8)+7); > aber wo soll ich die schleife einsetzen in einem processs oder fsm ??? Abgesehen davon, dass der Compiler über "to" ungleich "downto" meckern würde, hätte das denselben Effekt wie die Zuweisungen, die Du vorher beschrieben hast... Ich weiß solche Antworten helfen nicht wirklich weiter, aber da fehlt es eindeutig noch an VHDL-Grundlagen.
Offenbar möchtest Du ein FIFO mit unterschiedlichen Datenbreiten. Trotzdem muß der mittlere Zufluss dem mittleren Abfluss entsprechen. Wenn Du mit einem Takt 64 Bit ins FIFO schreibst (dazu muss muß der Schreibport auch 64 Bit breit sein), kannst Du mit acht Takten auf der anderen Seite 8 x 8 Bit auslesen (dazu muß die Leseseite 8 Bit breit sein). Duke
eingentlich will ich nur simulieren wie es aussieht wenn der fifo voll ist deswegen will ich 64 bit reinschreiben bis er voll ist. ich will nur den satz : "schreibe solange der fifo nicht voll immer wieder daten rein" implimentieren. und das habe ich im zustand_4 probiert
1 | when zustand_4 => |
2 | --if (clk' event and clk ='1') then
|
3 | -- for index in 0 to 7 loop
|
4 | -- din <= data(index*8 to (index*8)+7);
|
5 | din <= data; |
6 | |
7 | if (full = '0') then |
8 | wr_en <='1' ; |
9 | naechst_zustand <= zustand_4; |
10 | |
11 | else
|
12 | wr_en<='1'; |
13 | naechst_zustand <= zustand_5; |
14 | end if; |
15 | when zustand_5 => |
:
Bearbeitet durch Moderator
soweit ich verstehe solls ja nur eine Testbench werden, soll also nicht synthetisiert werden, dann ist so doch einfacher:
1 | din_process: process begin |
2 | wr_en <= '0'; -- in den Ruhezustand |
3 | din <= "wert1"; |
4 | wait until rising_edge(clk); |
5 | wr_en <= '1'; |
6 | wait until rising_edge(clk); |
7 | wr_en <= '0'; |
8 | |
9 | wait until rising_edge(clk); -- kann auch in eine procedure |
10 | din <= "wert2"; |
11 | wait until rising_edge(clk); |
12 | wr_en <= '1'; |
13 | wait until rising_edge(clk); |
14 | wr_en <= '0'; -- oder stures copy paste ... |
15 | |
16 | wait until rising_edge(clk); -- so warten wir noch auf den fifo |
17 | if (full = '1') |
18 | wait until falling_edge(full) |
19 | din <= "wert3"; |
20 | wait until rising_edge(clk); |
21 | wr_en <= '1'; |
22 | wait until rising_edge(clk); |
23 | wr_en <= '0'; |
24 | |
25 | -- und und und
|
26 | end din_process: process; |
27 | |
28 | read_process : process |
29 | read_en <= '0'; |
30 | wait für 200us; -- oder so, halt eine Zeitlang bis fifo voll ist |
31 | read_en <= '1'; |
32 | |
33 | --usw usw usw ...
|
nur so als Anregung, Vorsicht könnte sytaxfehler enthalten!
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.