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

Subversion Repositories sdram_controller

[/] [sdram_controller/] [trunk/] [scratch.vhd] - Blame information for rev 14

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 lynn0p
----------------------------------------------------------------------------------
2
-- Company: OPL Aerospatiale AG
3
-- Engineer: Owen Lynn <lynn0p@hotmail.com>
4
-- 
5
-- Create Date:    23:22:19 07/27/2009 
6
-- Design Name: 
7
-- Module Name:    scratch - impl 
8
-- Project Name: 
9
-- Target Devices: 
10
-- Tool versions: 
11
-- Description: Testbench for the DDR SDRAM controller. Sends a write command, sends a read 
12
--  and outputs to the led on the Spartan3e Starter Board
13
--
14
-- Dependencies: 
15
--
16
-- Revision: 
17
-- Revision 0.01 - File Created
18
-- Additional Comments: 
19
--  Copyright (c) 2009 Owen Lynn <lynn0p@hotmail.com>
20
--  Released under the GNU Lesser General Public License, Version 3
21
--
22
----------------------------------------------------------------------------------
23
library IEEE;
24
use IEEE.STD_LOGIC_1164.ALL;
25
use IEEE.STD_LOGIC_ARITH.ALL;
26
use IEEE.STD_LOGIC_UNSIGNED.ALL;
27
library UNISIM;
28
use UNISIM.VComponents.all;
29
 
30
 
31
entity scratch is
32
        port(         clk : in  std_logic;
33
                     clke : in  std_logic;
34
                      rst : in  std_logic;
35
                 led : out std_logic_vector( 7 downto 0 );
36
 
37
                        -- SDRAM pins out
38
                          dram_clkp   : out   std_logic;
39
                          dram_clkn   : out   std_logic;
40
                          dram_clke   : out   std_logic;
41
                          dram_cs     : out   std_logic;
42
                          dram_cmd    : out   std_logic_vector(2 downto 0);
43
                          dram_bank   : out   std_logic_vector(1 downto 0);
44
                          dram_addr   : out   std_logic_vector(12 downto 0);
45
                          dram_dm     : out   std_logic_vector(1 downto 0);
46
                          dram_dqs    : inout std_logic_vector(1 downto 0);
47
                          dram_dq     : inout std_logic_vector(15 downto 0);
48
 
49
                        -- debug signals
50
                          debug_reg   : out std_logic_vector(7 downto 0)
51
                          );
52
end scratch;
53
 
54
architecture impl of scratch is
55
 
56
        type DRAM_DRIVER_STATES is ( STATE0, STATE1, STATE2, STATE3, STATE4, STATE5 );
57
        signal dram_driver_state : DRAM_DRIVER_STATES := STATE0;
58
 
59 13 lynn0p
        signal clk_bufd        : std_logic;
60
        signal clk100mhz       : std_logic;
61
        signal dcm_locked      : std_logic;
62
        signal dcm_clk_000     : std_logic;
63
        signal dcm_clk_raw_000 : std_logic;
64 4 lynn0p
 
65
        signal op      : std_logic_vector(1 downto 0);
66
        signal addr    : std_logic_vector(25 downto 0);
67
        signal op_ack  : std_logic;
68
        signal busy_n  : std_logic;
69
        signal data_i  : std_logic_vector(7 downto 0);
70 6 lynn0p
        signal debug   : std_logic_vector(7 downto 0);
71 4 lynn0p
 
72
begin
73
 
74
        BUFG_CLK: BUFG
75
        port map(
76
                O => clk_bufd,
77
                I => clk
78 13 lynn0p
        );
79
 
80
        TB_DCM : DCM_SP
81
   generic map (
82
      CLKDV_DIVIDE => 2.0,                   --  Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5
83
                                             --     7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0
84
      CLKFX_DIVIDE => 2,                     --  Can be any integer from 1 to 32 
85
      CLKFX_MULTIPLY => 2,                   --  Can be any integer from 1 to 32
86
      CLKIN_DIVIDE_BY_2 => FALSE,            --  TRUE/FALSE to enable CLKIN divide by two feature
87 14 lynn0p
      CLKIN_PERIOD => 20.0,                  --  Specify period of input clock
88 13 lynn0p
      CLKOUT_PHASE_SHIFT => "NONE",          --  Specify phase shift of "NONE", "FIXED" or "VARIABLE" 
89
      CLK_FEEDBACK => "1X",                  --  Specify clock feedback of "NONE", "1X" or "2X" 
90
      DESKEW_ADJUST => "SOURCE_SYNCHRONOUS", -- "SOURCE_SYNCHRONOUS", "SYSTEM_SYNCHRONOUS" or
91
                                             --     an integer from 0 to 15
92
      DLL_FREQUENCY_MODE => "LOW",           -- "HIGH" or "LOW" frequency mode for DLL
93
      DUTY_CYCLE_CORRECTION => TRUE,         --  Duty cycle correction, TRUE or FALSE
94
      PHASE_SHIFT => 0,                      --  Amount of fixed phase shift from -255 to 255
95
      STARTUP_WAIT => FALSE)                 --  Delay configuration DONE until DCM_SP LOCK, TRUE/FALSE
