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.
10 -- This entity divides the clock by two and interfaces to the
11 -- Xilinx Spartan-3E XC3S200FT256-4 FPGA with DDR.
12 ---------------------------------------------------------------------
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;
20 port(CLK_50MHZ : in std_logic;
21 RS232_DCE_RXD : in std_logic;
22 RS232_DCE_TXD : out std_logic;
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
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
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
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);
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;
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;
65 PS2_CLK : in std_logic; --Keyboard
66 PS2_DATA : in std_logic;
68 LED : out std_logic_vector(7 downto 0);
69 ROT_CENTER : 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
80 architecture logic of plasma_3e is
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;
89 uart_write : out std_logic;
90 uart_read : in std_logic;
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;
100 gpio0_out : out std_logic_vector(31 downto 0);
101 gpioA_in : in std_logic_vector(31 downto 0));
102 end component; --plasma
105 port(clk : in std_logic;
106 clk_2x : in std_logic;
107 reset_in : in std_logic;
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;
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
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
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
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);
156 --Divide 50 MHz clock by two
157 clk_div: process(reset, CLK_50MHZ, clk_reg)
161 elsif rising_edge(CLK_50MHZ) then
162 clk_reg <= not clk_reg;
164 end process; --clk_div
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';
187 generic map (memory_type => "XILINX_16X",
188 log_file => "UNUSED",
191 --generic map (memory_type => "DUAL_PORT_",
192 -- log_file => "output2.txt",
197 uart_write => RS232_DCE_TXD,
198 uart_read => RS232_DCE_RXD,
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,
208 gpio0_out => gpio0_out,
209 gpioA_in => gpio0_in);
217 address => address(25 downto 2),
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,
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
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
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
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)
250 elsif rising_edge(clk_reg) then
251 if flash_active = '0' then
255 if write_enable = '1' and flash_cnt(1) = '0' then
260 if flash_cnt /= "11" then
261 flash_cnt <= flash_cnt + 1;
264 end if; --rising_edge(clk_reg)
265 if pause_ddr = '1' or (flash_active = '1' and flash_cnt /= "11") then
270 end process; --flash_ctrl
272 SF_CE0 <= not flash_active;
273 SF_OE <= write_enable or not flash_active;
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'
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;
288 end; --architecture logic