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

Subversion Repositories plasma

[/] [plasma/] [trunk/] [vhdl/] [plasma_3e.vhd] - Blame information for rev 384

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

Line No. Rev Author Line
1 259 rhoads
---------------------------------------------------------------------
2
-- TITLE: Plamsa Interface (clock divider and interface to FPGA board)
3
-- AUTHOR: Steve Rhoads (rhoadss@yahoo.com)
4
-- DATE CREATED: 9/15/07
5
-- FILENAME: plasma_3e.vhd
6
-- PROJECT: Plasma CPU core
7
-- COPYRIGHT: Software placed into the public domain by the author.
8
--    Software 'as is' without warranty.  Author liable for nothing.
9
-- DESCRIPTION:
10
--    This entity divides the clock by two and interfaces to the 
11
--    Xilinx Spartan-3E XC3S200FT256-4 FPGA with DDR.
12
---------------------------------------------------------------------
13
library ieee;
14
use ieee.std_logic_1164.all;
15 287 rhoads
use ieee.std_logic_unsigned.all;
16
use ieee.std_logic_arith.all;
17 259 rhoads
--use work.mlite_pack.all;
18
 
19
entity plasma_3e is
20
   port(CLK_50MHZ  : in std_logic;
21
        RS232_DCE_RXD : in std_logic;
22
        RS232_DCE_TXD : out std_logic;
23
 
24 287 rhoads
        SD_CK_P    : out std_logic;     --DDR SDRAM clock_positive
25 259 rhoads
        SD_CK_N    : out std_logic;     --clock_negative
26
        SD_CKE     : out std_logic;     --clock_enable
27
 
28
        SD_BA      : out std_logic_vector(1 downto 0);  --bank_address
29
        SD_A       : out std_logic_vector(12 downto 0); --address(row or col)
30
        SD_CS      : out std_logic;     --chip_select
31
        SD_RAS     : out std_logic;     --row_address_strobe
32
        SD_CAS     : out std_logic;     --column_address_strobe
33
        SD_WE      : out std_logic;     --write_enable
34
 
35
        SD_DQ      : inout std_logic_vector(15 downto 0); --data
36
        SD_UDM     : out std_logic;     --upper_byte_enable
37
        SD_UDQS    : inout std_logic;   --upper_data_strobe
38
        SD_LDM     : out std_logic;     --low_byte_enable
39
        SD_LDQS    : inout std_logic;   --low_data_strobe
40
 
41 287 rhoads
        E_MDC      : out std_logic;     --Ethernet PHY
42
        E_MDIO     : inout std_logic;   --management data in/out
43
        E_RX_CLK   : in std_logic;      --receive clock
44
        E_RX_DV    : in std_logic;      --data valid
45
        E_RXD      : in std_logic_vector(3 downto 0);
46
        E_TX_CLK   : in std_logic;      --transmit clock
47
        E_TX_EN    : out std_logic;     --data valid
48
        E_TXD      : out std_logic_vector(3 downto 0);
49
 
50
        SF_CE0     : out std_logic;     --NOR flash
51
        SF_OE      : out std_logic;
52
        SF_WE      : out std_logic;
53
        SF_BYTE    : out std_logic;
54
        SF_STS     : in std_logic;      --status
55
        SF_A       : out std_logic_vector(24 downto 0);
56
        SF_D       : inout std_logic_vector(15 downto 1);
57
        SPI_MISO   : inout std_logic;
58
 
59
        VGA_VSYNC  : out std_logic;     --VGA port
60
        VGA_HSYNC  : out std_logic;
61
        VGA_RED    : out std_logic;
62
        VGA_GREEN  : out std_logic;
63
        VGA_BLUE   : out std_logic;
64
 
65
        PS2_CLK    : in std_logic;      --Keyboard
66
        PS2_DATA   : in std_logic;
67
 
68 259 rhoads
        LED        : out std_logic_vector(7 downto 0);
69
        ROT_CENTER : in std_logic;
70
        ROT_A      : in std_logic;
71
        ROT_B      : in std_logic;
72
        BTN_EAST   : in std_logic;
73
        BTN_NORTH  : in std_logic;
74
        BTN_SOUTH  : in std_logic;
75
        BTN_WEST   : in std_logic;
76
        SW         : in std_logic_vector(3 downto 0));
77
end; --entity plasma_if
78
 
79
 
80
architecture logic of plasma_3e is
81
 
82
   component plasma
83
      generic(memory_type : string := "XILINX_16X"; --"DUAL_PORT_" "ALTERA_LPM";
84 287 rhoads
              log_file    : string := "UNUSED";
85 346 rhoads
              ethernet    : std_logic := '0';
86
              use_cache   : std_logic := '0');