96
   port map (
97
      CLK0     => dcm_clk_raw_000,       -- 0 degree DCM CLK ouptput
98
      CLK90    => open,                  -- 90 degree DCM CLK output
99
      CLK180   => open,                  -- 180 degree DCM CLK output
100
      CLK270   => open,                  -- 270 degree DCM CLK output
101
      CLK2X    => clk100mhz,             -- 2X DCM CLK output
102
      CLK2X180 => open,                  -- 2X, 180 degree DCM CLK out
103
      CLKDV    => open,                  -- Divided DCM CLK out (CLKDV_DIVIDE)
104
      CLKFX    => open,                  -- DCM CLK synthesis out (M/D) 
105
      CLKFX180 => open,                  -- 180 degree CLK synthesis out
106
      LOCKED   => dcm_locked,            -- DCM LOCK status output (means feedback is in phase with main clock)
107
      PSDONE   => open,                  -- Dynamic phase adjust done output
108
      STATUS   => open,                  -- 8-bit DCM status bits output
109
      CLKFB    => dcm_clk_000,           -- DCM clock feedback
110
      CLKIN    => clk_bufd,              -- Clock input (from IBUFG, BUFG or DCM)
111
      PSCLK    => '0',                   -- Dynamic phase adjust clock input
112
      PSEN     => '0',                   -- Dynamic phase adjust enable input
113
      PSINCDEC => '0',                   -- Dynamic phase adjust increment/decrement
114
      RST      => '0'                    -- DCM asynchronous reset input
115
   );
116 4 lynn0p
 
117 13 lynn0p
        DCM_BUF_000: BUFG
118
        port map(
119
                O => dcm_clk_000,
120
                I => dcm_clk_raw_000
121
        );
122
 
123 4 lynn0p
        SDRAM: entity work.sdram_controller
124
        port map(
125 13 lynn0p
                clk100mhz => clk100mhz,
126 4 lynn0p
                en => '1',
127
           reset => rst,
128
           op => op,
129
           addr => addr,
130
           op_ack => op_ack,
131
           busy_n => busy_n,
132
           data_o => led,
133
           data_i => data_i,
134
 
135
                dram_clkp => dram_clkp,
136
                dram_clkn => dram_clkn,
137
                dram_clke => dram_clke,
138
                dram_cs => dram_cs,
139
                dram_cmd => dram_cmd,
140
                dram_bank => dram_bank,
141
                dram_addr => dram_addr,
142
                dram_dm => dram_dm,
143
                dram_dqs => dram_dqs,
144
                dram_dq => dram_dq,
145
 
146
                debug_reg => debug
147
        );
148
 
149
        debug_reg <= debug;
150
 
151
        process(clk_bufd, clke)
152
        begin
153
                if (clke = '0') then
154
                        dram_driver_state <= STATE0;
155
                elsif (rising_edge(clk_bufd)) then
156
                        case dram_driver_state is
157
                                when STATE0 =>
158
                                        if (busy_n = '1') then
159
                                                dram_driver_state <= STATE1;
160
                                        end if;
161
 
162
                                when STATE1 =>
163 13 lynn0p
                                        addr <= "0000000000"& x"6001";
164
                                        data_i <= "11110001";
165 4 lynn0p
                                        op <= "10";
166
                                        if (op_ack = '1') then
167
                                                dram_driver_state <= STATE2;
168
                                        end if;
169
 
170
                                when STATE2 =>
171
                                        op <= "00";
172
                                        if (busy_n = '1') then
173
                                                dram_driver_state <= STATE3;
174
                                        end if;
175
 
176
                                when STATE3 =>
177 13 lynn0p
                                        addr <= "0000000000" & x"6001";
178 4 lynn0p
                                        op <= "01";
179
                                        if (op_ack = '1') then
180
                                                dram_driver_state <= STATE4;
181
                                        end if;
182
 
183
                                when STATE4 =>
184
                                        op <= "00";
185
                                        if (busy_n = '1') then
186
                                                dram_driver_state <= STATE5;
187
                                        end if;
188
 
189
                                when STATE5 =>
190
                                        dram_driver_state <= STATE5;
191
                        end case;
192
                end if;
193
        end process;
194
 
195
 
196
end impl;

powered by: WebSVN 2.1.0

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