Forum: FPGA, VHDL & Co. Hilfe beim lesen von Daten


von xyz (Gast)


Lesenswert?

Hallo Leute

Ich arbeite seit einer Woche mit VHDL
Ich hab einen Zähler implementiert der auch funktioniert.
Der Zählerstand wird dann in meinen FIFO geladen (also es wird im FIFO 
geschrieben) Die Module habe ich über Signale miteinander verbunden.
Man erkennt auch, dass der Eingang meines Speichers (Din) den selben 
Zählerstand des Ausgangs meines Schreibmodul hat. Was ich jetzt aber 
nicht verstehe ist, dass mein Lesemodul diesen Zählerstand nicht lesen 
kann...
Ich würde mich freuen Wenn mein Speicher am Ausgang überhaupt einen 
Zählerstand ungleich 0 ausgibt. Habt ihr eventuell eine Ahnung woran es 
liegen kann? Der Schreibvorgang funktioniert ja


****************Code Schreibmodul***********************
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL
4
5
entity write_m is
6
7
port(
8
    clk      : in std_logic;
9
    rst      : in std_logic;
10
    enable_w : in std_logic;
11
    d_out    : out std_logic_vector(17 downto 0); 
12
    w_out    : out std_logic; 
13
    full     : in std_logic
14
); 
15
16
end write_m;
17
18
architecture Behavioral of write_m is
19
20
signal d_out_1 : std_logic_vector(17 downto 0);
21
22
begin
23
24
process(rst,clk)
25
begin
26
  if(rst = '1') then
27
  d_out_1 <= (others => '0');
28
        w_out <= '0';
29
         elsif (clk = '1') and clk'event then
30
          if (enable_w = '1' and full = '0') then
31
            w_out <=  '1';
32
            d_out_1  <= std_logic_vector(unsigned(d_out_1)+1);
33
         else
34
            d_out_1  <= std_logic_vector(unsigned(d_out_1));
35
            w_out <= '0';
36
        end if;
37
       end if;
38
     end process;
39
    
40
  d_out <= d_out_1; 
41
  end Behavioral;

**************Code Lesemodul****************
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL
4
5
entity read_m is
6
port(
7
     clk       : in std_logic;
8
     rst       : in std_logic;
9
     d_in_r    : in std_logic_vector(17 downto 0);
10
     empty     : in std_logic;
11
     enable_r  : in std_logic;
12
     d_out     : out std_logic_vector(17 downto 0);
13
     r_out     : out std_logic
14
);
15
16
17
end read_m;
18
19
architecture Behavioral of read_m is
20
signal d_out_1 : std_logic_vector(17 downto 0);
21
22
begin
23
  process(rst,clk)
24
  begin
25
      if(rst = '0') then 
26
     d_out_1 <=  (others => '0');
27
     r_out <= '0';
28
        if (clk = '1') and clk'event then
29
        if (enable_r = '1' and empty = '0') then  
30
      r_out <= '1';
31
            d_out_1 <= std_logic_vector(unsigned(d_in_r));
32
         end if;
33
         end if;
34
      end if;
35
    end process;
36
 
37
           d_out <= d_out_1; 
38
  
39
 end Behavioral;



****Speicher(FIFO mit IP Core generiert)************


***********TOPMODUL***************************
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL
4
5
entity TOP is
6
port (
7
     clk      : in std_logic;                    
8
     rst      : in std_logic;
9
     enable_w : in std_logic;
10
     enable_r : in std_logic;
11
     d_out    : out std_logic_vector(17 downto 0)
12
     );    
