]> rtime.felk.cvut.cz Git - fpga/plasma.git/blob - vhdl/plasma_3e.vhd
Local copy of Plasma MIPS project.
[fpga/plasma.git] / vhdl / plasma_3e.vhd
1 ---------------------------------------------------------------------
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 use ieee.std_logic_unsigned.all;
16 use ieee.std_logic_arith.all;
17 --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         SD_CK_P    : out std_logic;     --DDR SDRAM clock_positive
25         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         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         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               log_file    : string := "UNUSED";
85               ethernet    : std_logic := '0';
86               use_cache   : std_logic := '0');
87       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            no_ddr_start : out std_logic;
98            no_ddr_stop  : out std_logic;
99         
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            no_start : in std_logic;
115            no_stop  : in std_logic;
116            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    signal data_r_ddr   : std_logic_vector(31 downto 0);
141    signal byte_we      : std_logic_vector(3 downto 0);
142    signal write_enable : std_logic;
143    signal pause_ddr    : std_logic;
144    signal pause        : std_logic;
145    signal no_ddr_start : std_logic;
146    signal no_ddr_stop  : std_logic;
147    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    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    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    LED <= gpio0_out(7 downto 0);
177    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    gpio0_in(9 downto 0) <= ROT_A & ROT_B & BTN_EAST & BTN_NORTH & 
181                            BTN_SOUTH & BTN_WEST & SW;
182    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
186    u1_plama: plasma 
187       generic map (memory_type => "XILINX_16X",
188                    log_file    => "UNUSED",
189                    ethernet    => '1',
190                    use_cache   => '1')
191       --generic map (memory_type => "DUAL_PORT_",
192       --             log_file    => "output2.txt",
193       --             ethernet    => '1')
194       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          no_ddr_start => no_ddr_start,
206          no_ddr_stop  => no_ddr_stop,
207
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          data_r   => data_r_ddr,
221          active   => ddr_active,
222          no_start => no_ddr_start,
223          no_stop  => no_ddr_stop,
224          pause    => pause_ddr,
225
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
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    SF_A    <= address(25 downto 2) & '0' when flash_active = '1' else
277               "0000000000000000000000000";
278    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          
288 end; --architecture logic
289