1
0
mirror of https://github.com/Gehstock/Mist_FPGA.git synced 2026-01-11 23:43:09 +00:00
This commit is contained in:
Marcel 2022-07-02 07:45:05 +02:00
parent 94051a0399
commit 453d0ce38f
12 changed files with 362 additions and 493 deletions

View File

@ -46,15 +46,6 @@ set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files
set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL
set_global_assignment -name SMART_RECOMPILE ON
set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl"
set_global_assignment -name SYSTEMVERILOG_FILE rtl/ChannelF_MiST.sv
set_global_assignment -name VHDL_FILE rtl/channel_f.vhd
set_global_assignment -name VHDL_FILE rtl/f8_cpu.vhd
set_global_assignment -name VHDL_FILE rtl/f8_psu.vhd
set_global_assignment -name VHDL_FILE rtl/f8_pack.vhd
set_global_assignment -name VHDL_FILE rtl/base_pack.vhd
set_global_assignment -name VHDL_FILE rtl/rom_pack.vhd
set_global_assignment -name VERILOG_FILE rtl/pll.v
set_global_assignment -name QIP_FILE ../../common/mist/mist.qip
# Pin & Location Assignments
# ==========================
@ -159,4 +150,13 @@ set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -
# end ENTITY(ChannelF_MiST)
# -------------------------
set_global_assignment -name SYSTEMVERILOG_FILE rtl/ChannelF_MiST.sv
set_global_assignment -name VHDL_FILE rtl/chf_core.vhd
set_global_assignment -name VHDL_FILE rtl/f8_cpu.vhd
set_global_assignment -name VHDL_FILE rtl/f8_psu.vhd
set_global_assignment -name VHDL_FILE rtl/f8_pack.vhd
set_global_assignment -name VHDL_FILE rtl/base_pack.vhd
set_global_assignment -name VHDL_FILE rtl/rom_pack.vhd
set_global_assignment -name VERILOG_FILE rtl/pll.v
set_global_assignment -name QIP_FILE ../../common/mist/mist.qip
set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top

View File

@ -1,127 +0,0 @@
## Generated SDC file "vectrex_MiST.out.sdc"
## Copyright (C) 1991-2013 Altera Corporation
## Your use of Altera Corporation's design tools, logic functions
## and other software and tools, and its AMPP partner logic
## functions, and any output files from any of the foregoing
## (including device programming or simulation files), and any
## associated documentation or information are expressly subject
## to the terms and conditions of the Altera Program License
## Subscription Agreement, Altera MegaCore Function License
## Agreement, or other applicable license agreement, including,
## without limitation, that your use is for the sole purpose of
## programming logic devices manufactured by Altera and sold by
## Altera or its authorized distributors. Please refer to the
## applicable agreement for further details.
## VENDOR "Altera"
## PROGRAM "Quartus II"
## VERSION "Version 13.1.0 Build 162 10/23/2013 SJ Web Edition"
## DATE "Sun Jun 24 12:53:00 2018"
##
## DEVICE "EP3C25E144C8"
##
# Clock constraints
# Automatically constrain PLL and other generated clocks
derive_pll_clocks -create_base_clocks
# Automatically calculate clock uncertainty to jitter and other effects.
derive_clock_uncertainty
# tsu/th constraints
# tco constraints
# tpd constraints
#**************************************************************
# Time Information
#**************************************************************
set_time_format -unit ns -decimal_places 3
#**************************************************************
# Create Clock
#**************************************************************
create_clock -name {SPI_SCK} -period 41.666 -waveform { 20.8 41.666 } [get_ports {SPI_SCK}]
#**************************************************************
# Create Generated Clock
#**************************************************************
#**************************************************************
# Set Clock Latency
#**************************************************************
#**************************************************************
# Set Clock Uncertainty
#**************************************************************
#**************************************************************
# Set Input Delay
#**************************************************************
set_input_delay -add_delay -clock_fall -clock [get_clocks {CLOCK_27}] 1.000 [get_ports {CLOCK_27}]
set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {CONF_DATA0}]
set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DI}]
set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SCK}]
set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS2}]
set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS3}]
#**************************************************************
# Set Output Delay
#**************************************************************
set_output_delay -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DO}]
set_output_delay -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[4]}] 1.000 [get_ports {AUDIO_L}]
set_output_delay -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[4]}] 1.000 [get_ports {AUDIO_R}]
set_output_delay -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {LED}]
set_output_delay -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {VGA_*}]
#**************************************************************
# Set Clock Groups
#**************************************************************
set_clock_groups -asynchronous -group [get_clocks {SPI_SCK}] -group [get_clocks {pll|altpll_component|auto_generated|pll1|clk[*]}]
set_clock_groups -asynchronous -group [get_clocks {pll|altpll_component|auto_generated|pll1|clk[2]}] -group [get_clocks {pll|altpll_component|auto_generated|pll1|clk[4]}]
#**************************************************************
# Set False Path
#**************************************************************
#**************************************************************
# Set Multicycle Path
#**************************************************************
set_multicycle_path -to {VGA_*[*]} -setup 2
set_multicycle_path -to {VGA_*[*]} -hold 1
#**************************************************************
# Set Maximum Delay
#**************************************************************
#**************************************************************
# Set Minimum Delay
#**************************************************************
#**************************************************************
# Set Input Transition
#**************************************************************

View File

