Forum: FPGA, VHDL & Co. hilfe warum ist DIN "undefiniert"


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


Angehängte Dateien:

Lesenswert?

ich probiere nur ein datenwort in dem FIFO (ip core)zu schreiben und 
benutze dafür eine state machine
hier ist der testbench:
bin dankbar für jeden vorschlag
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
4
COMPONENT fifo_generator_v9_3_0
5
  PORT (
6
    clk :   IN STD_LOGIC;
7
    rst :   IN STD_LOGIC;
8
    din :   IN STD_LOGIC_VECTOR(31 DOWNTO 0);
9
    wr_en : IN STD_LOGIC;
10
    rd_en : IN STD_LOGIC;
11
    dout :  OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
12
    full :  OUT STD_LOGIC;
13
    empty : OUT STD_LOGIC
14
  );
15
END COMPONENT;
16
-- inputs
17
signal  clk :   STD_LOGIC ;--:= '0';
18
signal rst :    STD_LOGIC := '0';
19
--signal Rest:    STD_LOGIC :='0' ;
20
signal reset:   STD_LOGIC ;--= '0';
21
signal din :    STD_LOGIC_VECTOR(31 DOWNTO 0);
22
signal  wr_en : STD_LOGIC ;--= '0';
23
signal  rd_en : STD_LOGIC := '0';
24
--outputs
25
signal dout :   STD_LOGIC_VECTOR(31 DOWNTO 0);
26
signal full :   STD_LOGIC ;
27
signal empty:   STD_LOGIC ;
28
type state_type is (zustand_1,zustand_2,zustand_3,zustand_4,zustand_5);
29
signal zwischen_zustand ,naechst_zustand : state_type ;
30
--clock period definition
31
 constant clk_period : time := 20 ns;
32
begin
33
your_instance_name : fifo_generator_v9_3_0
34
  PORT MAP (
35
    clk => clk,
36
    rst => reset,
37
    din => din,
38
    wr_en => wr_en,
39
    rd_en => rd_en,
40
    dout => dout,
41
    full => full,
42
    empty => empty
43
  );
44
  --clock process definition
45
clk_process: process begin
46
   clk <= '0';
47
   wait for clk_period/2;
48
   clk <= '1';
49
   wait for clk_period/2;
50
end process;
51
     
52
rst_process: process begin
53
   reset <= '0';
54
   wait for clk_period;
55
   reset <= '1';
56
   wait for clk_period;
57
   reset <= '0';
58
   wait;   
59
end process;
60
t_1: process (clk,reset) begin
61
   if (reset='1') then
62
     --wait for 10 ns;
63
    rst<='1';
64
    --default state on reset.
