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

Subversion Repositories ddr2_sdram

[/] [ddr2_sdram/] [trunk/] [DDR2_Write_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_Write_VHDL.vhd
3
-- Projekt :            Prj_12_DDR2
4
-- Zweck :                      DDR2-Write-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 schreibt
23
        -- einen 64Bit Wert ins RAM
24
        -- in 4 aufeinander folgenden 16bit-Zellen
25
        --
26
        -- die Adresse wird
27
        -- von der übergeordneten CONTROL-Unit
28
        -- gehandelt
29
        -- 
30
        -- solange die Write-Funktion läuft,
31
        -- ist WRITE_BUSY=1
32
        --------------------------------------------
33
 
34
entity DDR2_Write_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
                w_command_register : out std_logic_vector(2 downto 0);
44
                w_cmd_ack : in std_logic;
45
                w_burst_done : out std_logic;
46
                write_en : in std_logic;
47
                write_busy : out std_logic;
48
                input_data : out std_logic_vector(31 downto 0);
49
                write_data : in std_logic_vector(63 downto 0)
50
        );
51
 
52
end DDR2_Write_VHDL;
53
 
54
architecture Verhalten of DDR2_Write_VHDL is
55
 
56
        --------------------------------------------
57
        -- Interne Signale
58
        --------------------------------------------
59
 
60
        constant CLK_ANZ : integer := 2; -- warte 3 Clockzyklen (2 bis 0 = 3)   
61
        signal v_counter :  natural range 0 to CLK_ANZ := CLK_ANZ;
62
 
63
        type STATE_WA_TYPE is (
64
                WA_1_NOP,
65
                WA_2_WRITE_CMD,
66
                WA_3_WAIT_4_ACK1,
67
                WA_4_WAIT_3_CLK,
68
                WA_5_BURST_HI,
69
                WA_6_BURST_OK,
70
                WA_7_WAIT_4_ACK0
71
        );
72
        signal STATE_WA : STATE_WA_TYPE := WA_1_NOP;
73
 
74
        type STATE_WB_TYPE is (
75
                WB_1_NOP,
76
                WB_2_DATA_LSB,
77
                WB_3_T1,
78
                WB_4_T2,
79
                WB_5_DATA_MSB
80
        );
81
        signal STATE_WB : STATE_WB_TYPE := WB_1_NOP;
82
 
83
begin
84
 
85
        -----------------------------------------
86
        -- State-Machine WA : (Clock-0 Lo-Flanke)
87
   --   1. wartet auf das WRITE_EN=1 von der DDR2_Control
88
        --   2. sendet das WRITE-Kommando an das RAM
89
        --   3. wartet auf das ACK=1 vom RAM
90
        --   4. wartet 3 Clockzyklen
91
        --      (solange dauert das schreiben von 64Bit)
92
        --   5. legt das BURST_DONE-Signal für 2 Clockzyklen an
93
        --   6. wartet auf das ACK=0 vom RAM
94
        --   7. Sprung zu Punkt 1
95
        -----------------------------------------       
96
        P_Write_WA : process(clk_in,reset_in)
97
        begin
98
                if reset_in = '1' then
99
                        -- reset button ist gedrueckt
100
                        STATE_WA <= WA_1_NOP;
101
                        w_command_register <= "000"; -- NOP
102
                        w_burst_done <= '0';
103
                elsif falling_edge(clk_in) then
104
                        case STATE_WA is
105
                                when WA_1_NOP =>
106
                                        -- warte auf write enable signal
107
                                        w_command_register <= "000"; -- NOP
108
                                        v_counter <= CLK_ANZ;
109
                                        w_burst_done <= '0';
110
                                        if write_en = '1' then
111
                                                STATE_WA <= WA_2_WRITE_CMD;
112
                                        end if;
113
                                when WA_2_WRITE_CMD =>
114
                                        -- CMD anlegen
115
                                        w_command_register <= "100"; -- WRITE-CMD
116
                                        STATE_WA <= WA_3_WAIT_4_ACK1;
117
                                when WA_3_WAIT_4_ACK1 =>
118
                                        -- warten auf ACK=1 vom RAM
119
                                        if w_cmd_ack = '1' then