@ -19,10 +19,9 @@ module ChannelF_MiST(
`include "rtl\build_id.v"
localparam CONF_STR = {
"ChannelF;BINCHF;",
"ChannelF;BINCHFROM;",
"O1,Swap Joystick,Off,On;",
"O34,Scanlines,Off,25%,50%,75%;",
// "O6,Blending,Off,On;",
"T0,Reset;",
"V,v1.00.",`BUILD_DATE
};
@ -37,9 +36,11 @@ pll pll(
.c1 ( clk3p579 )//3.579545
);
channel_f channel_f(
chf_core chf_core(
.clk ( clk3p579 ),
.reset ( status[0] | buttons[1]),
.reset ( status[0] | buttons[1] | ioctl_downl),
.pal (),
.pll_locked ( pll_locked ),
.vga_r ( r ),
.vga_g ( g ),
@ -47,22 +48,20 @@ channel_f channel_f(
.vga_hs ( hs ),
.vga_vs ( vs ),
.vga_de ( blankn ),
.Keys ( {m_four_players, m_three_players, m_two_players, m_one_player}),
.joystick_0 ( {m_fireD, m_fireC, m_fireB, m_fireA, m_up, m_down, m_left, m_right}),
.joystick_1 ( {m_fire2D, m_fire2C, m_fire2B, m_fire2A, m_up2, m_down2, m_left2, m_right2}),
.joystick_0 ( {m_fireD, m_fireC, m_fireB, m_fireA, m_four_players, m_three_players, m_two_players, m_one_player, m_up, m_down, m_left, m_right}),
.joystick_1 ( {m_fire2D, m_fire2C, m_fire2B, m_fire2A, m_four_players, m_three_players, m_two_players, m_one_player, m_up2, m_down2, m_left2, m_right2}),
.ioctl_download ( ioctl_downl ),
.ioctl_index ( ioctl_index ),
.ioctl_wr ( ~ioctl_wr ),//todo
.ioctl_wr ( ~ioctl_wr ),//?
.ioctl_addr ( ioctl_addr ),
.ioctl_dout ( ioctl_dout ),
.ioctl_wait ( ioctl_wait ),//todo
.audio ( audio )
.ioctl_wait ( ),
.audio_l ( audio )
);
wire ioctl_downl;
wire [7:0] ioctl_index;
wire ioctl_wr;
wire ioctl_wait;
wire [24:0] ioctl_addr;
wire [7:0] ioctl_dout;
@ -146,8 +145,8 @@ dac(
.dac_o ( AUDIO_L )
);
wire m_up, m_down, m_left, m_right, m_fireA, m_fireB, m_fireC, m_fireD, m_fireE, m_fireF;
wire m_up2, m_down2, m_left2, m_right2, m_fire2A, m_fire2B, m_fire2C, m_fire2D, m_fire2E, m_fire2F;
wire m_up, m_down, m_left, m_right, m_fireA, m_fireB, m_fireC, m_fireD, m_fireE, m_fireF, m_fireG, m_fireH;
wire m_up2, m_down2, m_left2, m_right2, m_fire2A, m_fire2B, m_fire2C, m_fire2D, m_fire2E, m_fire2F, m_fire2G, m_fire2H;
wire m_tilt, m_coin1, m_coin2, m_coin3, m_coin4, m_one_player, m_two_players, m_three_players, m_four_players;
arcade_inputs inputs (
@ -157,12 +156,12 @@ arcade_inputs inputs (
.key_code ( key_code ),
.joystick_0 ( joystick_0 ),
.joystick_1 ( joystick_1 ),
.rotate ( 0 ),
.orientation ( 2'b00 ),
// .rotate ( 0 ),
// .orientation ( 2'b00 ),
.joyswap ( status[1] ),
.oneplayer ( 1'b0 ),
.controls ( {m_tilt, m_coin4, m_coin3, m_coin2, m_coin1, m_four_players, m_three_players, m_two_players, m_one_player} ),
.player1 ( {m_fireF, m_fireE, m_fireD, m_fireC, m_fireB, m_fireA, m_up, m_down, m_left, m_right} ),
.player2 ( {m_fire2F, m_fire2E, m_fire2D, m_fire2C, m_fire2B, m_fire2A, m_up2, m_down2, m_left2, m_right2} )
.player1 ( {m_fireH, m_fireG, m_fireF, m_fireE, m_fireD, m_fireC, m_fireB, m_fireA, m_up, m_down, m_left, m_right} ),
.player2 ( {m_fire2H, m_fire2G, m_fire2F, m_fire2E, m_fire2D, m_fire2C, m_fire2B, m_fire2A, m_up2, m_down2, m_left2, m_right2} )
);
endmodule

View File

@ -15,14 +15,14 @@ PACKAGE base_pack IS
--------------------------------------
SUBTYPE uv IS unsigned;
SUBTYPE sv IS signed;
SUBTYPE uv1_0 IS unsigned(1 DOWNTO 0);
SUBTYPE uv0_1 IS unsigned(0 TO 1);
SUBTYPE uv3_0 IS unsigned(3 DOWNTO 0);
SUBTYPE uv0_3 IS unsigned(0 TO 3);
SUBTYPE uv7_0 IS unsigned(7 DOWNTO 0);
SUBTYPE uv0_7 IS unsigned(0 TO 7);
SUBTYPE uv2 IS unsigned(1 DOWNTO 0);
SUBTYPE uv3 IS unsigned(2 DOWNTO 0);
SUBTYPE uv4 IS unsigned(3 DOWNTO 0);
@ -56,7 +56,7 @@ PACKAGE base_pack IS
SUBTYPE uv32 IS unsigned(31 DOWNTO 0);
SUBTYPE uv64 IS unsigned(63 DOWNTO 0);
SUBTYPE uv128 IS unsigned(127 DOWNTO 0);
SUBTYPE sv2 IS signed(1 DOWNTO 0);
SUBTYPE sv4 IS signed(3 DOWNTO 0);
SUBTYPE sv8 IS signed(7 DOWNTO 0);
@ -64,10 +64,10 @@ PACKAGE base_pack IS
SUBTYPE sv32 IS signed(31 DOWNTO 0);
SUBTYPE sv64 IS signed(63 DOWNTO 0);
SUBTYPE sv128 IS signed(127 DOWNTO 0);
TYPE arr_uv0_3 IS ARRAY(natural RANGE <>) OF uv0_3;
TYPE arr_uv0_7 IS ARRAY(natural RANGE <>) OF uv0_7;
TYPE arr_uv4 IS ARRAY(natural RANGE <>) OF uv4;
TYPE arr_uv8 IS ARRAY(natural RANGE <>) OF uv8;
TYPE arr_uv16 IS ARRAY(natural RANGE <>) OF uv16;
@ -108,14 +108,14 @@ PACKAGE base_pack IS
SUBTYPE int15 IS integer RANGE -16384 TO 16383;
SUBTYPE int16 IS integer RANGE -32768 TO 32767;
SUBTYPE int17 IS integer RANGE -65536 TO 65535;
-------------------------------------------------------------
FUNCTION v_or (CONSTANT v : unsigned) RETURN std_logic;
FUNCTION v_and (CONSTANT v : unsigned) RETURN std_logic;
FUNCTION vv (CONSTANT s : std_logic;
CONSTANT N : natural) RETURN unsigned;
--------------------------------------
FUNCTION to_std_logic (a : boolean) RETURN std_logic;
--------------------------------------
@ -190,9 +190,9 @@ PACKAGE base_pack IS
FUNCTION To_Upper (s : string) RETURN string;
FUNCTION To_String (i : natural; b : integer) RETURN string;
FUNCTION To_Natural (s : string; b : integer) RETURN natural;
FUNCTION ilog2 (CONSTANT v : natural) RETURN natural;
END PACKAGE base_pack;
--------------------------------------------------------------------------------
@ -207,7 +207,7 @@ PACKAGE BODY base_pack IS
v:=(OTHERS => s);
RETURN v;
END FUNCTION vv;
-------------------------------------------------------------
-- Vector OR (reduce)
FUNCTION v_or (CONSTANT v : unsigned) RETURN std_logic IS
@ -231,7 +231,7 @@ PACKAGE BODY base_pack IS
END IF;
--pragma synthesis_on
END FUNCTION v_or;
-------------------------------------------------------------
-- Vector AND (reduce)
FUNCTION v_and (CONSTANT v : unsigned) RETURN std_logic IS
@ -255,7 +255,7 @@ PACKAGE BODY base_pack IS
END IF;
--pragma synthesis_on
END FUNCTION v_and;
--------------------------------------
FUNCTION to_std_logic (a : boolean) RETURN std_logic IS
BEGIN
@ -263,7 +263,7 @@ PACKAGE BODY base_pack IS
ELSE RETURN '0';
END IF;
END FUNCTION to_std_logic;
--------------------------------------
-- Sélection/Multiplexage s=1:a, s=0:b
FUNCTION mux (
@ -282,7 +282,7 @@ PACKAGE BODY base_pack IS
RETURN x;
END IF;
END FUNCTION mux;
--------------------------------------
-- Sélection/Multiplexage s=true:a, s=false:b
FUNCTION mux (
@ -298,7 +298,7 @@ PACKAGE BODY base_pack IS
RETURN b;
END IF;
END FUNCTION mux;
--------------------------------------
-- Sélection/Multiplexage s=1:a, s=0:b
FUNCTION mux (
@ -309,7 +309,7 @@ PACKAGE BODY base_pack IS
BEGIN
RETURN (S AND A) OR (NOT S AND B);
END FUNCTION mux;
--------------------------------------
-- Sélection/Multiplexage s=true:a, s=false:b
FUNCTION mux (
@ -324,7 +324,7 @@ PACKAGE BODY base_pack IS
RETURN b;
END IF;
END FUNCTION mux;
--------------------------------------
-- Sélection/Multiplexage s=true:a, s=false:b
FUNCTION mux (
@ -339,7 +339,7 @@ PACKAGE BODY base_pack IS
RETURN b;
END IF;
END FUNCTION mux;
--------------------------------------
-- Sélection/Multiplexage s=1:a, s=0:b
FUNCTION mux (
@ -369,7 +369,7 @@ PACKAGE BODY base_pack IS
RETURN b;
END IF;
END FUNCTION mux;
--------------------------------------
-- Sélection/Multiplexage s=true:a, s=false:b
FUNCTION mux (
@ -384,7 +384,7 @@ PACKAGE BODY base_pack IS
RETURN b;
END IF;
END FUNCTION mux;
--------------------------------------
-- Étend un vecteur avec extension de signe
FUNCTION sext (
@ -397,7 +397,7 @@ PACKAGE BODY base_pack IS
t(e'length-1 DOWNTO 0):=e;
RETURN t;
END FUNCTION sext;
--------------------------------------
-- Étend un vecteur avec extension de signe
FUNCTION sext (
@ -409,7 +409,7 @@ PACKAGE BODY base_pack IS
t:=(OTHERS => e);
RETURN t;
END FUNCTION sext;
--------------------------------------
-- Étend un vecteur sans extension de signe
FUNCTION uext (
@ -422,7 +422,7 @@ PACKAGE BODY base_pack IS
t(e'length-1 DOWNTO 0):=e;
RETURN t;
END FUNCTION uext;
--------------------------------------
-- Étend un vecteur sans extension de signe
FUNCTION uext (
@ -435,7 +435,7 @@ PACKAGE BODY base_pack IS
t(0):=e;
RETURN t;
END FUNCTION uext;
--------------------------------------
-- Wait Until Rising Edge
PROCEDURE wure(
@ -460,7 +460,7 @@ PACKAGE BODY base_pack IS
--------------------------------------
CONSTANT HexString : string(1 TO 16):="0123456789ABCDEF";
-- Conversion unsigned -> Chaîne hexadécimale
FUNCTION To_HString(v : unsigned) RETURN string IS
VARIABLE r : string(1 TO ((v'length)+3)/4);
@ -563,7 +563,7 @@ PACKAGE BODY base_pack IS
END LOOP;
RETURN r;
END To_Upper;
--------------------------------------
-- Conversion entier -> chaîne
FUNCTION To_String(i: natural; b: integer) RETURN string IS
@ -581,7 +581,7 @@ PACKAGE BODY base_pack IS
RETURN r(k TO 10);
END FUNCTION To_String;
--------------------------------------
-- Conversion chaîne -> entier
FUNCTION To_Natural (s : string; b : integer) RETURN natural IS
@ -627,5 +627,5 @@ PACKAGE BODY base_pack IS
END LOOP;
RETURN n;
END FUNCTION ilog2;
END PACKAGE BODY base_pack;
END PACKAGE BODY base_pack;

View File

@ -5,12 +5,12 @@
--------------------------------------------------------------------------------
-- With help from MAME F8 model
-- 0000 : ROM : sl90025.rom ou sl31253.rom
-- 0000 : ROM : sl90025.rom or sl31253.rom
-- 0400 : ROM : sl31254.rom
-- 0800+ : CART
-- COLOR = P[126 + Y*128][2] & P[125 + Y*128][2] & P[X + Y*128][1:0]
-- F3850 : PORT 0 : 7 : NC
-- 6 : OUT : ENABLE IN BTN
-- 5 : OUT : ARM WRT
@ -51,56 +51,62 @@
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
USE IEEE.numeric_std.all;
--USE std.textio.ALL;
USE std.textio.ALL;
LIBRARY work;
USE work.base_pack.ALL;
USE work.rom_pack.ALL;
USE work.f8_pack.ALL;
ENTITY channel_f IS
ENTITY chf_core IS
PORT (
clk : IN std_logic;
pll_locked : IN std_logic;
reset : IN std_logic;
clk : IN std_logic;
pll_locked : IN std_logic;
pal : IN std_logic;
reset : IN std_logic;
-- VGA
vga_clk : OUT std_logic;
vga_ce : OUT std_logic;
vga_r : OUT std_logic_vector(7 DOWNTO 0);
vga_g : OUT std_logic_vector(7 DOWNTO 0);
vga_b : OUT std_logic_vector(7 DOWNTO 0);
vga_hs : OUT std_logic; -- positive pulse!
vga_vs : OUT std_logic; -- positive pulse!
vga_de : OUT std_logic; -- = not (VBlank or HBlank)
vga_clk : OUT std_logic;
vga_ce : OUT std_logic;
vga_r : OUT std_logic_vector(7 DOWNTO 0);
vga_g : OUT std_logic_vector(7 DOWNTO 0);
vga_b : OUT std_logic_vector(7 DOWNTO 0);
vga_hs : OUT std_logic; -- positive pulse!
vga_vs : OUT std_logic; -- positive pulse!
vga_de : OUT std_logic; -- = not (VBlank or HBlank)
-- HPS IO
Keys : IN unsigned(3 DOWNTO 0);
joystick_0 : IN unsigned(7 DOWNTO 0);
joystick_1 : IN unsigned(7 DOWNTO 0);
--ROM LOAD
joystick_0 : IN unsigned(31 DOWNTO 0);
joystick_1 : IN unsigned(31 DOWNTO 0);
joystick_analog_0 : IN unsigned(15 DOWNTO 0);
joystick_analog_1 : IN unsigned(15 DOWNTO 0);
status : IN unsigned(31 DOWNTO 0);
ioctl_download : IN std_logic;
ioctl_index : IN std_logic_vector(7 DOWNTO 0);
ioctl_wr : IN std_logic;
ioctl_addr : IN std_logic_vector(24 DOWNTO 0);
ioctl_dout : IN std_logic_vector(7 DOWNTO 0);
ioctl_wait : OUT std_logic;
-- AUDIO
audio : OUT std_logic_vector(15 DOWNTO 0)
);
END channel_f;
ARCHITECTURE struct OF channel_f IS
-- AUDIO
audio_l : OUT std_logic_vector(15 DOWNTO 0);
audio_r : OUT std_logic_vector(15 DOWNTO 0)
);
END chf_core;
ARCHITECTURE struct OF chf_core IS
SIGNAL ioctl_wait_l,ioctl_download2,ioctl_wr2 : std_logic;
SIGNAL adrs : uv17;
----------------------------------------------------------
SIGNAL dr,dr0,dr1,dr2,dr3,dr4,dr5,dw_cpu : uv8;
SIGNAL dv0,dv1,dv2,dv3,dv4,dv5,dv_cpu : std_logic;
SIGNAL romc : uv5;
SIGNAL phase : uint4;
SIGNAL ce : std_logic :='0';
SIGNAL pi0,po0,pi1,po1,pi1i,pi4,po4,pi4i,pi5,po5 : uv8;
SIGNAL rdena : std_logic;
SIGNAL load_a : uv10;
@ -109,7 +115,7 @@ ARCHITECTURE struct OF channel_f IS
SIGNAL tick : std_logic;
SIGNAL reset_na,areset_na : std_logic;
SIGNAL vreset_na : unsigned(0 TO 15);
----------------------------------------------------------
CONSTANT INIT_ZERO : arr_uv8(0 TO 1023) := (OTHERS => x"00");
@ -122,7 +128,7 @@ ARCHITECTURE struct OF channel_f IS
CONSTANT VSYNCSTART : natural :=242;
CONSTANT VSYNCEND : natural :=246;
CONSTANT VTOTAL : natural :=262;
-- BLACK WHITE RED GREEN BLUE LTGRAY LTGREEN LTBLUE
CONSTANT PAL_R : arr_uv8(0 TO 7) :=
(x"10",x"FD",x"FF",x"02",x"4B",x"E0",x"91",x"CE");
@ -143,16 +149,16 @@ ARCHITECTURE struct OF channel_f IS
SIGNAL vram_v : uint6;
SIGNAL vram_dw : uv2;
SIGNAL vram_wr : std_logic;
SIGNAL v125 : std_logic_vector(0 TO 63);
SIGNAL v126 : std_logic_vector(0 TO 63);
SIGNAL p125,p125p,p126,p126p : std_logic;
SIGNAL hpos,hposp : uint8;
SIGNAL vpos,vposp : uint9;
SIGNAL pos : uint13;
SIGNAL pix : uv2;
SIGNAL vdiv : uv16;
SIGNAL tone : uv2;
SIGNAL dc0,pc0,pc1 : uv16;
@ -160,65 +166,36 @@ ARCHITECTURE struct OF channel_f IS
SIGNAL visar : uv6;
SIGNAL iozcs : uv5;
BEGIN
----------------------------------------------------------
-- CPU
-- CPUCLK = VIDEOCLK / 2
ce <='1'; --NOT ce WHEN rising_edge(clk);
i_cpu: ENTITY work.f8_cpu
PORT MAP (
dr => dr,
dw => dw_cpu,
dv => dv_cpu,
romc => romc,
tick => tick,
phase => phase,
po_a => po0,
pi_a => pi0,
po_b => po1,
pi_b => pi1,
clk => clk,
ce => ce,
reset_na => reset_na,
acco => acc,
visaro => visar,
iozcso => iozcs
);
dr => dr, dw => dw_cpu, dv => dv_cpu,
romc => romc, tick => tick, phase => phase,
po_a => po0, pi_a => pi0, po_b => po1, pi_b => pi1,
clk => clk, ce => ce, reset_na => reset_na,
acco => acc, visaro => visar, iozcso => iozcs);
-- PSU SL31253
i_psu0:ENTITY work.f8_psu
GENERIC MAP (
PAGE => "000000", -- 0x0000
IOPAGE => "000001", -- Not used
IOPAGE => "000001", -- Ports 4,5
IVEC => x"FFFF", -- Not used
ROM => arr_uv8(INIT_SL31253))
PORT MAP (
dw => dr,
dr => dr0,
dv => dv0,
romc => romc,
tick => tick,
phase => phase,
ext_int => '0',
int_req => OPEN,
pri_o => OPEN,
pri_i => '1',
po_a => po4,
pi_a => pi4,
po_b => po5,
pi_b => pi5,
load_a => load_a,
load_d => load_d,
load_wr => '0',
clk => clk,
ce => ce,
reset_na => reset_na,
pc0o => pc0,
pc1o => pc1,
dc0o => dc0
);
dw => dr, dr => dr0, dv => dv0,
romc => romc, tick => tick, phase => phase,
ext_int => '0', int_req => OPEN, pri_o => OPEN, pri_i => '1',
po_a => po4, pi_a => pi4, po_b => po5, pi_b => pi5,
load_a => load_a, load_d => load_d, load_wr => '0',
clk => clk, ce => ce, reset_na => reset_na,
pc0o => pc0, pc1o => pc1, dc0o => dc0);
-- PSU SL31254
i_psu1:ENTITY work.f8_psu
@ -228,27 +205,12 @@ BEGIN
IVEC => x"FFFF", -- Not used
ROM => arr_uv8(INIT_SL31254))
PORT MAP (
dw => dr,
dr => dr1,
dv => dv1,
romc => romc,
tick => tick,
phase => phase,
ext_int => '0',
int_req => OPEN,
pri_o => OPEN,
pri_i => '1',
po_a => OPEN,
pi_a => x"FF",
po_b => OPEN,
pi_b => x"FF",
load_a => load_a,
load_d => load_d,
load_wr => '0',
clk => clk,
ce => ce,
reset_na => reset_na
);
dw => dr, dr => dr1, dv => dv1,
romc => romc, tick => tick, phase => phase,
ext_int => '0', int_req => OPEN, pri_o => OPEN, pri_i => '1',
po_a => OPEN, pi_a => x"FF", po_b => OPEN, pi_b => x"FF",
load_a => load_a, load_d => load_d, load_wr => '0',
clk => clk, ce => ce, reset_na => reset_na);
-- CARTRIDGE
i_psu2:ENTITY work.f8_psu
@ -258,27 +220,12 @@ BEGIN
IVEC => x"FFFF", -- Not used
ROM => INIT_ZERO)
PORT MAP (
dw => dr,
dr => dr2,
dv => dv2,
romc => romc,
tick => tick,
phase => phase,
ext_int => '0',
int_req => OPEN,
pri_o => OPEN,
pri_i => '1',
po_a => OPEN,
pi_a => x"FF",
po_b => OPEN,
pi_b => x"FF",
load_a => load_a,
load_d => load_d,
load_wr => load_wr0,
clk => clk,
ce => ce,
reset_na => reset_na
);
dw => dr, dr => dr2, dv => dv2,
romc => romc, tick => tick, phase => phase,
ext_int => '0', int_req => OPEN, pri_o => OPEN, pri_i => '1',
po_a => OPEN, pi_a => x"FF", po_b => OPEN, pi_b => x"FF",
load_a => load_a, load_d => load_d, load_wr => load_wr0,
clk => clk, ce => ce, reset_na => reset_na);
-- CARTRIDGE
i_psu3:ENTITY work.f8_psu
@ -288,28 +235,13 @@ BEGIN
IVEC => x"FFFF", -- Not used
ROM => INIT_ZERO)
PORT MAP (
dw => dr,
dr => dr3,
dv => dv3,
romc => romc,
tick => tick,
phase => phase,
ext_int => '0',
int_req => OPEN,
pri_o => OPEN,
pri_i => '1',
po_a => OPEN,
pi_a => x"FF",
po_b => OPEN,
pi_b => x"FF",
load_a => load_a,
load_d => load_d,
load_wr => load_wr1,
clk => clk,
ce => ce,
reset_na => reset_na
);
dw => dr, dr => dr3, dv => dv3,
romc => romc, tick => tick, phase => phase,
ext_int => '0', int_req => OPEN, pri_o => OPEN, pri_i => '1',
po_a => OPEN, pi_a => x"FF", po_b => OPEN, pi_b => x"FF",
load_a => load_a, load_d => load_d, load_wr => load_wr1,
clk => clk, ce => ce, reset_na => reset_na);
-- CARTRIDGE
i_psu4:ENTITY work.f8_psu
GENERIC MAP (
@ -318,28 +250,13 @@ BEGIN
IVEC => x"FFFF", -- Not used
ROM => INIT_ZERO)
PORT MAP (
dw => dr,
dr => dr4,
dv => dv4,
romc => romc,
tick => tick,
phase => phase,
ext_int => '0',
int_req => OPEN,
pri_o => OPEN,
pri_i => '1',
po_a => OPEN,
pi_a => x"FF",
po_b => OPEN,
pi_b => x"FF",
load_a => load_a,
load_d => load_d,
load_wr => load_wr2,
clk => clk,
ce => ce,
reset_na => reset_na
);
dw => dr, dr => dr4, dv => dv4,
romc => romc, tick => tick, phase => phase,
ext_int => '0', int_req => OPEN, pri_o => OPEN, pri_i => '1',
po_a => OPEN, pi_a => x"FF", po_b => OPEN, pi_b => x"FF",
load_a => load_a, load_d => load_d, load_wr => load_wr2,
clk => clk, ce => ce, reset_na => reset_na);
-- CARTRIDGE
i_psu5:ENTITY work.f8_psu
GENERIC MAP (
@ -348,27 +265,13 @@ BEGIN
IVEC => x"FFFF", -- Not used
ROM => INIT_ZERO)
PORT MAP (
dw => dr,
dr => dr5,
dv => dv5,
romc => romc,
tick => tick,
phase => phase,
ext_int => '0',
int_req => OPEN,
pri_o => OPEN,
pri_i => '1',
po_a => OPEN,
pi_a => x"FF",
po_b => OPEN,
pi_b => x"FF",
load_a => load_a,
load_d => load_d,
load_wr => load_wr3,
clk => clk,
ce => ce,
reset_na => reset_na);
dw => dr, dr => dr5, dv => dv5,
romc => romc, tick => tick, phase => phase,
ext_int => '0', int_req => OPEN, pri_o => OPEN, pri_i => '1',
po_a => OPEN, pi_a => x"FF", po_b => OPEN, pi_b => x"FF",
load_a => load_a, load_d => load_d, load_wr => load_wr3,
clk => clk, ce => ce, reset_na => reset_na);
dr <= dr0 WHEN dv0='1' ELSE
dr1 WHEN dv1='1' ELSE
dr2 WHEN dv2='1' ELSE
@ -376,10 +279,10 @@ BEGIN
dr4 WHEN dv4='1' ELSE
dr5 WHEN dv5='1' ELSE
dw_cpu;
----------------------------------------------------------
----------------------------------------------------------
-- CARTRIDGE LOAD
PROCESS (clk) IS
BEGIN
IF rising_edge(clk) THEN
@ -392,16 +295,16 @@ BEGIN
ioctl_wait<='0';
END IF;
END PROCESS;
rdena<=NOT po0(6);
----------------------------------------------------------
-- VIDEO
vram_h <= to_integer(NOT po4(6 DOWNTO 0));
vram_v <= to_integer(NOT po5(5 DOWNTO 0));
vram_dw<= NOT po1(7 DOWNTO 6);
vram_wr<= po0(5);
vram_a <= vram_h + vram_v * 128;
PROCESS(clk) IS
@ -418,7 +321,7 @@ BEGIN
END IF;
END IF;
END PROCESS;
-- VIDEO SWEEP
PROCESS (clk) IS
BEGIN
@ -436,52 +339,52 @@ BEGIN
pos<=((vpos/4) MOD 64) * 128 + ((hpos/2) MOD 128);
vposp<=vpos;
hposp<=hpos;
pix <=vram(pos);
p125<=v125((vposp/4) MOD 64);
p126<=v126((vposp/4) MOD 64);
vga_r<=std_logic_vector(PAL_R(CMAP(to_integer(p125 & p126 & pix))));
vga_g<=std_logic_vector(PAL_G(CMAP(to_integer(p125 & p126 & pix))));
vga_b<=std_logic_vector(PAL_B(CMAP(to_integer(p125 & p126 & pix))));
vga_de<=to_std_logic(vposp<=VDISP AND hposp<HDISP);
vga_hs<=to_std_logic(hposp>=HSYNCSTART AND hposp<=HSYNCEND);
vga_vs<=to_std_logic(vposp>=VSYNCSTART AND vposp<=VSYNCEND);
END IF;
END IF;
END PROCESS;
vga_clk<=clk;
vga_ce<=ce;
-- 128 x 64 pixels => 102 x 58 visible => 95 x 58 visible
-- CPU : F video / 2
-- 1.7897725MHz (NTSC)
-- 2.0000000MHz (PAL GEN 1)
-- 1.7734475MHz (PAL GEN 2)
----------------------------------------------------------
-- Joysticks / Buttons
pi0(7 DOWNTO 4)<=po0(7 DOWNTO 4);
pi0(0) <= NOT Keys(0); -- TIME
pi0(1) <= NOT Keys(1); -- MODE
pi0(2) <= NOT Keys(2); -- HOLD
pi0(3) <= NOT Keys(3); -- START
pi1i(7) <= NOT joystick_0(4); -- RIGHT G.DOWN
pi1i(6) <= NOT joystick_0(5); -- RIGHT G.UP
pi1i(5) <= NOT joystick_0(6); -- RIGHT CW
pi1i(4) <= NOT joystick_0(7); -- RIGHT CCW
pi0(0) <= NOT (joystick_0(4) OR joystick_1(4)); -- TIME
pi0(1) <= NOT (joystick_0(5) OR joystick_1(5)); -- MODE
pi0(2) <= NOT (joystick_0(6) OR joystick_1(6)); -- HOLD
pi0(3) <= NOT (joystick_0(7) OR joystick_1(7)); -- START
pi1i(7) <= NOT joystick_0(8); -- RIGHT G.DOWN
pi1i(6) <= NOT joystick_0(9); -- RIGHT G.UP
pi1i(5) <= NOT joystick_0(10); -- RIGHT CW
pi1i(4) <= NOT joystick_0(11); -- RIGHT CCW
pi1i(3) <= NOT joystick_0(3); -- RIGHT UP
pi1i(2) <= NOT joystick_0(2); -- RIGHT DOWN
pi1i(1) <= NOT joystick_0(1); -- RIGHT LEFT
pi1i(0) <= NOT joystick_0(0); -- RIGHT RIGHT
pi4i(7) <= NOT joystick_1(4); -- LEFT G.DOWN
pi4i(6) <= NOT joystick_1(5); -- LEFT G.UP
pi4i(5) <= NOT joystick_1(6); -- LEFT CW
pi4i(4) <= NOT joystick_1(7); -- LEFT CCW
pi4i(7) <= NOT joystick_1(8); -- LEFT G.DOWN
pi4i(6) <= NOT joystick_1(9); -- LEFT G.UP
pi4i(5) <= NOT joystick_1(10); -- LEFT CW
pi4i(4) <= NOT joystick_1(11); -- LEFT CCW
pi4i(3) <= NOT joystick_1(3); -- LEFT UP
pi4i(2) <= NOT joystick_1(2); -- LEFT DOWN
pi4i(1) <= NOT joystick_1(1); -- LEFT LEFT
@ -489,16 +392,16 @@ BEGIN
pi1<=pi1i OR po1 WHEN rdena='1' ELSE po1;
pi4<=pi4i OR po4 WHEN rdena='1' ELSE po4;
pi5<=po5;
----------------------------------------------------------
-- Audio
-- 00 : Silence
-- 01 : 1kHz
-- 10 : 500Hz
-- 11 : 120Hz
tone <=po5(7 DOWNTO 6);
PROCESS (clk) IS
VARIABLE s_v : std_logic;
@ -511,13 +414,76 @@ BEGIN
WHEN "10" => s_v:=vdiv(9);
WHEN OTHERS => s_v:=vdiv(7);
END CASE;
audio<=(OTHERS =>s_v);
audio_l<=(OTHERS =>s_v);
audio_r<=(OTHERS =>s_v);
END IF;
END PROCESS;
----------------------------------------------------------
areset_na<=NOT reset AND pll_locked AND NOT ioctl_download;
vreset_na<=x"0000" WHEN areset_na='0' ELSE
'1' & vreset_na(0 TO 14) WHEN rising_edge(clk);
reset_na<=vreset_na(15);
----------------------------------------------------------
--pragma synthesis_off
PROCESS IS
FILE fil : text OPEN write_mode IS "cpu.log";
VARIABLE char_v : character;
VARIABLE lin : line;
VARIABLE op : uv8;
BEGIN
wure(clk,10);
LOOP
wure(clk);
IF phase=4 AND romc=0 THEN
write(lin,to_hstring(pc0));
write(lin,string'(" : "));
write(lin,to_hstring(dr));
op:=dr;
IF ILEN(to_integer(dr))=1 THEN
write(lin,string'(" .. .. : "));
ELSIF ILEN(to_integer(dr))=2 THEN
wure(clk);
LOOP
wure(clk);
EXIT WHEN phase=4 AND (romc=0 OR romc=1 OR romc=3 OR romc=12 OR romc=14);
END LOOP;
write(lin,string'(" "));
write(lin,to_hstring(dr));
write(lin,string'(" .. : "));
ELSIF ILEN(to_integer(dr))=3 THEN
wure(clk);
LOOP
wure(clk);
EXIT WHEN phase=4 AND (romc=0 OR romc=1 OR romc=3 OR romc=12 OR romc=14);
END LOOP;
write(lin,string'(" "));
write(lin,to_hstring(dr));
wure(clk);
LOOP
wure(clk);
EXIT WHEN phase=4 AND (romc=0 OR romc=1 OR romc=3 OR romc=12 OR romc=14);
END LOOP;
write(lin,string'(" "));
write(lin,to_hstring(dr));
write(lin,string'(" : "));
END IF;
write(lin,OPTXT(to_integer(op)));
write(lin,string'(" DC0=") & to_hstring(dc0));
write(lin,string'(" PC1=") & to_hstring(pc1));
write(lin,string'(" ACC=") & to_hstring(acc));
write(lin,string'(" ISAR=") & to_hstring("00" & visar));
write(lin,string'(" "));
write(lin,now);
writeline(fil,lin);
END IF;
END LOOP;
WAIT;
END PROCESS;
--pragma synthesis_on
END struct;

View File

@ -20,7 +20,7 @@ ENTITY f8_cpu IS
dr : IN uv8; -- Data Read
dw : OUT uv8; -- Data Write / Address
dv : OUT std_logic;
romc : OUT uv5;
tick : OUT std_logic; -- 1/4 or 1/6 cycle lenght
phase : OUT uint4;
@ -29,7 +29,7 @@ ENTITY f8_cpu IS
pi_a : IN uv8;
po_b : OUT uv8;
pi_b : IN uv8;
clk : IN std_logic;
ce : IN std_logic;
reset_na : IN std_logic;
@ -49,40 +49,40 @@ ARCHITECTURE rtl OF f8_cpu IS
SIGNAL acc : uv8;
SIGNAL visar : uv6;
ALIAS visarl : uv3 IS visar(2 DOWNTO 0);
SIGNAL rs,rd : uint6;
SIGNAL scratch_regs : arr_uv8(0 TO 63); -- Scratch regs
SIGNAL sreg_ra,sreg_wa : uint6;
SIGNAL sreg_rd,sreg_wd : uv8;
SIGNAL sreg_wr : std_logic;
SIGNAL iozcs : uv5;
SIGNAL op : enum_op;
SIGNAL poa_l,pob_l : uv8;
SIGNAL alu : uv8;
SIGNAL test,bcc,testp,bccp,dstm : std_logic;
SIGNAL txt : string(1 TO 12);
BEGIN
phase<=phase_l;
po_a<=poa_l;
po_b<=pob_l;
----------------------------------------------------------
romc<=ROMC_01 WHEN (bcc='1' AND test='1') OR
(opcode=x"8F" AND isarl/=7 AND mop.romc=ROMC_03) ELSE
ROMC_03 WHEN (bcc='1' AND test='0') OR
(opcode=x"8F" AND isarl=7 AND mop.romc=ROMC_03) ELSE
mop.romc;
sreg_ra<=mop.rs WHEN mop.rs<16 ELSE
mop.rd WHEN mop.rd<16 ELSE
to_integer(visar);
sreg_rd<=scratch_regs(sreg_ra) WHEN rising_edge(clk);
PROCESS(clk) IS
@ -93,7 +93,7 @@ BEGIN
END IF;
END IF;
END PROCESS;
----------------------------------------------------------
PROCESS(clk,reset_na) IS
VARIABLE len_v : enum_len;
@ -105,7 +105,7 @@ BEGIN
IF ce='1' THEN
mop<=MICROCODE(madrs);
sreg_wr<='0';
-----------------------------------------
len_v:=mop.len;
IF (bcc='1' AND test='1') OR (opcode=x"8F" AND visarl=7) THEN
@ -115,7 +115,7 @@ BEGIN
ELSE
len_v:=mop.len;
END IF;
IF phase_l=7 AND len_v=S THEN
phase_l<=0;
ELSIF phase_l=11 AND len_v=L THEN
@ -123,18 +123,18 @@ BEGIN
ELSE
phase_l<=phase_l+1;
END IF;
-----------------------------------------
CASE phase_l IS
WHEN 0 =>
test<=testp;
bcc<=bccp;
WHEN 1 =>
NULL;
WHEN 2 =>
NULL; -- <dw :=> <AVOIR>
WHEN 3 =>
CASE mop.rd IS
WHEN RACC => rs1_v:=acc;
@ -166,14 +166,14 @@ BEGIN
WHEN OTHERS =>
rs2_v:=acc;
END CASE;
aluop(mop.op,opcode,rs1_v,rs2_v,iozcs,rd_v,dstm_v,iozcs_v,test_v);
dstm<=dstm_v;
iozcs<=iozcs_v;
alu<=rd_v;
testp<=test_v;
bccp <=to_std_logic(mop.op=OP_TST8 OR mop.op=OP_TST9);
WHEN 4 =>
dv<='0';
IF dstm='1' THEN
@ -200,7 +200,7 @@ BEGIN
WHEN OTHERS => NULL;
END CASE;
END IF;
WHEN 5 =>
IF mop.rs=RISARP OR mop.rd=RISARP THEN
visar(2 DOWNTO 0)<=visar(2 DOWNTO 0)+1;
@ -208,7 +208,7 @@ BEGIN
IF mop.rs=RISARM OR mop.rd=RISARM THEN
visar(2 DOWNTO 0)<=visar(2 DOWNTO 0)-1;
END IF;
WHEN 7 =>
IF len_v=S THEN
IF mop.romc=ROMC_00 THEN -- IFETCH
@ -219,7 +219,7 @@ BEGIN
madrs<=madrs+1;
END IF;
END IF;
WHEN 11 =>
IF len_v=L THEN
IF mop.romc=ROMC_00 THEN -- IFETCH
@ -230,12 +230,12 @@ BEGIN
madrs<=madrs+1;
END IF;
END IF;
WHEN OTHERS =>
NULL;
END CASE;
IF reset_na='0' THEN
opcode<=OP_RESET;
txt<=OPTXT(to_integer(OP_RESET));
@ -243,7 +243,7 @@ BEGIN
phase_l<=0;
iozcs<="00000";
END IF;
END IF;
END IF;
@ -252,6 +252,5 @@ BEGIN
acco<=acc;
visaro<=visar;
iozcso<=iozcs;
END ARCHITECTURE rtl;
END ARCHITECTURE rtl;

View File

@ -40,7 +40,7 @@ PACKAGE f8_pack IS
dstm : OUT std_logic; -- Modified result reg
iozcs_o : OUT uv5; -- Flags after
test : OUT std_logic); -- Contitional branch test result
--------------------------------------
CONSTANT R0 : uint5 := 0;
CONSTANT R1 : uint5 := 1;
@ -656,7 +656,7 @@ PACKAGE f8_pack IS
"AND R4 ", "AND R5 ", "AND R6 ", "AND R7 ",
"AND R8 ", "AND R9 ", "AND R10 ", "AND R11 ",
"AND (ISAR) ", "AND (ISAR+) ", "AND (ISAR-) ", "Invalid ");
TYPE arr_ilen IS ARRAY(natural RANGE <>) OF uint3;
CONSTANT ILEN : arr_ilen(0 TO 255) :=(
1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, --00
@ -675,7 +675,7 @@ PACKAGE f8_pack IS
1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,0, --D0
1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,0, --E0
1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,0); --F0
END PACKAGE;
--##############################################################################
@ -831,7 +831,7 @@ PACKAGE BODY f8_pack IS
iozcs_o(3):=(src1(7) XOR dst9_v(7)) AND (NOT dst9_v(7));
dstm:='1';
dst_v:=dst9_v(7 DOWNTO 0);
WHEN OP_SL1 => -- SHIFT LEFT 1
dst_v:=src1(6 DOWNTO 0) & '0';
iozcs_o(0):=NOT dst_v(7);
@ -917,4 +917,4 @@ PACKAGE BODY f8_pack IS
END PROCEDURE;
END PACKAGE BODY;
END PACKAGE BODY;

View File

@ -38,31 +38,31 @@ ENTITY f8_psu IS
dw : IN uv8; -- Data Write
dr : OUT uv8; -- Data Read
dv : OUT std_logic;
romc : IN uv5;
tick : IN std_logic; -- 1/8 or 1/12 cycle length
phase : IN uint4;
ext_int : IN std_logic;
int_req : OUT std_logic;
pri_o : OUT std_logic;
pri_i : IN std_logic;
po_a : OUT uv8; -- IO port A
pi_a : IN uv8;
po_b : OUT uv8; -- IO port B
pi_b : IN uv8;
load_a : IN uv10;
load_d : IN uv8;
load_wr : IN std_logic;
clk : IN std_logic;
ce : IN std_logic;
reset_na : IN std_logic;
pc0o : OUT uv16;
pc1o : OUT uv16;
dc0o : OUT uv16
@ -88,11 +88,11 @@ ARCHITECTURE rtl OF f8_psu IS
SIGNAL ext_int_d,tim_int_d,tim_int : std_logic;
SIGNAL inta,inta_set,inta_clr : std_logic;
SIGNAL int_req_l : std_logic;
BEGIN
mem_a<=dc0 WHEN romc="00010" OR romc="00101" ELSE pc0;
----------------------------------------------------------
-- ROMC BUS
PROCESS(clk,reset_na) IS
@ -108,9 +108,9 @@ BEGIN
IF phase=2 THEN
dv<='0';
END IF;
io_wr<='0';
CASE romc IS
WHEN "00000" =>
-- S,L : Instruction fetch. The device whose address space includes
@ -124,7 +124,7 @@ BEGIN
IF phase=6 THEN
pc0<= pc0 + 1;
END IF;
WHEN "00001" =>
-- L : The device whose address space includes the contents of
-- the PC0 register must place on the data bus the contents of
@ -137,7 +137,7 @@ BEGIN
IF phase=6 THEN
pc0<= pc0 + sext(dw,16);
END IF;
WHEN "00010" =>
-- L : The device whose DC0 addresses a memory word within the
-- address space of that device must place on the data bus the
@ -150,7 +150,7 @@ BEGIN
IF phase=6 THEN
dc0<= dc0 + 1;
END IF;
WHEN "00011" =>
-- L,S : Similar to 00, except that it is used for Immediate Operand
-- fetches (using PC0) instead of instruction fetches.
@ -162,13 +162,13 @@ BEGIN
pc0<= pc0 + 1;
io_port<=dw;
END IF;
WHEN "00100" =>
-- S : Copy the contents of PC1 into PC0.
IF phase=6 THEN
pc0<= pc1;
END IF;
WHEN "00101" =>
-- L : Store the data bus contents into the memory
-- location pointed to by DC0. Increment DC0.
@ -180,21 +180,21 @@ BEGIN
--IF phase=6 THEN
-- dc0<=dc0 + 1;
--END IF;
WHEN "00110" =>
-- L : Place the high order byte of DC0 on the data bus.
IF phase=2 THEN
dr <=dc0(15 DOWNTO 8);
dv <='1';
END IF;
WHEN "00111" =>
-- L : Place the high order byte of PC1 on the data bus.
IF phase=2 THEN
dr <=pc1(15 DOWNTO 8);
dv <='1';
END IF;
WHEN "01000" =>
-- L : All devices copy the contents of PC0 into PC1. The CPU
-- outputs zero on the data bus in this ROMC state. Load the
@ -203,7 +203,7 @@ BEGIN
pc1<=pc0;
pc0<=x"0000";
END IF;
WHEN "01001" =>
-- The device whose address space includes the contents of the DC0
-- register must place the low order byte of DC0 onto the data bus.
@ -211,14 +211,14 @@ BEGIN
dr <=dc0(7 DOWNTO 0);
dv <=pchk(dc0);
END IF;
WHEN "01010" =>
-- L : All devices add the 8-bit value on the data bus, treated
-- as a signed binary number, to the Data Counter.
IF phase=6 THEN
dc0<=dc0 + sext(dw,16);
END IF;
WHEN "01011" =>
-- L : The device whose address space includes the value in PC1
-- must place the low order byte of PC1 on the data bus.
@ -226,7 +226,7 @@ BEGIN
dr <=pc1(7 DOWNTO 0);
dv <=pchk(pc1);
END IF;
WHEN "01100" =>
-- L : The device whose address space includes the contents of
-- the PC0 register must place the contents of the memory word
@ -240,12 +240,12 @@ BEGIN
IF phase=6 THEN
pc0(7 DOWNTO 0)<= dw;
END IF;
WHEN "01101" =>
-- S : All devices store in PC1 the current contents of PC0,
-- incremented by 1. PC0 is unaltered.
pc1 <= pc0 +1;
WHEN "01110" =>
-- L : The device whose address space includes the contents of
-- PC0 must place the contents of the word addressed by PC0
@ -258,7 +258,7 @@ BEGIN
IF phase=6 THEN
dc0(7 DOWNTO 0)<= dw;
END IF;
WHEN "01111" =>
-- L : The interrupting device with highest priority must place
-- the low order byte of the interrupt vector on the data bus.
@ -273,11 +273,11 @@ BEGIN
pc1 <= pc0;
pc0(7 DOWNTO 0) <= dw;
END IF;
WHEN "10000" =>
-- L : Inhibit any modification to the interrupt priority logic.
-- <TODO>
WHEN "10001" =>
-- L : The device whose memory space includes the contents of
-- PC0 must place the contents of the addressed memory word
@ -290,7 +290,7 @@ BEGIN
IF phase=6 THEN
dc0(15 DOWNTO 8)<=dw;
END IF;
WHEN "10010" =>
-- L : All devices copy the contents of PC0 into PC1. All
-- devices then move the contents of the data bus into
@ -299,7 +299,7 @@ BEGIN
pc1<=pc0;
pc0(7 DOWNTO 0)<=dw;
END IF;
WHEN "10011" =>
-- L : The interrupting device with highest priority must move
-- the high order half of the interrupt vector onto the data bus.
@ -315,49 +315,49 @@ BEGIN
pc0(15 DOWNTO 8) <= dw;
inta_clr<=int_req_l;
END IF;
WHEN "10100" =>
-- L : All devices move the contents of the data bus into the
-- high order byte of PC0.
IF phase=6 THEN
pc0(15 DOWNTO 8)<=dw;
END IF;
WHEN "10101" =>
-- L : All devices move contents of the data bus into the
-- high order byte of PC1.
IF phase=6 THEN
pc1(15 DOWNTO 8)<=dw;
END IF;
WHEN "10110" =>
-- L : All devices move the contents of the data bus into the
-- high order byte of DC0.
IF phase=6 THEN
dc0(15 DOWNTO 8)<=dw;
END IF;
WHEN "10111" =>
-- L : All devices move the contents of the data bus into the
-- low order byte of PC0.
IF phase=6 THEN
pc0(7 DOWNTO 0)<=dw;
END IF;
WHEN "11000" =>
-- L : All devices move contents of the data bus into the low
-- order byte of PC1.
IF phase=6 THEN
pc1(7 DOWNTO 0)<=dw;
END IF;
WHEN "11001" =>
-- L : All devices move contents of the data bus into the low
-- order byte of DC0.
IF phase=6 THEN
dc0(7 DOWNTO 0)<=dw;
END IF;
WHEN "11010" =>
-- L : During the prior cycle an I/O port timer or interrupt
-- control register was addressed, The device containing
@ -367,7 +367,7 @@ BEGIN
io_dw<=dw;
io_wr<=to_std_logic(io_port(7 DOWNTO 2)=IOPAGE);
END IF;
WHEN "11011" =>
-- L : During the prior cycle the data bus specified the
-- address of an I/O port. The device containing the
@ -380,13 +380,13 @@ BEGIN
dr<=io_dr;
dv<=to_std_logic(io_port(7 DOWNTO 2)=IOPAGE);
END IF;
WHEN "11100" =>
-- L/S : None. Before IO port access
IF phase=6 THEN
io_port<=dw;
END IF;
WHEN "11101" =>
-- S : Devices with DC0 and DC1 registers must switch registers.
-- Devices without a DC1 register perform no operation.
@ -394,7 +394,7 @@ BEGIN
-- dc0<=dc1;
-- dc1<=dc0;
--END IF;
WHEN "11110" =>
-- L : The device whose address space includes the contents of
-- PC0 must place the low order byte of PC0 onto the data bus.
@ -402,7 +402,7 @@ BEGIN
dr <=pc0(7 DOWNTO 0);
dv <=pchk(pc0);
END IF;
WHEN "11111" =>
-- L : The device whose address space includes the contents of
-- PC0 must place the high order byte of PC0 on the data bus.
@ -413,9 +413,9 @@ BEGIN
WHEN OTHERS =>
NULL;
END CASE;
IF reset_na='0' THEN
pc0<=x"0000";
pc1<=x"0000";
@ -440,14 +440,14 @@ BEGIN
END IF;
END IF;
END PROCESS;
----------------------------------------------------------
-- IO PORTS
po_a<=po_a_l;
po_b<=po_b_l;
int_req<=int_req_l;
PROCESS(clk,reset_na) IS
BEGIN
IF rising_edge(clk) THEN
@ -461,18 +461,18 @@ BEGIN
END IF;
tim_int<=to_std_logic(tim=x"FE");
tim_int_d<=tim_int;
-- Interrupts
ext_int_d<=ext_int;
inta_set<=(NOT ext_int_d AND ext_int AND to_std_logic(icr="01")) OR
(NOT tim_int_d AND tim_int AND to_std_logic(icr="11"));
inta <=(inta OR inta_set) AND NOT inta_clr;
int_req_l<=inta AND pri_i;
pri_o<=pri_i AND NOT inta;
-------------------------------
CASE io_port(1 DOWNTO 0) IS
WHEN "00" => -- IO PORT A READ
@ -484,7 +484,7 @@ BEGIN
WHEN OTHERS => -- Timer
io_dr<=x"00"; -- <TBD>
END CASE;
IF io_wr='1' THEN
CASE io_port(1 DOWNTO 0) IS
WHEN "00" => po_a_l<=io_dw;
@ -506,5 +506,5 @@ BEGIN
pc0o<=pc0;
pc1o<=pc1;
dc0o<=dc0;
END ARCHITECTURE rtl;
END ARCHITECTURE rtl;

View File

@ -0,0 +1,4 @@
set_global_assignment -name IP_TOOL_NAME "ALTPLL"
set_global_assignment -name IP_TOOL_VERSION "13.1"
set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) "pll.v"]
set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll.ppf"]

View File

@ -40,26 +40,30 @@ module pll (
inclk0,
c0,
c1,
c2,
locked);
input inclk0;
output c0;
output c1;
output c2;
output locked;
wire [4:0] sub_wire0;
wire sub_wire2;
wire [0:0] sub_wire6 = 1'h0;
wire [0:0] sub_wire7 = 1'h0;
wire [2:2] sub_wire4 = sub_wire0[2:2];
wire [0:0] sub_wire3 = sub_wire0[0:0];
wire [1:1] sub_wire1 = sub_wire0[1:1];
wire c1 = sub_wire1;
wire locked = sub_wire2;
wire c0 = sub_wire3;
wire sub_wire4 = inclk0;
wire [1:0] sub_wire5 = {sub_wire6, sub_wire4};
wire c2 = sub_wire4;
wire sub_wire5 = inclk0;
wire [1:0] sub_wire6 = {sub_wire7, sub_wire5};
altpll altpll_component (
.inclk (sub_wire5),
.inclk (sub_wire6),
.clk (sub_wire0),
.locked (sub_wire2),
.activeclock (),
@ -106,6 +110,10 @@ module pll (
altpll_component.clk1_duty_cycle = 50,
altpll_component.clk1_multiply_by = 53,
altpll_component.clk1_phase_shift = "0",
altpll_component.clk2_divide_by = 715,
altpll_component.clk2_duty_cycle = 50,
altpll_component.clk2_multiply_by = 106,
altpll_component.clk2_phase_shift = "0",
altpll_component.compensate_clock = "CLK0",
altpll_component.inclk0_input_frequency = 37037,
altpll_component.intended_device_family = "Cyclone III",
@ -140,7 +148,7 @@ module pll (
altpll_component.port_scanwrite = "PORT_UNUSED",
altpll_component.port_clk0 = "PORT_USED",
altpll_component.port_clk1 = "PORT_USED",
altpll_component.port_clk2 = "PORT_UNUSED",
altpll_component.port_clk2 = "PORT_USED",
altpll_component.port_clk3 = "PORT_UNUSED",
altpll_component.port_clk4 = "PORT_UNUSED",
altpll_component.port_clk5 = "PORT_UNUSED",
@ -181,10 +189,13 @@ endmodule
// Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8"
// Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "50"
// Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "400"
// Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "715"
// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000"
// Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000"
// Retrieval info: PRIVATE: DUTY_CYCLE2 STRING "50.00000000"
// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "28.620001"
// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "3.577500"
// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "4.002797"
// Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0"
// Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0"
// Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1"
@ -206,25 +217,33 @@ endmodule
// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0"
// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg"
// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT1 STRING "ps"
// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT2 STRING "ps"
// Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any"
// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0"
// Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0"
// Retrieval info: PRIVATE: MIRROR_CLK2 STRING "0"
// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "53"
// Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "53"
// Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "106"
// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1"
// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "28.63636000"
// Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "3.57954500"
// Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "4.00000000"
// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0"
// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0"
// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "0"
// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz"
// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz"
// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT2 STRING "MHz"
// Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1"
// Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0"
// Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000"
// Retrieval info: PRIVATE: PHASE_SHIFT1 STRING "0.00000000"
// Retrieval info: PRIVATE: PHASE_SHIFT2 STRING "0.00000000"
// Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0"
// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg"
// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT1 STRING "deg"
// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT2 STRING "ps"
// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0"
// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0"
// Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1"
@ -248,13 +267,16 @@ endmodule
// Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0"
// Retrieval info: PRIVATE: STICKY_CLK0 STRING "1"
// Retrieval info: PRIVATE: STICKY_CLK1 STRING "1"
// Retrieval info: PRIVATE: STICKY_CLK2 STRING "1"
// Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1"
// Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1"
// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0"
// Retrieval info: PRIVATE: USE_CLK0 STRING "1"
// Retrieval info: PRIVATE: USE_CLK1 STRING "1"
// Retrieval info: PRIVATE: USE_CLK2 STRING "1"
// Retrieval info: PRIVATE: USE_CLKENA0 STRING "0"
// Retrieval info: PRIVATE: USE_CLKENA1 STRING "0"
// Retrieval info: PRIVATE: USE_CLKENA2 STRING "0"
// Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0"
// Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0"
// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all
@ -267,6 +289,10 @@ endmodule
// Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50"
// Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "53"
// Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0"
// Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "715"
// Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50"
// Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "106"
// Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0"
// Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0"
// Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037"
// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III"
@ -300,7 +326,7 @@ endmodule
// Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED"
// Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED"
// Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_USED"
// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED"
// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_USED"
// Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED"
// Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED"
// Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED"
@ -319,12 +345,14 @@ endmodule
// Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]"
// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0"
// Retrieval info: USED_PORT: c1 0 0 0 0 OUTPUT_CLK_EXT VCC "c1"
// Retrieval info: USED_PORT: c2 0 0 0 0 OUTPUT_CLK_EXT VCC "c2"
// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0"
// Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked"
// Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0
// Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0
// Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0
// Retrieval info: CONNECT: c1 0 0 0 0 @clk 0 0 1 1
// Retrieval info: CONNECT: c2 0 0 0 0 @clk 0 0 1 2
// Retrieval info: CONNECT: locked 0 0 0 0 @locked 0 0 0 0
// Retrieval info: GEN_FILE: TYPE_NORMAL pll.v TRUE
// Retrieval info: GEN_FILE: TYPE_NORMAL pll.ppf TRUE

View File

@ -137,4 +137,4 @@ PACKAGE rom_pack IS
x"10",x"20",x"40",x"40",x"08",x"10",x"20",x"40",x"80",x"00",x"18",x"20",x"C0",x"00",x"00",x"C0",
x"20",x"18",x"00",x"80",x"40",x"20",x"10",x"08",x"40",x"40",x"20",x"10",x"10",x"00",x"00",x"00");
END PACKAGE;
END PACKAGE;