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

Subversion Repositories ion

[/] [ion/] [trunk/] [vhdl/] [demo/] [c2sb_demo.vhdl] - Diff between revs 75 and 116

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 75 Rev 116
Line 1... Line 1...
--##############################################################################
--##############################################################################
-- ION MIPS-compatible CPU demo on Terasic DE-1 Cyclone-II starter board
-- ION MIPS-compatible CPU demo on Terasic DE-1 Cyclone-II starter board
--##############################################################################
--##############################################################################
-- This module is little more than a wrapper around the CPU and its memories.
-- This module is little more than a wrapper around the CPU and its memories.
 
-- Synthesize with 'balanced' optimization for best results.
 
--------------------------------------------------------------------------------
 
-- NOTE: See note at bottom of file about optional use of PLL.
--##############################################################################
--##############################################################################
 
 
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;
Line 13... Line 16...
-- (Many of the board's i/o devices will go unused in this demo)
-- (Many of the board's i/o devices will go unused in this demo)
entity c2sb_demo is
entity c2sb_demo is
    port (
    port (
        -- ***** Clocks
        -- ***** Clocks
        clk_50MHz     : in std_logic;
        clk_50MHz     : in std_logic;
 
        clk_27MHz     : in std_logic;
 
 
        -- ***** Flash 4MB
        -- ***** Flash 4MB
        flash_addr    : out std_logic_vector(21 downto 0);
        flash_addr    : out std_logic_vector(21 downto 0);
        flash_data    : in std_logic_vector(7 downto 0);
        flash_data    : in std_logic_vector(7 downto 0);
        flash_oe_n    : out std_logic;
        flash_oe_n    : out std_logic;
Line 60... Line 64...
 
 
architecture minimal of c2sb_demo is
architecture minimal of c2sb_demo is
 
 
 
 
--##############################################################################
--##############################################################################
--
-- Parameters
 
 
 
-- Address size (FIXME: not tested with other values)
constant SRAM_ADDR_SIZE : integer := 32;
constant SRAM_ADDR_SIZE : integer := 32;
 
 
 
-- Clock rate selection (affects UART configuration)
 
-- Acceptable values: {27000000, 50000000, 45000000(pll config)}
 
constant CLOCK_FREQ : integer := 50000000;
 
 
--##############################################################################
--##############################################################################
-- RS232 interface signals
-- RS232 interface signals
 
 
signal rx_rdy :             std_logic;
signal rx_rdy :             std_logic;
signal tx_rdy :             std_logic;
signal tx_rdy :             std_logic;
Line 88... Line 97...
signal sd_cmd_reg :         std_logic;
signal sd_cmd_reg :         std_logic;
signal sd_do_reg :          std_logic;
signal sd_do_reg :          std_logic;
 
 
 
 
-- CPU access to hex display
-- CPU access to hex display
signal reg_display :        std_logic_vector(15 downto 0);
signal reg_display :        std_logic_vector(31 downto 0);
 
 
 
 
 
 
--##############################################################################
--##############################################################################
-- DE-1 board interface signals
-- DE-1 board interface signals
 
 
-- Synchronization FF chain for asynchronous reset input
-- Synchronization FF chain for asynchronous reset input
signal reset_sync :         std_logic_vector(2 downto 0);
signal reset_sync :         std_logic_vector(3 downto 0);
 
 
 
-- Reset pushbutton debouncing logic
 
subtype t_debouncer is integer range 0 to CLOCK_FREQ;
 
constant DEBOUNCING_DELAY : t_debouncer := 500;
 
signal debouncing_counter : t_debouncer := (CLOCK_FREQ/1000) * DEBOUNCING_DELAY;
 
 
-- Quad 7-segment display (non multiplexed) & LEDS
-- Quad 7-segment display (non multiplexed) & LEDS
signal display_data :       std_logic_vector(15 downto 0);
signal display_data :       std_logic_vector(15 downto 0);
signal reg_gleds :          std_logic_vector(7 downto 0);
signal reg_gleds :          std_logic_vector(7 downto 0);
 
 
-- Clock & reset signals
-- Clock & reset signals
signal clk_1hz :            std_logic;
signal clk_1hz :            std_logic;
signal clk_master :         std_logic;
signal clk_master :         std_logic;
signal counter_1hz :        std_logic_vector(25 downto 0);
signal counter_1hz :        std_logic_vector(25 downto 0);
signal reset :              std_logic;
signal reset :              std_logic;
 
-- Master clock signal
signal clk :                std_logic;
signal clk :                std_logic;
 
-- Clock from PLL, is a PLL is used
 
signal clk_pll :            std_logic;
 
-- '1' when PLL is locked or when no PLL is used
 
signal pll_locked :         std_logic;
 
 
 
-- Altera PLL component declaration (in case it's used)
 
-- Note that the MegaWizard component needs to be called 'pll' or the component
 
-- name should be changed in this file.
 
--component pll
 
--    port (
 
--        areset      : in std_logic  := '0';
 
--        inclk0      : in std_logic  := '0';
 
--        c0          : out std_logic ;
 
--        locked      : out std_logic
 
--    );
 
--end component;
 
 
-- SD control signals
-- SD control signals
signal sd_in :              std_logic;
signal sd_in :              std_logic;
signal reg_sd_dout :        std_logic;
signal reg_sd_dout :        std_logic;
signal reg_sd_clk :         std_logic;
signal reg_sd_clk :         std_logic;
Line 165... Line 196...
 
 
begin
begin
 
 
    mpu: entity work.mips_mpu
    mpu: entity work.mips_mpu
    generic map (
    generic map (
 
        CLOCK_FREQ     => CLOCK_FREQ,
        SRAM_ADDR_SIZE => SRAM_ADDR_SIZE
        SRAM_ADDR_SIZE => SRAM_ADDR_SIZE
    )
    )
    port map (
    port map (
        interrupt   => '0',
        interrupt   => '0',
 
 
Line 202... Line 234...
hex_display_register:
hex_display_register:
process(clk)
process(clk)
begin
begin
    if clk'event and clk='1' then
    if clk'event and clk='1' then
        if io_byte_we/="0000" and io_wr_addr(15 downto 12)=X"2" then
        if io_byte_we/="0000" and io_wr_addr(15 downto 12)=X"2" then
            reg_display <= io_wr_data(15 downto 0);
            reg_display(15 downto 0) <= io_wr_data(15 downto 0);
 
            --reg_display <= mpu_sram_address;
        end if;
        end if;
    end if;
    end if;
end process hex_display_register;
end process hex_display_register;
 
 
sd_control_register:
sd_control_register:
Line 301... Line 334...
--##############################################################################
--##############################################################################
 
 
-- Use button 3 as reset
-- Use button 3 as reset
-- This FF chain only prevents metastability trouble, it does not help with
-- This FF chain only prevents metastability trouble, it does not help with
-- switching bounces.
-- switching bounces.
 
-- (NOTE: the anti-metastability logic is probably not needed when we include 
 
-- the debouncing logic)
reset_synchronization:
reset_synchronization:
process(clk)
process(clk)
begin
begin
    if clk'event and clk='1' then
    if clk'event and clk='1' then
        reset_sync(2) <= not buttons(3);
        reset_sync(3) <= not buttons(2);
 
        reset_sync(2) <= reset_sync(3);
        reset_sync(1) <= reset_sync(2);
        reset_sync(1) <= reset_sync(2);
        reset_sync(0) <= reset_sync(1);
        reset_sync(0) <= reset_sync(1);
    end if;
    end if;
end process reset_synchronization;
end process reset_synchronization;
 
 
reset <= reset_sync(0);
reset_debouncing:
 
process(clk)
 
begin
 
    if clk'event and clk='1' then
 
        if reset_sync(0)='1' and reset_sync(1)='0' then
 
            debouncing_counter <= (CLOCK_FREQ/1000) * DEBOUNCING_DELAY;
 
        else
 
            if debouncing_counter /= 0 then
 
                debouncing_counter <= debouncing_counter - 1;
 
            end if;
 
        end if;
 
    end if;
 
end process reset_debouncing;
 
 
 
--
 
reset <= '1' when debouncing_counter /= 0 or pll_locked='0' else '0';
 
 
-- Generate a 1-Hz 'clock' to flash a LED for visual reference.
-- Generate a 1-Hz 'clock' to flash a LED for visual reference.
process(clk_50MHz)
process(clk)
begin
begin
  if clk_50MHz'event and clk_50MHz='1' then
  if clk'event and clk='1' then
    if reset = '1' then
    if reset = '1' then
      clk_1hz <= '0';
      clk_1hz <= '0';
      counter_1hz <= (others => '0');
      counter_1hz <= (others => '0');
    else
    else
      if conv_integer(counter_1hz) = 50000000 then
      if conv_integer(counter_1hz) = CLOCK_FREQ-1 then
        counter_1hz <= (others => '0');
        counter_1hz <= (others => '0');
        clk_1hz <= not clk_1hz;
        clk_1hz <= not clk_1hz;
      else
      else
        counter_1hz <= counter_1hz + 1;
        counter_1hz <= counter_1hz + 1;
      end if;
      end if;
    end if;
    end if;
  end if;
  end if;
end process;
end process;
 
 
-- Master clock is external 50MHz oscillator
-- Master clock is external 50MHz or 27MHz oscillator
 
 
 
slow_clock:
 
if CLOCK_FREQ = 27000000 generate
 
clk <= clk_27MHz;
 
pll_locked <=  '1';
 
end generate;
 
 
 
fast_clock:
 
if CLOCK_FREQ = 50000000 generate
clk <= clk_50MHz;
clk <= clk_50MHz;
 
pll_locked <=  '1';
 
end generate;
 
 
 
--pll_clock:
 
--if CLOCK_FREQ /= 27000000 and CLOCK_FREQ/=50000000 generate
 
---- Assume PLL black box is properly configured for whatever the clock rate is...
 
--input_clock_pll: component pll
 
--    port map(
 
--        areset  => '0',
 
--        inclk0  => clk_50MHz,
 
--        c0      => clk_pll,
 
--        locked  => pll_locked
 
--    );
 
--
 
----clk <= clk_1hz when reg_display(31 downto 27)="10110" else clk_pll;
 
--clk <= clk_pll;
 
--end generate;
 
 
 
 
--##############################################################################
--##############################################################################
-- LEDS, SWITCHES
-- LEDS, SWITCHES
--##############################################################################
--##############################################################################
Line 349... Line 425...
--##############################################################################
--##############################################################################
-- QUAD 7-SEGMENT DISPLAYS
-- QUAD 7-SEGMENT DISPLAYS
--##############################################################################
--##############################################################################
 
 
-- Show contents of debug register in hex display
-- Show contents of debug register in hex display
display_data <= reg_display;
display_data <=
 
    reg_display(15 downto 0);-- when switches(0)='0' else 
 
    --reg_display(31 downto 16);
 
 
 
 
-- 7-segment encoders; the dev board displays are not multiplexed or encoded
-- 7-segment encoders; the dev board displays are not multiplexed or encoded
hex3 <= nibble_to_7seg(display_data(15 downto 12));
hex3 <= nibble_to_7seg(display_data(15 downto 12));
hex2 <= nibble_to_7seg(display_data(11 downto  8));
hex2 <= nibble_to_7seg(display_data(11 downto  8));
Line 377... Line 455...
 
 
--  Embedded in the MPU entity
--  Embedded in the MPU entity
 
 
end minimal;
end minimal;
 
 
 No newline at end of file
 No newline at end of file
 
--------------------------------------------------------------------------------
 
-- NOTE: Optional use of a PLL
 
-- 
 
-- In order to try the core with any clock other the 50 and 27MHz oscillators 
 
-- readily available onboard we need to use a PLL.
 
-- Unfortunately, Quartus-II won't let you just instantiate a PLL like ISE does.
 
-- Instead, you have to build a PLL module using the MegaWizard tool.
 
-- A nasty consequence of this is that the PLL can't be reconfigured without
 
-- rebuilding it with the MW tool, and a bunch of ugly binary files have to be 
 
-- committed to SVN if the project is to be complete.
 
-- When I figure up what files need to be committed to SVN I will. Meanwhile you
 
-- have to build the module yourself if you want to u se a PLL -- Sorry!
 
-- At least it is very straightforward -- create an ALTPLL variation (from the 
 
-- IO module library) named 'pll' with a 45MHz clock at output c0, that's it.
 
--
 
-- Please note that the system will run at >50MHz when using 'balanced' 
 
-- synthesis. Only the 'area optimized' synthesis may give you trouble.
 
--------------------------------------------------------------------------------
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

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