120
                                                STATE_WA <= WA_4_WAIT_3_CLK;
121
                                        end if;
122
                                when WA_4_WAIT_3_CLK =>
123
                                        -- warte 3 Clockzyklen
124
                                        if v_counter = 0 then
125
                                                -- burst_done auf HI
126
                                                w_burst_done <= '1';
127
                                                STATE_WA <= WA_5_BURST_HI;
128
                                        else
129
                                                w_burst_done <= '0';
130
                                                v_counter <= v_counter - 1;
131
                                        end if;
132
                                when WA_5_BURST_HI =>
133
                                        -- NOP anlegen
134
                                        w_command_register <= "000"; -- NOP
135
                                        STATE_WA <= WA_6_BURST_OK;
136
                                when WA_6_BURST_OK =>
137
                                        -- burst_done auf Lo
138
                                        w_burst_done <= '0';
139
                                        STATE_WA <= WA_7_WAIT_4_ACK0;
140
                                when WA_7_WAIT_4_ACK0 =>
141
                                        -- warten auf ACK=0 vom RAM
142
                                        if w_cmd_ack = '0' then
143
                                                STATE_WA <= WA_1_NOP;
144
                                        end if;
145
                                when others =>
146
                                        NULL;
147
                        end case;
148
                end if;
149
        end process P_Write_WA;
150
 
151
        -----------------------------------------
152
        -- State-Machine WB : (Clock-90 Hi-Flanke)
153
        --   1. wartet bis State-Machine-WA das
154
        --      WRITE-Kommando gesendet hat
155
        --   2. legt die LSB-Daten (32Bit) für das RAM an
156
        --   3. wartet auf das ACK=1 vom RAM
157
        --   4. wartet nochmal 2 Clockzyklen (WICHTIG !!)
158
        --   5. legt die MSB-Daten (32Bit) für das RAM an
159
        --   6. wartet bis State-Machine-WA das
160
        --      BURST_DONE-Signal angelegt hat
161
        --   7. Sprung zu Punkt 1
162
        -----------------------------------------       
163
        P_Write_WB : process(clk90_in,reset_in)
164
        begin
165
                if reset_in = '1' then
166
                        -- reset button ist gedrueckt
167
                        STATE_WB <= WB_1_NOP;
168
                        input_data <= (others => '0');
169
                elsif rising_edge(clk90_in) then
170
                        case STATE_WB is
171
                                when WB_1_NOP =>
172
                                        -- warte bis write start
173
                                        input_data <= (others => '0');
174
                                        if STATE_WA = WA_2_WRITE_CMD then
175
                                                STATE_WB <= WB_2_DATA_LSB;
176
                                        end if;
177
                                when WB_2_DATA_LSB =>
178
                                        -- Daten (LSB) anlegen
179
                                        -- und warten auf ACK
180
                                        input_data <= write_data(31 downto 0);
181
                                        if w_cmd_ack = '1' then
182
                                                STATE_WB <= WB_3_T1;
183
                                        end if;
184
                                when WB_3_T1 =>
185
                                        input_data <= write_data(31 downto 0);
186
                                        STATE_WB <= WB_4_T2;
187
                                when WB_4_T2 =>
188
                                        input_data <= write_data(31 downto 0);
189
                                        STATE_WB <= WB_5_DATA_MSB;
190
                                when WB_5_DATA_MSB =>
191
                                        -- Daten (MSB) anlegen
192
                                        -- und warten bis Write fertig
193
                                        input_data <= write_data(63 downto 32);
194
                                        if STATE_WA = WA_5_BURST_HI then
195
                                                STATE_WB <= WB_1_NOP;
196
                                        end if;
197
                                when others =>
198
                                        NULL;
199
                        end case;
200
                end if;
201
        end process P_Write_WB;
202
 
203
        -----------------------------------------
204
        -- Write-Busy erzeugen :
205
        -- solange der Write-Prozess im Gange
206
        -- ist WRITE_BUSY = 1
207
        -----------------------------------------               
208
        write_busy <= '0' when STATE_WA=WA_1_NOP else '1';
209
 
210
end Verhalten;
211
 

powered by: WebSVN 2.1.0

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