87 259 rhoads
      port(clk          : in std_logic;
88
           reset        : in std_logic;
89
           uart_write   : out std_logic;
90
           uart_read    : in std_logic;
91
 
92
           address      : out std_logic_vector(31 downto 2);
93
           byte_we      : out std_logic_vector(3 downto 0);
94
           data_write   : out std_logic_vector(31 downto 0);
95
           data_read    : in std_logic_vector(31 downto 0);
96
           mem_pause_in : in std_logic;
97 346 rhoads
           no_ddr_start : out std_logic;
98
           no_ddr_stop  : out std_logic;
99 259 rhoads
 
100
           gpio0_out    : out std_logic_vector(31 downto 0);
101
           gpioA_in     : in std_logic_vector(31 downto 0));
102
   end component; --plasma
103
 
104
   component ddr_ctrl
105
      port(clk      : in std_logic;
106
           clk_2x   : in std_logic;
107
           reset_in : in std_logic;
108
 
109
           address  : in std_logic_vector(25 downto 2);
110
           byte_we  : in std_logic_vector(3 downto 0);
111
           data_w   : in std_logic_vector(31 downto 0);
112
           data_r   : out std_logic_vector(31 downto 0);
113
           active   : in std_logic;
114 346 rhoads
           no_start : in std_logic;
115
           no_stop  : in std_logic;
116 259 rhoads
           pause    : out std_logic;
117
 
118
           SD_CK_P  : out std_logic;     --clock_positive
119
           SD_CK_N  : out std_logic;     --clock_negative
120
           SD_CKE   : out std_logic;     --clock_enable
121
 
122
           SD_BA    : out std_logic_vector(1 downto 0);  --bank_address
123
           SD_A     : out std_logic_vector(12 downto 0); --address(row or col)
124
           SD_CS    : out std_logic;     --chip_select
125
           SD_RAS   : out std_logic;     --row_address_strobe
126
           SD_CAS   : out std_logic;     --column_address_strobe
127
           SD_WE    : out std_logic;     --write_enable
128
 
129
           SD_DQ    : inout std_logic_vector(15 downto 0); --data
130
           SD_UDM   : out std_logic;     --upper_byte_enable
131
           SD_UDQS  : inout std_logic;   --upper_data_strobe
132
           SD_LDM   : out std_logic;     --low_byte_enable
133
           SD_LDQS  : inout std_logic);  --low_data_strobe
134
   end component; --ddr
135
 
136
   signal clk_reg      : std_logic;
137
   signal address      : std_logic_vector(31 downto 2);
138
   signal data_write   : std_logic_vector(31 downto 0);
139
   signal data_read    : std_logic_vector(31 downto 0);
140 287 rhoads
   signal data_r_ddr   : std_logic_vector(31 downto 0);
141 259 rhoads
   signal byte_we      : std_logic_vector(3 downto 0);
142 287 rhoads
   signal write_enable : std_logic;
143
   signal pause_ddr    : std_logic;
144 259 rhoads
   signal pause        : std_logic;
145 346 rhoads
   signal no_ddr_start : std_logic;
146
   signal no_ddr_stop  : std_logic;
147 287 rhoads
   signal ddr_active   : std_logic;
148
   signal flash_active : std_logic;
149
   signal flash_cnt    : std_logic_vector(1 downto 0);
150
   signal flash_we     : std_logic;
151 259 rhoads
   signal reset        : std_logic;
152
   signal gpio0_out    : std_logic_vector(31 downto 0);
153
   signal gpio0_in     : std_logic_vector(31 downto 0);
154
 
155
begin  --architecture
156
   --Divide 50 MHz clock by two
157
   clk_div: process(reset, CLK_50MHZ, clk_reg)
158
   begin
159
      if reset = '1' then
160
         clk_reg <= '0';
161
      elsif rising_edge(CLK_50MHZ) then
162
         clk_reg <= not clk_reg;
163
      end if;
164
   end process; --clk_div
165
 
166
   reset <= ROT_CENTER;
167 287 rhoads
   E_TX_EN   <= gpio0_out(28);  --Ethernet
168
   E_TXD     <= gpio0_out(27 downto 24);
169
   E_MDC     <= gpio0_out(23);
170
   E_MDIO    <= gpio0_out(21) when gpio0_out(22) = '1' else 'Z';
171
   VGA_VSYNC <= gpio0_out(20);
172
   VGA_HSYNC <= gpio0_out(19);
173
   VGA_RED   <= gpio0_out(18);
174
   VGA_GREEN <= gpio0_out(17);
175
   VGA_BLUE  <= gpio0_out(16);
176 259 rhoads
   LED <= gpio0_out(7 downto 0);
177 287 rhoads
   gpio0_in(31 downto 21) <= (others => '0');
178
   gpio0_in(20 downto 13) <= E_RX_CLK & E_RX_DV & E_RXD & E_TX_CLK & E_MDIO;
179
   gpio0_in(12 downto 10) <= SF_STS & PS2_CLK & PS2_DATA;
180 259 rhoads
   gpio0_in(9 downto 0) <= ROT_A & ROT_B & BTN_EAST & BTN_NORTH &
181
                           BTN_SOUTH & BTN_WEST & SW;
