Forum: FPGA, VHDL & Co. hilfe bei fifo


von reno k. (Firma: student) (rayes)


Angehängte Dateien:

Lesenswert?

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

von M. D. (wpmd)


Lesenswert?

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
von reno k. (Firma: student) (rayes)


Lesenswert?

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
von M. D. (wpmd)


Lesenswert?

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)
...

von pks (Gast)


Lesenswert?

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...

von reno k. (Firma: student) (rayes)


Lesenswert?

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"

von reno k. (Firma: student) (rayes)


Lesenswert?

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 ???

von pks (Gast)


Lesenswert?

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.

von Duke Scarring (Gast)


Lesenswert?

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

von reno k. (Firma: student) (rayes)


Lesenswert?

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
von bko (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.