13
end TOP;
14
15
architecture Behavioral of TOP is 
16
17
18
19
component write_m 
20
21
port(
22
     clk      : in std_logic;
23
     rst      : in std_logic;
24
     enable_w : in std_logic;              
25
     d_out    : out std_logic_vector(17 downto 0);   
26
     w_out    : out std_logic;                
27
     full     : in std_logic                  
28
END COMPONENT;
29
30
31
32
33
COMPONENT fifo_neu
34
  PORT (
35
    clk   : IN STD_LOGIC;
36
    rst   : IN STD_LOGIC;
37
    din   : IN STD_LOGIC_VECTOR(17 DOWNTO 0);
38
    wr_en : IN STD_LOGIC;
39
    rd_en : IN STD_LOGIC;
40
    dout  : OUT STD_LOGIC_VECTOR(17 DOWNTO 0);
41
    full  : OUT STD_LOGIC;
42
    empty : OUT STD_LOGIC
43
  );
44
END COMPONENT;
45
46
47
component read_m
48
port(
49
     clk       : in std_logic;
50
     rst       : in std_logic;
51
     d_in_r    : in std_logic_vector(17 downto 0);
52
     empty     : in std_logic;
53
     enable_r  : in std_logic;
54
     d_out     : out std_logic_vector(17 downto 0);
55
     r_out     : out std_logic
56
    );
57
end component;
58
59
60
61
62
63
64
65
signal fifo_out   : std_logic_vector(17 downto 0);
66
signal fifo_in    : std_logic_vector(17 downto 0);
67
signal fifo_wr    : std_logic;
68
signal fifo_full  : std_logic;
69
signal fifo_empty : std_logic;
70
signal fifo_rd    : std_logic;
71
72
begin
73
74
75
your_instance_name : fifo_neu
76
  PORT MAP (
77
           clk => clk,
78
           rst => rst,
79
           din => fifo_in,
80
           wr_en => fifo_wr,
81
           rd_en => fifo_rd,        
82
           dout =>  fifo_out,                 
83
           full => fifo_full,
84
           empty =>  fifo_empty
85
          );
86
87
write_i : write_m
88
Port Map(
89
     clk => clk,
90
     rst => rst,
91
     enable_w => enable_w,
92
     d_out => fifo_in,
93
     w_out => fifo_wr,
94
     full =>  fifo_full
95
    );
96
  
97
      
98
read_i : read_m 
99
port map(      
100
  
101
      clk => clk,
102
      rst => rst,
103
      enable_r => enable_r,
104
      d_in_r =>  fifo_out,        
105
      empty => fifo_empty,
106
      d_out => d_out,
107
      r_out => fifo_rd
108
    );
109
110
111
end Behavioral;


***********Testbench von TOP ************
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
ENTITY TOP_2tb IS
9
END TOP_2tb;
10
 
11
ARCHITECTURE behavior OF TOP_2tb IS 
12
 
13
    -- Component Declaration for the Unit Under Test (UUT)
14
 
15
    COMPONENT TOP
16
    PORT(
17
         clk : IN  std_logic;
18
         rst : IN  std_logic;
19
         enable_w : IN  std_logic;
20
         enable_r : IN  std_logic;
21
         d_out : OUT  std_logic_vector(17 downto 0)
22
        );
23
    END COMPONENT;
24
    
25
26
   --Inputs
27
   signal clk : std_logic := '0';
28
   signal rst : std_logic := '0';
29
   signal enable_w : std_logic := '0';
30
   signal enable_r : std_logic := '0';
31
32
   --Outputs
33
   signal d_out : std_logic_vector(17 downto 0);
34
35
   -- Clock period definitions
36
   constant clk_period : time := 10 ns;
37
 
38
BEGIN
39
 
40
  -- Instantiate the Unit Under Test (UUT)
41
   uut: TOP PORT MAP (
42
          clk => clk,
43
          rst => rst,
44
          enable_w => enable_w,
45
          enable_r => enable_r,
46
          d_out => d_out
47
        );
48
49
   -- Clock process definitions
50
   clk_process :process
51
   begin
52
   clk <= '0';
53
   wait for clk_period/2;
54
   clk <= '1';
55
   wait for clk_period/2;
56
   end process;
57
 
58
59
   -- Stimulus process
60
   stim_proc: process
61
   begin    
62
    --Reset
63
    rst <= '1';
64
     wait for 20 ns;
65
     rst <= '0';
66
      
67
    --Write
68
    enable_W <= '1';
69
    wait for 350 ns;
70
    
71
    --Write and Read
72
    enable_R <= '1';
73
    wait for 100 ns;
74
    
75
    --Read
76
    enable_W <= '0';
77
    wait for 350 ns;
78
  
79
    --No operation
80
    enable_R <= '0';
81
    
82
    wait for clk_period*10;
83
    wait;
84
   end process;
85
86
END;

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


Lesenswert?

Ist der Resetimpuls lang genug?
1
When reset is implemented, it is synchronized internally to the core 
2
with each respective clock domain for setting the internal logic of 
3
the FIFO to a known state.

BTW: bitte die VHDL Tags verwenden:
1
[vhdl]
2
   VHDL Code
3
[/vhdl]

von xyz (Gast)


Lesenswert?

Habe den Resetimpuls verlängert. Leider wird immmer noch nicht gelesen. 
Und der Ausgang des Fifos ist noch auf 0(Dezimal)...

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


Lesenswert?

Ääähm, wo lernt man denn sowas:
1
  process(rst,clk)
2
  begin
3
     if (rst = '0') then 
4
        d_out_1 <=  (others => '0');
5
        r_out <= '0';
6
        if (clk = '1') and clk'event then
7
           if (enable_r = '1' and empty = '0') then  
8
              r_out <= '1';
9
              d_out_1 <= std_logic_vector(unsigned(d_in_r));
10
           end if;
11
        end if;
12
     end if;
13
  end process;
Der Reset ist hier nur ein Clock-Enable und sonst an Nutzlosigkeit nicht 
zu übertreffen...

Siehe dort die Variante 3:
http://www.lothar-miller.de/s9y/categories/6-Clock-Enable

xyz schrieb:
> Leider wird immmer noch nicht gelesen. Und der Ausgang des Fifos ist
> noch auf 0(Dezimal)...
Woran erkennt man das?

: Bearbeitet durch Moderator
von xyz (Gast)


Angehängte Dateien:

Lesenswert?

In der Simulation sieht man, dass der Ausgang des FIFO das folgende 
Bitmuster hat ("000000000000000000")

Der Eingang des FIFO erhält wie gewünscht den Zählerstand des Zählers,
Jetzt wollte ich diesen Zählerstand zum Eingang des Lesemoduls verbinden 
was nicht funktioniert. Das Problem ist,dass d_out bzw fifo_out die 
ganze Zeit keine Daten erhalten.

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


Lesenswert?

xyz schrieb:
> In der Simulation sieht man
Du hast da was Falsches angehängt, oder?

Mein Tipp:
Wenn der Fifo sowieso vollkommen synchron ist, dann sieh dir das mal an:
http://www.lothar-miller.de/s9y/archives/21-FIFO.html

von xyz (Gast)


Angehängte Dateien:

Lesenswert?

Ja hatte aus versehen die falsche Datei hochgeladen.

Der Teil von "write zu FIFO" klappt ohne Probleme aber der zweite Teil 
von "FIFO zu read" klappt irgendwie nicht...

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.