--===========================================================================----
|
--===========================================================================--
|
|
-- --
|
|
-- clock_dll.vhd - Synthesible System Clock Divider for Xilinx Spartan 3 --
|
|
-- --
|
|
--===========================================================================--
|
--
|
--
|
-- S Y N T H E Z I A B L E Clock_dll for System09 - SOC.
|
-- File name : clock_dll.vhd
|
--
|
--
|
--===========================================================================----
|
-- Purpose : Implements a a system clock divider for System09.
|
--
|
-- For Xilinx Spartan 3 and 3E FPGA boards
|
-- This core adheres to the GNU public license
|
|
-- No responsibility is taken for this design.
|
|
-- Use at own risk.
|
|
--
|
|
-- File name : Clock_dll.vhd
|
|
--
|
|
-- Purpose : Generates Clocks for System09
|
|
-- For BurchED B3-Spartan2+ and B5-X300
|
|
-- Assumes a 12.5 MHz system clock input
|
-- Assumes a 12.5 MHz system clock input
|
-- Generates a x1 (12.5 MHz) CPU clock
|
-- Generates a x1 (12.5 MHz) CPU clock
|
-- Generates a x2 (25.0 MHz) VGA clock
|
-- Generates a x2 (25.0 MHz) VGA clock
|
-- Generates a x4 (50.0 MHz) MEM clock
|
-- Generates a x4 (50.0 MHz) MEM clock
|
--
|
--
|
-- Dependencies : ieee.Std_Logic_1164
|
-- Dependencies : ieee.std_logic_1164
|
-- ieee.std_logic_unsigned
|
|
-- ieee.std_logic_arith
|
-- ieee.std_logic_arith
|
|
-- ieee.std_logic_unsigned
|
-- ieee.numeric_std
|
-- ieee.numeric_std
|
|
-- unisim.vcomponents
|
|
--
|
|
-- Author : John E. Kent
|
|
--
|
|
-- Email : dilbert57@opencores.org
|
|
--
|
|
-- Web : http://opencores.org/project,system09
|
|
--
|
|
-- clock_dll.vhd is a system clock divider for system09.
|
|
--
|
|
-- Copyright (C) 2003 - 2010 John Kent
|
|
--
|
|
-- This program is free software: you can redistribute it and/or modify
|
|
-- it under the terms of the GNU General Public License as published by
|
|
-- the Free Software Foundation, either version 3 of the License, or
|
|
-- (at your option) any later version.
|
--
|
--
|
|
-- This program is distributed in the hope that it will be useful,
|
|
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
-- GNU General Public License for more details.
|
--
|
--
|
-- Revision History :
|
-- You should have received a copy of the GNU General Public License
|
|
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
|
--
|
--
|
-- Rev : 0.1
|
--===========================================================================--
|
-- Date : 7th September 2008
|
-- --
|
-- Description : Initial version.
|
-- Revision History --
|
|
-- --
|
|
--===========================================================================--
|
--
|
--
|
|
-- Revision Name Date Description
|
|
-- 0.1 John E. Kent 7th September 2008 Initial version
|
|
-- 1.0 John E. Kent 30th May 2010 Added GPL Header
|
--
|
--
|
library ieee;
|
library ieee;
|
use ieee.std_logic_1164.all;
|
use ieee.std_logic_1164.all;
|
use IEEE.STD_LOGIC_ARITH.ALL;
|
use ieee.std_logic_arith.all;
|
use IEEE.STD_LOGIC_UNSIGNED.ALL;
|
use ieee.std_logic_unsigned.all;
|
use ieee.numeric_std.all;
|
use ieee.numeric_std.all;
|
library unisim;
|
library unisim;
|
use unisim.vcomponents.all;
|
use unisim.vcomponents.all;
|
|
|
entity clock_dll is
|
entity clock_dll is
|
port(
|
port(
|
clk_in : in std_Logic; -- System Clock input
|
clk_in : in std_Logic; -- System Clock input
|
clk_cpu : out std_logic; -- CPU Clock Out (x1)
|
clk_cpu : out std_logic; -- CPU Clock Out (x1)
|
clk_vga : out std_logic; -- VGA Pixel Clock Out (x2)
|
clk_vga : out std_logic; -- VGA Pixel Clock Out (x2)
|
clk_mem : out std_logic; -- Memory Clock Out (x4)
|
clk_mem : out std_logic; -- Memory Clock Out (x4)
|
locked : out std_logic -- DLL in lock
|
locked : out std_logic -- DLL in lock
|
);
|
);
|
end entity;
|
end entity;
|
|
|
architecture RTL of clock_dll is
|
architecture RTL of clock_dll is
|
|
|
signal CPU_CLK0 : std_ulogic;
|
signal CPU_CLK0 : std_ulogic;
|
signal CPU_CLK90 : std_ulogic;
|
signal CPU_CLK90 : std_ulogic;
|
signal CPU_CLK180 : std_ulogic;
|
signal CPU_CLK180 : std_ulogic;
|
signal CPU_CLK270 : std_ulogic;
|
signal CPU_CLK270 : std_ulogic;
|
signal CPU_CLK2X : std_ulogic;
|
signal CPU_CLK2X : std_ulogic;
|
signal CPU_CLKDV : std_ulogic;
|
signal CPU_CLKDV : std_ulogic;
|
signal CPU_LOCKED : std_ulogic;
|
signal CPU_LOCKED : std_ulogic;
|
signal CPU_CLKFB : std_ulogic;
|
signal CPU_CLKFB : std_ulogic;
|
signal CPU_CLKIN : std_ulogic;
|
signal CPU_CLKIN : std_ulogic;
|
signal CPU_RESET : std_ulogic;
|
signal CPU_RESET : std_ulogic;
|
|
|
signal VGA_CLK0 : std_ulogic;
|
signal VGA_CLK0 : std_ulogic;
|
signal VGA_CLK90 : std_ulogic;
|
signal VGA_CLK90 : std_ulogic;
|
signal VGA_CLK180 : std_ulogic;
|
signal VGA_CLK180 : std_ulogic;
|
signal VGA_CLK270 : std_ulogic;
|
signal VGA_CLK270 : std_ulogic;
|
signal VGA_CLK2X : std_ulogic;
|
signal VGA_CLK2X : std_ulogic;
|
signal VGA_CLKDV : std_ulogic;
|
signal VGA_CLKDV : std_ulogic;
|
signal VGA_LOCKED : std_ulogic;
|
signal VGA_LOCKED : std_ulogic;
|
signal VGA_CLKFB : std_ulogic;
|
signal VGA_CLKFB : std_ulogic;
|
signal VGA_CLKIN : std_ulogic;
|
signal VGA_CLKIN : std_ulogic;
|
signal VGA_RESET : std_ulogic;
|
signal VGA_RESET : std_ulogic;
|
signal VGA_RESET_N : std_ulogic;
|
signal VGA_RESET_N : std_ulogic;
|
|
|
-- Component Declaration for CLKDLL should be placed
|
-- Component Declaration for CLKDLL should be placed
|
-- after architecture statement but before begin keyword
|
-- after architecture statement but before begin keyword
|
|
|
component CLKDLL
|
component CLKDLL
|
-- synthesis translate_off
|
-- synthesis translate_off
|
generic (
|
generic (
|
CLKDV_DIVIDE : real := 2.0; -- (1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 8.0, 16.0)
|
CLKDV_DIVIDE : real := 2.0; -- (1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 8.0, 16.0)
|
DUTY_CYCLE_CORRECTION : Boolean := TRUE; -- (TRUE, FALSE)
|
DUTY_CYCLE_CORRECTION : Boolean := TRUE; -- (TRUE, FALSE)
|
STARTUP_WAIT : boolean := FALSE -- (TRUE, FALSE)
|
STARTUP_WAIT : boolean := FALSE -- (TRUE, FALSE)
|
);
|
);
|
-- synthesis translate_on
|
-- synthesis translate_on
|
port (
|
port (
|
CLK0 : out STD_ULOGIC;
|
CLK0 : out STD_ULOGIC;
|
CLK180 : out STD_ULOGIC;
|
CLK180 : out STD_ULOGIC;
|
CLK270 : out STD_ULOGIC;
|
CLK270 : out STD_ULOGIC;
|
CLK2X : out STD_ULOGIC;
|
CLK2X : out STD_ULOGIC;
|
CLK90 : out STD_ULOGIC;
|
CLK90 : out STD_ULOGIC;
|
CLKDV : out STD_ULOGIC;
|
CLKDV : out STD_ULOGIC;
|
LOCKED : out STD_ULOGIC;
|
LOCKED : out STD_ULOGIC;
|
CLKFB : in STD_ULOGIC;
|
CLKFB : in STD_ULOGIC;
|
CLKIN : in STD_ULOGIC;
|
CLKIN : in STD_ULOGIC;
|
RST : in STD_ULOGIC
|
RST : in STD_ULOGIC
|
);
|
);
|
end component;
|
end component;
|
|
|
component IBUFG
|
component IBUFG
|
port (
|
port (
|
i: in std_logic;
|
i: in std_logic;
|
o: out std_logic
|
o: out std_logic
|
);
|
);
|
end component;
|
end component;
|
|
|
component BUFG
|
component BUFG
|
port (
|
port (
|
i: in std_logic;
|
i: in std_logic;
|
o: out std_logic
|
o: out std_logic
|
);
|
);
|
end component;
|
end component;
|
|
|
component SRL16
|
component SRL16
|
port (
|
port (
|
Q : out std_logic;
|
Q : out std_logic;
|
D : in std_logic;
|
D : in std_logic;
|
CLK : in std_logic;
|
CLK : in std_logic;
|
A0 : in std_logic;
|
A0 : in std_logic;
|
A1 : in std_logic;
|
A1 : in std_logic;
|
A2 : in std_logic;
|
A2 : in std_logic;
|
A3 : in std_logic
|
A3 : in std_logic
|
);
|
);
|
end component;
|
end component;
|
|
|
--
|
--
|
-- Start instantiation
|
-- Start instantiation
|
--
|
--
|
begin
|
begin
|
|
|
--
|
--
|
-- 12.5MHz CPU clock input
|
-- 12.5MHz CPU clock input
|
--
|
--
|
cpu_clkin_buffer : IBUFG
|
cpu_clkin_buffer : IBUFG
|
port map(
|
port map(
|
i => clk_in,
|
i => clk_in,
|
o => CPU_CLKIN
|
o => CPU_CLKIN
|
);
|
);
|
|
|
--
|
--
|
-- 12.5MHz CPU clock input
|
-- 12.5MHz CPU clock input
|
--
|
--
|
cpu_clkout_buffer : BUFG
|
cpu_clkout_buffer : BUFG
|
port map(
|
port map(
|
i => CPU_CLKIN,
|
i => CPU_CLKIN,
|
o => clk_cpu
|
o => clk_cpu
|
);
|
);
|
|
|
--
|
--
|
-- 25 MHz VGA clock input
|
-- 25 MHz VGA clock input
|
--
|
--
|
cpu_clkfb_buffer : BUFG
|
cpu_clkfb_buffer : BUFG
|
port map(
|
port map(
|
i => CPU_CLK2X,
|
i => CPU_CLK2X,
|
o => CPU_CLKFB
|
o => CPU_CLKFB
|
);
|
);
|
|
|
CLKDLL_CPU : CLKDLL
|
CLKDLL_CPU : CLKDLL
|
-- synthesis translate_off
|
-- synthesis translate_off
|
generic map (
|
generic map (
|
CLKDV_DIVIDE => 2.0, -- (1.5,2,2.5,3,4,5,8,16)
|
CLKDV_DIVIDE => 2.0, -- (1.5,2,2.5,3,4,5,8,16)
|
DUTY_CYCLE_CORRECTION => TRUE, -- (TRUE, FALSE)
|
DUTY_CYCLE_CORRECTION => TRUE, -- (TRUE, FALSE)
|
STARTUP_WAIT => FALSE -- (TRUE, FALSE)
|
STARTUP_WAIT => FALSE -- (TRUE, FALSE)
|
);
|
);
|
-- synthesis translate_on
|
-- synthesis translate_on
|
port map (
|
port map (
|
CLK0 => CPU_CLK0,
|
CLK0 => CPU_CLK0,
|
CLK90 => CPU_CLK90,
|
CLK90 => CPU_CLK90,
|
CLK180 => CPU_CLK180,
|
CLK180 => CPU_CLK180,
|
CLK270 => CPU_CLK270,
|
CLK270 => CPU_CLK270,
|
CLK2X => CPU_CLK2X,
|
CLK2X => CPU_CLK2X,
|
CLKDV => CPU_CLKDV,
|
CLKDV => CPU_CLKDV,
|
LOCKED => CPU_LOCKED,
|
LOCKED => CPU_LOCKED,
|
CLKFB => CPU_CLKFB,
|
CLKFB => CPU_CLKFB,
|
CLKIN => CPU_CLKIN,
|
CLKIN => CPU_CLKIN,
|
RST => CPU_RESET
|
RST => CPU_RESET
|
);
|
);
|
|
|
--
|
--
|
-- 25 MHz VGA clock output
|
-- 25 MHz VGA clock output
|
--
|
--
|
vga_clkfb_buffer : BUFG
|
vga_clkfb_buffer : BUFG
|
port map(
|
port map(
|
i => VGA_CLK2X,
|
i => VGA_CLK2X,
|
o => VGA_CLKFB
|
o => VGA_CLKFB
|
);
|
);
|
|
|
CLKDLL_VGA : CLKDLL
|
CLKDLL_VGA : CLKDLL
|
-- synthesis translate_off
|
-- synthesis translate_off
|
generic map (
|
generic map (
|
CLKDV_DIVIDE => 2.0, -- (1.5,2,2.5,3,4,5,8,16)
|
CLKDV_DIVIDE => 2.0, -- (1.5,2,2.5,3,4,5,8,16)
|
DUTY_CYCLE_CORRECTION => TRUE, -- (TRUE, FALSE)
|
DUTY_CYCLE_CORRECTION => TRUE, -- (TRUE, FALSE)
|
STARTUP_WAIT => FALSE -- (TRUE, FALSE)
|
STARTUP_WAIT => FALSE -- (TRUE, FALSE)
|
);
|
);
|
-- synthesis translate_on
|
-- synthesis translate_on
|
port map (
|
port map (
|
CLK0 => VGA_CLK0,
|
CLK0 => VGA_CLK0,
|
CLK90 => VGA_CLK90,
|
CLK90 => VGA_CLK90,
|
CLK180 => VGA_CLK180,
|
CLK180 => VGA_CLK180,
|
CLK270 => VGA_CLK270,
|
CLK270 => VGA_CLK270,
|
CLK2X => VGA_CLK2X,
|
CLK2X => VGA_CLK2X,
|
CLKDV => VGA_CLKDV,
|
CLKDV => VGA_CLKDV,
|
LOCKED => VGA_LOCKED,
|
LOCKED => VGA_LOCKED,
|
CLKFB => VGA_CLKFB,
|
CLKFB => VGA_CLKFB,
|
CLKIN => VGA_CLKIN,
|
CLKIN => VGA_CLKIN,
|
RST => VGA_RESET
|
RST => VGA_RESET
|
);
|
);
|
|
|
my_srl16 : SRL16 port map (
|
my_srl16 : SRL16 port map (
|
Q => VGA_RESET_N,
|
Q => VGA_RESET_N,
|
D => CPU_LOCKED,
|
D => CPU_LOCKED,
|
CLK => CPU_CLKFB,
|
CLK => CPU_CLKFB,
|
A0 => '1',
|
A0 => '1',
|
A1 => '1',
|
A1 => '1',
|
A2 => '1',
|
A2 => '1',
|
A3 => '1'
|
A3 => '1'
|
);
|
);
|
|
|
clock_dll_assign : process( VGA_RESET_N, VGA_LOCKED,
|
clock_dll_assign : process( VGA_RESET_N, VGA_LOCKED,
|
clk_in, CPU_CLKFB, VGA_CLKFB )
|
clk_in, CPU_CLKFB, VGA_CLKFB )
|
begin
|
begin
|
VGA_RESET <= not VGA_RESET_N;
|
VGA_RESET <= not VGA_RESET_N;
|
VGA_CLKIN <= CPU_CLKFB;
|
VGA_CLKIN <= CPU_CLKFB;
|
CPU_RESET <= '0';
|
CPU_RESET <= '0';
|
clk_vga <= CPU_CLKFB;
|
clk_vga <= CPU_CLKFB;
|
clk_mem <= VGA_CLKFB;
|
clk_mem <= VGA_CLKFB;
|
locked <= VGA_LOCKED;
|
locked <= VGA_LOCKED;
|
end process;
|
end process;
|
|
|
end architecture;
|
end architecture;
|
|
|