182 287 rhoads
   ddr_active <= '1' when address(31 downto 28) = "0001" else '0';
183
   flash_active <= '1' when address(31 downto 28) = "0011" else '0';
184
   write_enable <= '1' when byte_we /= "0000" else '0';
185 259 rhoads
 
186
   u1_plama: plasma
187
      generic map (memory_type => "XILINX_16X",
188 287 rhoads
                   log_file    => "UNUSED",
189 346 rhoads
                   ethernet    => '1',
190
                   use_cache   => '1')
191 287 rhoads
      --generic map (memory_type => "DUAL_PORT_",
192
      --             log_file    => "output2.txt",
193
      --             ethernet    => '1')
194 259 rhoads
      PORT MAP (
195
         clk          => clk_reg,
196
         reset        => reset,
197
         uart_write   => RS232_DCE_TXD,
198
         uart_read    => RS232_DCE_RXD,
199
 
200
         address      => address,
201
         byte_we      => byte_we,
202
         data_write   => data_write,
203
         data_read    => data_read,
204
         mem_pause_in => pause,
205 346 rhoads
         no_ddr_start => no_ddr_start,
206
         no_ddr_stop  => no_ddr_stop,
207 259 rhoads
 
208
         gpio0_out    => gpio0_out,
209
         gpioA_in     => gpio0_in);
210
 
211
   u2_ddr: ddr_ctrl
212
      port map (
213
         clk      => clk_reg,
214
         clk_2x   => CLK_50MHZ,
215
         reset_in => reset,
216
 
217
         address  => address(25 downto 2),
218
         byte_we  => byte_we,
219
         data_w   => data_write,
220 287 rhoads
         data_r   => data_r_ddr,
221
         active   => ddr_active,
222 346 rhoads
         no_start => no_ddr_start,
223
         no_stop  => no_ddr_stop,
224 287 rhoads
         pause    => pause_ddr,
225 259 rhoads
 
226
         SD_CK_P  => SD_CK_P,    --clock_positive
227
         SD_CK_N  => SD_CK_N,    --clock_negative
228
         SD_CKE   => SD_CKE,     --clock_enable
229
 
230
         SD_BA    => SD_BA,      --bank_address
231
         SD_A     => SD_A,       --address(row or col)
232
         SD_CS    => SD_CS,      --chip_select
233
         SD_RAS   => SD_RAS,     --row_address_strobe
234
         SD_CAS   => SD_CAS,     --column_address_strobe
235
         SD_WE    => SD_WE,      --write_enable
236
 
237
         SD_DQ    => SD_DQ,      --data
238
         SD_UDM   => SD_UDM,     --upper_byte_enable
239
         SD_UDQS  => SD_UDQS,    --upper_data_strobe
240
         SD_LDM   => SD_LDM,     --low_byte_enable
241
         SD_LDQS  => SD_LDQS);   --low_data_strobe
242 287 rhoads
 
243
   --Flash control (only lower 16-bit data lines connected)
244
   flash_ctrl: process(reset, clk_reg, flash_active, write_enable,
245
                       flash_cnt, pause_ddr)
246
   begin
247
      if reset = '1' then
248
         flash_cnt <= "00";
249
         flash_we <= '1';
250
      elsif rising_edge(clk_reg) then
251
         if flash_active = '0' then
252
            flash_cnt <= "00";
253
            flash_we <= '1';
254
         else
255
            if write_enable = '1' and flash_cnt(1) = '0' then
256
               flash_we <= '0';
257
            else
258
               flash_we <= '1';
259
            end if;
260
            if flash_cnt /= "11" then
261
               flash_cnt <= flash_cnt + 1;
262
            end if;
263
         end if;
264
      end if;  --rising_edge(clk_reg)
265
      if pause_ddr = '1' or (flash_active = '1' and flash_cnt /= "11") then
266
         pause <= '1';
267
      else
268
         pause <= '0';
269
      end if;
270
   end process; --flash_ctrl
271
 
272
   SF_CE0  <= not flash_active;
273
   SF_OE   <= write_enable or not flash_active;
274
   SF_WE   <= flash_we;
275
   SF_BYTE <= '1';  --16-bit access
276 346 rhoads
   SF_A    <= address(25 downto 2) & '0' when flash_active = '1' else
277
              "0000000000000000000000000";
278 287 rhoads
   SF_D    <= data_write(15 downto 1) when
279
              flash_active = '1' and write_enable = '1'
280
              else "ZZZZZZZZZZZZZZZ";
281
   SPI_MISO <= data_write(0) when
282
              flash_active = '1' and write_enable = '1'
283
              else 'Z';
284
   data_read(31 downto 16) <= data_r_ddr(31 downto 16);
285
   data_read(15 downto 0) <= data_r_ddr(15 downto 0) when flash_active = '0'
286
                             else SF_D & SPI_MISO;
287 259 rhoads
 
288
end; --architecture logic
289
 

powered by: WebSVN 2.1.0

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