OpenCores
URL https://opencores.org/ocsvn/ddr2_sdram/ddr2_sdram/trunk

Subversion Repositories ddr2_sdram

[/] [ddr2_sdram/] [trunk/] [DDR2_Read_VHDL.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 john_fpga
---------------------------------------------------------------------
2
-- File :                       DDR2_Read_VHDL.vhd
3
-- Projekt :            Prj_12_DDR2
4
-- Zweck :                      DDR2-Read-Funktion
5
-- Datum :        19.08.2011
6
-- Version :      2.0
7
-- Plattform :    XILINX Spartan-3A
8
-- FPGA :         XC3S700A-FGG484
9
-- Sprache :      VHDL
10
-- ISE :                                ISE-Design-Suite V:13.1
11
-- Autor :        UB
12
-- Mail :         Becker_U(at)gmx.de
13
---------------------------------------------------------------------
14
library IEEE;
15
use IEEE.STD_LOGIC_1164.ALL;
16
use IEEE.STD_LOGIC_ARITH.ALL;
17
use IEEE.STD_LOGIC_UNSIGNED.ALL;
18
 
19
        --------------------------------------------
20
        -- Beschreibung :
21
        --
22
        -- Die State-Machine liest
23
        -- einen 64Bit Wert aus dem RAM
24
        -- von 4 aufeinander folgenden 16bit-Zellen
25
        --
26
        -- die Adresse wird
27
        -- von der übergeordneten CONTROL-Unit
28
        -- gehandelt
29
        -- 
30
        -- solange die Read-Funktion läuft,
31
        -- ist READ_BUSY=1
32
        --------------------------------------------
33
 
34
entity DDR2_Read_VHDL is
35
 
36
        --------------------------------------------
37
        -- Port Deklerationen
38
        --------------------------------------------
39
        port (
40
                reset_in : in std_logic;
41
                clk_in : in std_logic;
42
                clk90_in : in std_logic;
43
                r_command_register : out std_logic_vector(2 downto 0);
44
                r_cmd_ack : in std_logic;
45
                r_burst_done : out std_logic;
46
                r_data_valid : in std_logic;
47
                read_en : in std_logic;
48
                read_busy : out std_logic;
49
                output_data : in std_logic_vector(31 downto 0);
50
                read_data : out std_logic_vector(63 downto 0)
51
        );
52
 
53
end DDR2_Read_VHDL;
54
 
55
architecture Verhalten of DDR2_Read_VHDL is
56
 
57
        --------------------------------------------
58
        -- Interne Signale
59
        --------------------------------------------
60
 
61
        signal v_data_lsb : std_logic_vector(31 downto 0):=(others => '0');
62
        signal v_data_msb : std_logic_vector(31 downto 0):=(others => '0');
63
 
64
        constant CLK_ANZ : integer := 1;   -- warte 2 Clockzyklen (1 bis 0 = 2)
65
        signal v_counter :  natural range 0 to CLK_ANZ := CLK_ANZ;
66
 
67
        type STATE_RA_TYPE is (
68
                RA_1_NOP,
69
                RA_2_WAIT_4_ACK1,
70
                RA_3_WAIT_CLK,
71
                RA_4_SET_BURST,
72
                RA_5_SET_NOP,
73
                RA_6_WAIT_4_ACK0
74
        );
75
        signal STATE_RA : STATE_RA_TYPE := RA_1_NOP;
76
 
77
        type STATE_RB_TYPE is (
78
                RB_1_NOP,
79
                RB_2_WAIT_4_VALID1,
80
                RB_3_DATA_MSB,
81
                RB_4_WAIT_4_ACK0
82
        );
83
        signal STATE_RB : STATE_RB_TYPE := RB_1_NOP;
84
 
85
begin
86
 
87
        -----------------------------------------
88
        -- State-Machine RA : (Clock-0 Lo-Flanke)
89
        --   1. wartet auf das READ_EN=1 von der DDR2_Control
90
        --   2. sendet das READ-Kommando an das RAM
91
        --   3. wartet auf das ACK=1 vom RAM
92
        --   4. wartet 2 Clockzyklen
93
        --      (solange dauert das lesen von 64Bit)
94
        --   5. legt das BURST_DONE-Signal für 2 Clockzyklen an
95
        --   6. wartet auf das ACK=0 vom RAM
96
        --   7. Sprung zu Punkt 1
97
        -----------------------------------------       
98
        P_Read_RA : process(clk_in,reset_in)
99
        begin
100
                if reset_in = '1' then
101
                        r_burst_done <= '0';
102
                        r_command_register <= "000";
103
                        STATE_RA <= RA_1_NOP;
104
                elsif falling_edge(clk_in) then
105
                        -- Default Stellungen
106
                        r_burst_done <= '0';
107
                        r_command_register <= "000";
108
                        -- State-Machine
109
                        case STATE_RA is
110
                                when RA_1_NOP =>
111
                                        -- warten auf read enable signal                                        
112
                                        v_counter <= CLK_ANZ;
113
                                        if read_en = '1' then
114
                                                -- read enable wurde erkannt
115
                                                STATE_RA <= RA_2_WAIT_4_ACK1;
116
                                        end if;
117
                                when RA_2_WAIT_4_ACK1 =>
118
                                        -- READ-CMD anlegen
119
                                        -- warten auf ACK=1 signal      
120
                                        r_command_register <= "110";
121
                                        if r_cmd_ack = '1' then
122
                                                -- ack-signal wurde erkannt
123
                                                STATE_RA <= RA_3_WAIT_CLK;
124
                                        end if;
125
                                when RA_3_WAIT_CLK =>
126
                                        -- warte ein paar Clockzyklen
127
                                        r_command_register <= "110";
128
                                        if v_counter = 0 then
129
                                                STATE_RA <= RA_4_SET_BURST;
130
                                        else
131
                                                v_counter <= v_counter - 1;
132
                                        end if;
133
                                when RA_4_SET_BURST =>
134
                                        r_command_register <= "110";
135
                                        r_burst_done <= '1';
136
                                        STATE_RA <= RA_5_SET_NOP;
137
                                when RA_5_SET_NOP =>
138
                                        -- NOP-CMD anlegen      
139
                                        -- bei Burst_Done=Hi
140
                                        r_burst_done <= '1';
141
                                        STATE_RA <= RA_6_WAIT_4_ACK0;
142
                                when RA_6_WAIT_4_ACK0 =>
143
                                        -- burst_done auf Lo
144
                                        -- warten auf ACK=0 signal                                                                      
145
                                        if r_cmd_ack = '0' then
146
                                                -- ack-signal wurde erkannt
147
                                                STATE_RA <= RA_1_NOP;
148
                                        end if;
149
                                when others =>
150
                                        NULL;
151
                        end case;
152
                end if;
153
        end process P_Read_RA;
154
 
155
        -----------------------------------------
156
        -- State-Machine RB : (Clock-90 Hi-Flanke)
157
        --   1. wartet bis State-Machine-RA das
158
        --      READ-Kommando gesendet hat
159
        --   2. warte auf das DATA_VALID=1 vom RAM
160
        --   3. liest die LSB-Daten (32Bit) vom RAM
161
        --   4. wartet einen Clockzyklus
162
        --   5. liest die MSB-Daten (32Bit) vom RAM
163
        --   6. wartet auf das ACK=0 vom RAM
164
        --   7. Sprung zu Punkt 1
165
        -----------------------------------------       
166
        P_Read_RB : process(clk90_in,reset_in)
167
        begin
168
                if reset_in = '1' then
169
                        -- reset button ist gedrueckt
170
                        v_data_lsb <=  (others => '0');
171
                        v_data_msb <=  (others => '0');
172
                        STATE_RB <= RB_1_NOP;
173
                elsif rising_edge(clk90_in) then
174
                        case STATE_RB is
175
                                when RB_1_NOP =>
176
                                        -- warten bis Read enable                                                               
177
                                        if STATE_RA = RA_2_WAIT_4_ACK1 then
178
                                                -- ack-signal wurde erkannt
179
                                                STATE_RB <= RB_2_WAIT_4_VALID1;
180
                                        end if;
181
                                when RB_2_WAIT_4_VALID1 =>
182
                                        -- warte bis Daten Valid sind                                   
183
                                        if r_data_valid = '1' then
184
                                                -- LSB Daten sind ok
185
                                                v_data_lsb <= output_data;
186
                                                STATE_RB <= RB_3_DATA_MSB;
187
                                        else
188
                                                v_data_lsb <= v_data_lsb;
189
                                        end if;
190
                                when RB_3_DATA_MSB =>
191
                                        -- MSB Daten lesen
192
                                        if r_data_valid = '1' then
193
                                                -- MSB Daten sind ok    
194
                                                v_data_msb <= output_data;
195
                                        else
196
                                                v_data_msb <= v_data_msb;
197
                                        end if;
198
                                        STATE_RB <= RB_4_WAIT_4_ACK0;
199
                                when RB_4_WAIT_4_ACK0 =>
200
                                        -- warten auf ACK=0 vom RAM
201
                                        if r_cmd_ack = '0' then
202
                                                -- ack-signal wurde erkannt
203
                                                STATE_RB <= RB_1_NOP;
204
                                        end if;
205
                                when others =>
206
                                        NULL;
207
                        end case;
208
                end if;
209
        end process P_Read_RB;
210
 
211
 
212
        -----------------------------------------
213
        -- Read-Busy erzeugen :
214
        -- solange der Read-Prozess im Gange
215
        -- ist READ_BUSY = 1    
216
        -----------------------------------------               
217
        read_busy <= '0' when STATE_RA=RA_1_NOP else '1';
218
 
219
        -----------------------------------------
220
        -- Read-Data uebergeben :
221
        -- 64Bit zusammengesetzt aus MSB & LSB
222
        -----------------------------------------               
223
        read_data <= v_data_msb & v_data_lsb;
224
 
225
end Verhalten;
226
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.