65
   elsif (clk' event and clk ='1') then --rising_edge(clk)
66
     rst<='0';  
67
     rd_en <='0';          
68
    zwischen_zustand <= naechst_zustand ;   --state change.
69
   --naechst_zustand<= zustand_1;
70
   end if;
71
end process;
72
  --fsm process
73
     
74
t_2:  process (zwischen_zustand)
75
    begin
76
    case zwischen_zustand is
77
    when zustand_1 =>
78
    wr_en<='0';
79
    naechst_zustand <= zustand_2;
80
    when zustand_2 =>
81
    
82
    naechst_zustand <= zustand_3;
83
    when zustand_3 =>
84
    naechst_zustand <= zustand_4;
85
    when zustand_4 =>      
86
  if (full ='0') then 
87
    din <= X"deadbeef";
88
    naechst_zustand <= zustand_4;  
89
    wr_en <='1';
90
    else
91
   naechst_zustand <= zustand_5;
92
    wr_en <='1';
93
    end if;
94
    when zustand_5 =>  
95
    wr_en <='0';
96
    naechst_zustand <= zustand_5;
97
     end case;
98
     end process;  
99
end Behavioral;
aber bei der simulation ist der signal DIN undefiniert
was könnte der grund sein ?

: Bearbeitet durch Admin
von dito (Gast)


Lesenswert?

Weiß jetzt nicht, ob es daran liegt: aber deine sensitivity list vom 
Prozess t_2 ist unvollständig.

von Jonas B. (jibi)


Lesenswert?

Wo stimulierst du die Signale?

Gruß Jonas

von Leonard Lebewohl (Gast)


Lesenswert?

Da das signal "full" im state zustand_4 '1' ist, wird din nicht 
zugewiesen.

MfG

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


Lesenswert?

vielen Dank für die rückmeldung

ja das höre ich zum ersten mal  "sensititvity list "  und ich habe auch 
drüber gelesen aber ich kann es nicht nachvollziehen was das genau 
bedeutet
"in einem process muss mindestens ein signal aktiv sein sonst wird der 
process nicht bearbeitet "
könnte mir jemand an hand meinem Fehler vielleicht erklären ??

ich habe nur die zeile :din <= X"deadbeef";
im nächsten zustand geschrieben und ist jetzt  DIN nicht mehr 
undefiniert aber ob das jetzt die richtige lösung war ??

schönen Gruss

von berndl (Gast)


Lesenswert?

das was du in deinem Eingangspost beschreibst ist weder eine Komponente, 
noch eine Testbench! Wo ist dein 'entity' statement? Hinweis: Eine TB 
hat eine Entity ohne Ein/Ausgaenge!

Rein formal fehlt in deinem t_2-Prozess noch das 'full' in der 
Sensitivity-Liste. Diese Sensitivity-Liste sagt dem Simulator (und nur 
dem), dass er diesen Prozess neu berechnen soll, wenn sich eines oder 
mehrere Signal in der Liste aendert. Wenn dann 'full' fehlt, dann 
'rechnet' der Simulator bei einer Aenderung halt nicht neu, eine 
Aenderung von 'full' wird halt erst bei der naechsten Berechnung 
beruecksichtigt (wenn sich 'zwischen_zustand' aendert).

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


Lesenswert?

ja entitiy habe ich nur nicht mitkopiert aber auf tb ist schon drin :-)

also jetzt müsste ich nur das signal full in meinem process in der 
sensitivity list eingeben :
tb:process(full,zwischen_zustand)
jetzt zumindest habe ich verstanden was diese sensitivity list macht :-) 
danke

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


Lesenswert?

Das eigentliche Problem hat Leonard Lebewohl schon beschrieben.

reno kortes schrieb:
> ich habe nur die zeile :din <= X"deadbeef";
> im nächsten zustand geschrieben und ist jetzt  DIN nicht mehr
> undefiniert aber ob das jetzt die richtige lösung war ??
Tja, das kannst nur du wissen. Eine Testbench beschreibt die Hardware, 
die du hast. Wenn die im Zustand 5 an DIN etwas ausgibt, dann passt der 
Ansatz. Wenn nicht, dann ist die Testbench falsch...

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


Lesenswert?

hallo ich bins wieder
jetzt habe ich eine state machine zum lesen geschrieben, brauch ich 
einen anderen clk zum lesen oder den selben nur mit anderem frequenz 
oder keinem???

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


Lesenswert?

Das kannst nur du wissen. Kein anderer sonst kennt deine Aufgabe...

Der Fifo, den du oben im VHDL-Code hast, hat nur 1 Takt:
1
COMPONENT fifo_generator_v9_3_0
2
  PORT (
3
    clk :   IN STD_LOGIC;        ---<<<---- da isser, der einzige Takt....
4
    rst :   IN STD_LOGIC;
5
    din :   IN STD_LOGIC_VECTOR(31 DOWNTO 0);
6
    wr_en : IN STD_LOGIC;
7
    rd_en : IN STD_LOGIC;
8
    dout :  OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
9
    full :  OUT STD_LOGIC;
10
    empty : OUT STD_LOGIC
11
  );

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


Angehängte Dateien:

Lesenswert?

ich habe zwei processe zum lesen geschrieben
die signale der fsm sind oben deklariert

t_6: process (clk) begin
 if (clk' event and clk ='1') then
 zwischen_status <= naechst_status;
 end if;
end process;

t_7: process (zwischen_status, empty) begin
  case (zwischen_status)is
  when status_1 =>
 if (empty ='0')then
 rd_en <='1';
 else
 wr_en <= '0';
end if;
 end case;
end process;

aber in der simulation habe ich nichts in meinem DOUT das ist mein 
erster versuch daten im fifo einzuschreiben und zu lesen. und es klappt 
noch nicht aber geht langsamm mit eure Hilfe :-)

hier ist meine Simulation

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.