1
0
mirror of https://github.com/Gehstock/Mist_FPGA.git synced 2026-03-09 12:05:55 +00:00

Some Work on Sg1000

This commit is contained in:
Gehstock
2018-11-09 11:36:44 +01:00
parent 393d433605
commit aac73d45c6
26 changed files with 1616 additions and 265 deletions

View File

@@ -43,7 +43,7 @@ set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files
set_global_assignment -name ORIGINAL_QUARTUS_VERSION 11.0
set_global_assignment -name PROJECT_CREATION_TIME_DATE "17:14:01 APRIL 10, 2012"
set_global_assignment -name LAST_QUARTUS_VERSION 13.1
set_global_assignment -name LAST_QUARTUS_VERSION "13.0 SP1"
set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0
set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85
set_global_assignment -name DEVICE_FILTER_PACKAGE "ANY QFP"

View File

@@ -0,0 +1 @@
WIP not Working

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

@@ -1,3 +0,0 @@
set_global_assignment -name IP_TOOL_NAME "RAM: 1-PORT"
set_global_assignment -name IP_TOOL_VERSION "13.0"
set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) "RAM2K.v"]

View File

@@ -1,177 +0,0 @@
// megafunction wizard: %RAM: 1-PORT%
// GENERATION: STANDARD
// VERSION: WM1.0
// MODULE: altsyncram
// ============================================================
// File Name: RAM2K.v
// Megafunction Name(s):
// altsyncram
//
// Simulation Library Files(s):
// altera_mf
// ============================================================
// ************************************************************
// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
//
// 13.0.1 Build 232 06/12/2013 SP 1 SJ Full Version
// ************************************************************
//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.
// synopsys translate_off
`timescale 1 ps / 1 ps
// synopsys translate_on
module RAM2K (
address,
clken,
clock,
data,
wren,
q);
input [10:0] address;
input clken;
input clock;
input [7:0] data;
input wren;
output [7:0] q;
`ifndef ALTERA_RESERVED_QIS
// synopsys translate_off
`endif
tri1 clken;
tri1 clock;
`ifndef ALTERA_RESERVED_QIS
// synopsys translate_on
`endif
wire [7:0] sub_wire0;
wire [7:0] q = sub_wire0[7:0];
altsyncram altsyncram_component (
.address_a (address),
.clock0 (clock),
.data_a (data),
.wren_a (wren),
.clocken0 (clken),
.q_a (sub_wire0),
.aclr0 (1'b0),
.aclr1 (1'b0),
.address_b (1'b1),
.addressstall_a (1'b0),
.addressstall_b (1'b0),
.byteena_a (1'b1),
.byteena_b (1'b1),
.clock1 (1'b1),
.clocken1 (1'b1),
.clocken2 (1'b1),
.clocken3 (1'b1),
.data_b (1'b1),
.eccstatus (),
.q_b (),
.rden_a (1'b1),
.rden_b (1'b1),
.wren_b (1'b0));
defparam
altsyncram_component.clock_enable_input_a = "NORMAL",
altsyncram_component.clock_enable_output_a = "NORMAL",
altsyncram_component.intended_device_family = "Cyclone III",
altsyncram_component.lpm_hint = "ENABLE_RUNTIME_MOD=NO",
altsyncram_component.lpm_type = "altsyncram",
altsyncram_component.numwords_a = 2048,
altsyncram_component.operation_mode = "SINGLE_PORT",
altsyncram_component.outdata_aclr_a = "NONE",
altsyncram_component.outdata_reg_a = "CLOCK0",
altsyncram_component.power_up_uninitialized = "FALSE",
altsyncram_component.read_during_write_mode_port_a = "NEW_DATA_NO_NBE_READ",
altsyncram_component.widthad_a = 11,
altsyncram_component.width_a = 8,
altsyncram_component.width_byteena_a = 1;
endmodule
// ============================================================
// CNX file retrieval info
// ============================================================
// Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0"
// Retrieval info: PRIVATE: AclrAddr NUMERIC "0"
// Retrieval info: PRIVATE: AclrByte NUMERIC "0"
// Retrieval info: PRIVATE: AclrData NUMERIC "0"
// Retrieval info: PRIVATE: AclrOutput NUMERIC "0"
// Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0"
// Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8"
// Retrieval info: PRIVATE: BlankMemory NUMERIC "1"
// Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "1"
// Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "1"
// Retrieval info: PRIVATE: Clken NUMERIC "1"
// Retrieval info: PRIVATE: DataBusSeparated NUMERIC "1"
// Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0"
// Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A"
// Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0"
// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III"
// Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0"
// Retrieval info: PRIVATE: JTAG_ID STRING "NONE"
// Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0"
// Retrieval info: PRIVATE: MIFfilename STRING ""
// Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "2048"
// Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0"
// Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_A NUMERIC "3"
// Retrieval info: PRIVATE: RegAddr NUMERIC "1"
// Retrieval info: PRIVATE: RegData NUMERIC "1"
// Retrieval info: PRIVATE: RegOutput NUMERIC "1"
// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0"
// Retrieval info: PRIVATE: SingleClock NUMERIC "1"
// Retrieval info: PRIVATE: UseDQRAM NUMERIC "1"
// Retrieval info: PRIVATE: WRCONTROL_ACLR_A NUMERIC "0"
// Retrieval info: PRIVATE: WidthAddr NUMERIC "11"
// Retrieval info: PRIVATE: WidthData NUMERIC "8"
// Retrieval info: PRIVATE: rden NUMERIC "0"
// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all
// Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "NORMAL"
// Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "NORMAL"
// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III"
// Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO"
// Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram"
// Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "2048"
// Retrieval info: CONSTANT: OPERATION_MODE STRING "SINGLE_PORT"
// Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE"
// Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0"
// Retrieval info: CONSTANT: POWER_UP_UNINITIALIZED STRING "FALSE"
// Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_PORT_A STRING "NEW_DATA_NO_NBE_READ"
// Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "11"
// Retrieval info: CONSTANT: WIDTH_A NUMERIC "8"
// Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1"
// Retrieval info: USED_PORT: address 0 0 11 0 INPUT NODEFVAL "address[10..0]"
// Retrieval info: USED_PORT: clken 0 0 0 0 INPUT VCC "clken"
// Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock"
// Retrieval info: USED_PORT: data 0 0 8 0 INPUT NODEFVAL "data[7..0]"
// Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]"
// Retrieval info: USED_PORT: wren 0 0 0 0 INPUT NODEFVAL "wren"
// Retrieval info: CONNECT: @address_a 0 0 11 0 address 0 0 11 0
// Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0
// Retrieval info: CONNECT: @clocken0 0 0 0 0 clken 0 0 0 0
// Retrieval info: CONNECT: @data_a 0 0 8 0 data 0 0 8 0
// Retrieval info: CONNECT: @wren_a 0 0 0 0 wren 0 0 0 0
// Retrieval info: CONNECT: q 0 0 8 0 @q_a 0 0 8 0
// Retrieval info: GEN_FILE: TYPE_NORMAL RAM2K.v TRUE
// Retrieval info: GEN_FILE: TYPE_NORMAL RAM2K.inc FALSE
// Retrieval info: GEN_FILE: TYPE_NORMAL RAM2K.cmp FALSE
// Retrieval info: GEN_FILE: TYPE_NORMAL RAM2K.bsf FALSE
// Retrieval info: GEN_FILE: TYPE_NORMAL RAM2K_inst.v FALSE
// Retrieval info: GEN_FILE: TYPE_NORMAL RAM2K_bb.v FALSE
// Retrieval info: LIB_FILE: altera_mf

View File

@@ -23,6 +23,7 @@ localparam CONF_STR =
{
"SG1000;BINSG ;",
"O23,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%;",
"O4,Video,NTSC,PAL;",
"O5,Pause,Off,On;",
"T6,Reset;",
"V,v1.0.",`BUILD_DATE
@@ -70,8 +71,8 @@ user_io (
.switches(switches),
.ps2_kbd_clk(ps2_kbd_clk),
.ps2_kbd_data(ps2_kbd_data),
.joystick_0(joystick_0[5:0]),
.joystick_1(joystick_1[5:0]),
.joystick_0(joystick_0),
.joystick_1(joystick_1),
.ioctl_ce(1'b1),
.ioctl_wr(ioctl_wr),
.ioctl_index(ioctl_index),
@@ -113,13 +114,16 @@ video_mixer (
sg1000_top sg1000_top (
.RESET_n(~(status[0] | status[6] | buttons[1])),
.sys_clk(clk_8),
.clk_vdp(clk_16),
.vdp_clk(clk_16),
.vid_clk(clk_64),
.pal(status[4]),
.pause(status[5]),
.ps2_kbd_clk(ps2_kbd_clk),
.ps2_kbd_data(ps2_kbd_data),
//.Cart_In(Cart_In),
//.Cart_Out(Cart_Out),
//.Cart_Addr(Cart_Addr),
// .Cart_In(Cart_In),
// .Cart_Out(Cart_Out),
// .Cart_Addr(Cart_Addr),
// .Cart_We(Cart_We),
.audio(audio),
.vblank(vb),
.hblank(hb),
@@ -128,25 +132,14 @@ sg1000_top sg1000_top (
.vga_r(r),
.vga_g(g),
.vga_b(b),
.Joy_A(),
.Joy_B()
// .rgb_r(r),
// .rgb_g(g),
// .rgb_b(b),
// .csync(vs),
.Joy_A(joystick_0[5:0]),
.Joy_B(joystick_1[5:0])
);
wire [7:0] Cart_Out;
wire [7:0] Cart_In;
wire [14:0] Cart_Addr;
spram #(
.init_file("roms/32.hex"),//Test
.widthad_a(15),
.width_a(8))
CART (
.address(ioctl_download ? ioctl_addr[14:0] : Cart_Addr),
.clock(clk_64),
.data(ioctl_dout),
.wren(ioctl_wr),
.q(Cart_Out)
);
//assign hs= 1'b1;
dac #(
.msbi_g(5))

View File

@@ -1,2 +1,2 @@
`define BUILD_DATE "181108"
`define BUILD_TIME "102032"
`define BUILD_DATE "181109"
`define BUILD_TIME "113105"

View File

@@ -9,24 +9,50 @@ input clk_cpu,
output CON,
input EXM2_n,
input M1_n,
input [14:0] Addr,
output [7:0] Cart_Out,
input [14:0] Cart_Addr,
input [7:0] Cart_In,
input [7:0] Cart_Ram_In,
output [7:0] Cart_Ram_Out,
input [7:0] Cart_In
output [7:0] Cart_Rom_Out,
input Cart_We
);
/*
wire [5:0]bank0;
wire [5:0]bank1;
wire [5:0]bank2;
always @(clk_cpu) begin
if (~WR_n & Addr[14:2] == "1111111111111")
case (Addr[1:0])
always @(clk_cpu, WR_n) begin
if (~WR_n & Cart_Addr[14:2] == "1111111111111")
case (Cart_Addr[1:0])
2'b01 : bank0 = Cart_In[5:0];
2'b10 : bank1 = Cart_In[5:0];
2'b11 : bank2 = Cart_In[5:0];
default : ;
endcase;
end
end*/
spram #(
.init_file("/roms/[BIOS]OthelloMultivision.hex"),
.widthad_a(14),//16k for test
.width_a(8))
ROM (
.address(Cart_Addr),
.clock(clk_cpu),
.data(Cart_In),
.wren(~WR_n),
.q(Cart_Rom_Out)
);
/*
spram #(
.init_file(""),
.widthad_a(11),//2k for test
.width_a(8))
RAM (
.address(Cart_Addr),
.clock(clk_cpu),
.data(Cart_Ram_In),
.wren(~WR_n),
.q(Cart_Ram_Out)
);*/
endmodule

View File

@@ -0,0 +1,136 @@
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
-- clk must be a 64Mhz clock
-- sync is the sync signal (0 for 0V, 1 for 0.3V)
-- line_visible is 1 for lines that are displayed (only sync when 0)
-- line_even should be toggled every line
-- color: 222 RGB (b1b0g1g0r1r0)
-- output: 6 bit linear output, "000000" is 0v, "111111" is 1.3V (step is 0.02V)
entity color_encoder is
Port (
clk: in STD_LOGIC;
pal: in STD_LOGIC;
sync: in STD_LOGIC;
line_visible: in STD_LOGIC;
line_even: in STD_LOGIC;
color: in STD_LOGIC_VECTOR (5 downto 0);
outputs: out STD_LOGIC_VECTOR (5 downto 0));
end color_encoder;
architecture Behavioral of color_encoder is
component yuv_table
port (color : in std_logic_vector(5 downto 0);
y : out std_logic_vector(5 downto 0);
u : out std_logic_vector(5 downto 0);
v : out std_logic_vector(5 downto 0));
end component;
signal counter : integer range 0 to 4096;
signal phase : unsigned (20 downto 0) := (others=>'0');
signal y1: std_logic_vector (5 downto 0);
signal u1: std_logic_vector (5 downto 0);
signal v1: std_logic_vector (5 downto 0);
signal y : unsigned (5 downto 0);
signal u : unsigned (5 downto 0);
signal v : unsigned (5 downto 0);
signal uv : unsigned (5 downto 0);
begin
yuv_table_inst : yuv_table
port map (
color => color,
y => y1,
u => u1,
v => v1);
process (clk, sync, line_visible)
begin
if rising_edge(clk) then
if sync='0' then
counter <= 0;
--phase <= (others=>'0');
else
if line_visible='1' then
counter <= counter+1;
end if;
end if;
if pal='1' then
phase <= phase+145281;
else
phase <= phase+117295;
end if;
end if;
end process;
process (clk,counter,color)
--variable yuv : unsigned(17 downto 0);
begin
if rising_edge(clk) then
-- color burst
if counter>=2*29 and counter<2*(29+72) then
-- black
y <= "000000";
-- reference phase
if pal='1' then
u <= "111100";
v <= "000100";
else
u <= "111000";
v <= "000000";
end if;
-- visible pixels
elsif counter>=2*(29+72+85) and counter<2*(29+72+85+1664) then
--yuv := yuv_table(to_integer(unsigned(color)));
y <= unsigned(y1);
u <= unsigned(u1);
v <= unsigned(v1);
-- front porch, sync and back porch
else
y <= (others=>'0');
u <= (others=>'0');
v <= (others=>'0');
end if;
end if;
end process;
process (phase, line_even, u, v)
begin
if pal='1' then
case line_even&phase(20 downto 19) is
when "000" => uv <= u;
when "001" => uv <= v;
when "010" => uv <= 0-u;
when "011" => uv <= 0-v;
when "100" => uv <= u;
when "101" => uv <= 0-v;
when "110" => uv <= 0-u;
when "111" => uv <= v;
when others => uv <= (others=>'0');
end case;
else
case phase(20 downto 19) is
when "00" => uv <= u;
when "01" => uv <= 0-v;
when "10" => uv <= 0-u;
when "11" => uv <= v;
when others => uv <= (others=>'0');
end case;
end if;
end process;
process (clk,sync,y,uv)
begin
if rising_edge(clk) then
outputs <= std_logic_vector(("0"&sync&"0000")+y+uv);
end if;
end process;
end Behavioral;

View File

@@ -1,17 +0,0 @@
CLOCK_ENABLE_INPUT_A=NORMAL
CLOCK_ENABLE_OUTPUT_A=NORMAL
INTENDED_DEVICE_FAMILY="Cyclone III"
NUMWORDS_A=2048
OPERATION_MODE=SINGLE_PORT
OUTDATA_ACLR_A=NONE
OUTDATA_REG_A=CLOCK0
POWER_UP_UNINITIALIZED=FALSE
READ_DURING_WRITE_MODE_PORT_A=NEW_DATA_NO_NBE_READ
WIDTHAD_A=11
WIDTH_A=8
WIDTH_BYTEENA_A=1
DEVICE_FAMILY="Cyclone III"
address_a
clock0
clocken0
q_a

View File

@@ -5,6 +5,7 @@ use IEEE.NUMERIC_STD.ALL;
entity psg is
port (clk : in STD_LOGIC;
WR_n : in STD_LOGIC;
CS_n : in STD_LOGIC;
D_in : in STD_LOGIC_VECTOR (7 downto 0);
outputs: out STD_LOGIC_VECTOR (5 downto 0)
);
@@ -91,9 +92,9 @@ begin
end process;
clk32 <= std_logic(clk_divide(5));
process (clk, WR_n)
process (clk, WR_n, CS_n)
begin
if rising_edge(clk) and WR_n='0' then
if rising_edge(clk) and WR_n='0' and CS_n='0' then
if D_in(7)='1' then
case D_in(6 downto 4) is
when "000" => tone0(3 downto 0) <= D_in(3 downto 0);

File diff suppressed because it is too large Load Diff

View File

@@ -1,13 +1,15 @@
module sg1000_top(
input RESET_n,
input sys_clk,//8
input clk_vdp,//16
input vdp_clk,//16
input vid_clk,//64
input pal,
input pause,
input ps2_kbd_clk,
input ps2_kbd_data,
//input [7:0] Cart_Out,
//output [7:0] Cart_In,
//output [14:0] Cart_Addr,
input [7:0] Cart_In,
output [14:0] Cart_Addr,
output Cart_We,
output [5:0] audio,
output vblank,
output hblank,
@@ -16,6 +18,10 @@ output vga_vs,
output [1:0] vga_r,
output [1:0] vga_g,
output [1:0] vga_b,
output [1:0] rgb_r,
output [1:0] rgb_g,
output [1:0] rgb_b,
output csync,
input [5:0] Joy_A,
input [5:0] Joy_B
);
@@ -61,7 +67,7 @@ CPU (
);
wire [7:0]RAM_D_out;
/*
spram #(
.widthad_a(11),//2k
.width_a(8))
@@ -71,20 +77,12 @@ MRAM (
.data(D_out),
.wren(~WR_n),
.q(RAM_D_out)
);*/
RAM2K RAM2K(
.address(Addr[10:0]),
.clock(sys_clk),
.clken(~CS_WRAM_n),
.data(D_out),
.wren(~WR_n),
.q(RAM_D_out)
);
wire CS_PSG_n = (~IORQ_n) & (Addr[7:6] == "01") ? 1'b0 : 1'b1;
psg PSG (
.clk(sys_clk),
.CS_n(CS_PSG_n),
.WR_n(WR_n),
.D_in(D_out),
.outputs(audio)
@@ -94,12 +92,12 @@ wire [7:0]vdp_D_out;
wire [8:0]x;
wire [7:0]y;
wire [5:0] color;
wire VDP_RD_n = (~IORQ_n & Addr[7:6] == "10") | RD_n ? 1'b0 : 1'b1;
wire VDP_WR_n = (~IORQ_n & Addr[7:6] == "10") | WR_n ? 1'b0 : 1'b1;
wire VDP_RD_n = (~IORQ_n) & (Addr[7:6] == "10") | RD_n ? 1'b0 : 1'b1;
wire VDP_WR_n = (~IORQ_n) & (Addr[7:6] == "10") | WR_n ? 1'b0 : 1'b1;
vdp vdp (
.cpu_clk(sys_clk),
.vdp_clk(clk_vdp),
.vdp_clk(vdp_clk),
.RD_n(VDP_RD_n),
.WR_n(VDP_WR_n),
.IRQ_n(IORQ_n),
@@ -112,9 +110,9 @@ vdp vdp (
.hblank(hblank),
.color(color)
);
vga_video vga_video (
.clk16(clk_vdp),
.clk16(vdp_clk),
.x(x),
.y(y),
.vblank(vblank),
@@ -126,9 +124,23 @@ vga_video vga_video (
.green(vga_g),
.blue(vga_b)
);
/*
tv_video tv_video (
.clk8(sys_clk),
.clk64(vid_clk),
.pal(pal),
.x(x),
.y(y),
.vblank(vblank),
.hblank(hblank),
.csync(csync),
.color(color),
.video({rgb_b,rgb_g,rgb_r})
);*/
wire [7:0]Joy_Out;
wire JOY_SEL_n = (~IORQ_n & Addr[7:6] == "11") | RD_n ? 1'b0 : 1'b1;
wire JOY_SEL_n = (~IORQ_n) & (Addr[7:6] == "11") | RD_n ? 1'b0 : 1'b1;
wire CON;
TTL74_257 IC18(
.GN(JOY_SEL_n),
@@ -164,7 +176,7 @@ TTL74_257 IC21(
.Y1(Joy_Out[4])
);
wire KB_SEL_n = (~IORQ_n & Addr[7:6] == "11") ? 1'b0 : 1'b1;
wire KB_SEL_n = (~IORQ_n) & (Addr[7:6] == "11") ? 1'b0 : 1'b1;
wire [7:0]Kb_Out;
keyboard keyboard(
@@ -180,9 +192,9 @@ keyboard keyboard(
.ps2_kbd_data(ps2_kbd_data)
);
wire EXM1_n = (~MREQ_n & Addr[15:14] == "10") ? 1'b0 : 1'b1;
wire EXM2_n = (~MREQ_n | Addr[15]) ? 1'b0 : 1'b1;
wire [7:0]Cart_Out;
wire EXM1_n = (~MREQ_n) & (Addr[15:14] == "10") ? 1'b0 : 1'b1;
wire EXM2_n = (~MREQ_n) | (Addr[15]) ? 1'b0 : 1'b1;
wire [7:0]Cart_Rom_Out, Cart_Ram_Out;
cart cart(
.DSRAM_n(DSRAM_n),
@@ -194,17 +206,18 @@ cart cart(
.CON(CON),
.EXM2_n(EXM2_n),
.M1_n,
.Addr(Addr[14:0]),
.Cart_Out(Cart_Out),
.Cart_Addr(Addr[14:0]),
.Cart_Rom_Out(Cart_Rom_Out),
.Cart_Ram_Out(Cart_Ram_Out),
.Cart_In(D_out)
.Cart_In(Cart_In),
.Cart_We(Cart_We)
);
//todo
always @(sys_clk) begin
D_in <= ~CS_WRAM_n ? RAM_D_out :
D_in = ~CS_WRAM_n ? RAM_D_out :
~VDP_RD_n ? vdp_D_out :
~EXM1_n ? Cart_Out :
~EXM1_n ? Cart_Rom_Out :
~EXM2_n ? Cart_Ram_Out :
~JOY_SEL_n ? Joy_Out :
~KB_SEL_n ? Kb_Out :

View File

@@ -0,0 +1,121 @@
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity tv_video is
Port (
clk8: in STD_LOGIC;
clk64: in STD_LOGIC;
pal: in STD_LOGIC;
x: out unsigned(8 downto 0);
y: out unsigned(7 downto 0);
vblank: out STD_LOGIC;
hblank: out STD_LOGIC;
color: in STD_LOGIC_VECTOR(5 downto 0);
csync: out STD_LOGIC;
video: out STD_LOGIC_VECTOR(6 downto 1));
end tv_video;
architecture Behavioral of tv_video is
component color_encoder is
Port (
clk: in STD_LOGIC;
pal: in STD_LOGIC;
sync: in STD_LOGIC;
line_visible: in STD_LOGIC;
line_even: in STD_LOGIC;
color: in STD_LOGIC_VECTOR (5 downto 0);
outputs: out STD_LOGIC_VECTOR (5 downto 0));
end component;
signal hcount: unsigned(8 downto 0) := (others => '0');
signal vcount: unsigned(8 downto 0) := (others => '0');
signal y9: unsigned(8 downto 0);
signal in_vbl: std_logic;
signal screen_sync: std_logic;
signal vbl_sync: std_logic;
signal sync: std_logic;
signal line_visible: std_logic;
signal line_even: std_logic;
begin
csync <= sync;
process (clk8)
begin
if rising_edge(clk8) then
if hcount=507 then
hcount <= (others => '0');
if vcount=261 then
vcount <= (others=>'0');
else
vcount <= vcount + 1;
end if;
else
hcount <= hcount + 1;
end if;
end if;
end process;
process (hcount)
begin
if hcount<38 then
screen_sync <= '0';
else
screen_sync <= '1';
end if;
end process;
in_vbl <= '1' when vcount<9 else '0';
x <= hcount-166;
y9 <= vcount-40;
y <= y9(7 downto 0);
vblank <= '1' when hcount=0 and vcount=0 else '0';
hblank <= '1' when hcount=0 else '0';
line_visible <= not in_vbl;
line_even <= not vcount(0);
process (vcount,hcount)
begin
if vcount<3 or (vcount>=6 and vcount<9) then
-- _^^^^^_^^^^^ : low pulse = 2.35us
if hcount<19 or (hcount>=254 and hcount<254+19) then
vbl_sync <= '0';
else
vbl_sync <= '1';
end if;
else
-- ____^^ : high pulse = 4.7us
if hcount<(254-38) or (hcount>=254 and hcount<508-38) then
vbl_sync <= '0';
else
vbl_sync <= '1';
end if;
end if;
end process;
process (in_vbl,screen_sync,vbl_sync)
begin
if in_vbl='1' then
sync <= vbl_sync;
else
sync <= screen_sync;
end if;
end process;
encode_inst: color_encoder
port map (
clk => clk64,
pal => pal,
sync => sync,
line_visible => line_visible,
line_even => line_even,
color => color,
outputs => video);
end Behavioral;

View File

@@ -0,0 +1,229 @@
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity yuv_table is
Port (color : in std_logic_vector (5 downto 0);
y : out std_logic_vector (5 downto 0);
u : out std_logic_vector (5 downto 0);
v : out std_logic_vector (5 downto 0));
end yuv_table;
architecture Behavioral of yuv_table is
begin
process (color)
begin
case color is
when "000000" => y <= "000000";
when "000001" => y <= "000011";
when "000010" => y <= "000110";
when "000011" => y <= "001001";
when "000100" => y <= "000110";
when "000101" => y <= "001001";
when "000110" => y <= "001100";
when "000111" => y <= "001111";
when "001000" => y <= "001100";
when "001001" => y <= "001111";
when "001010" => y <= "010010";
when "001011" => y <= "010101";
when "001100" => y <= "010010";
when "001101" => y <= "010101";
when "001110" => y <= "011000";
when "001111" => y <= "011011";
when "010000" => y <= "000001";
when "010001" => y <= "000100";
when "010010" => y <= "000111";
when "010011" => y <= "001010";
when "010100" => y <= "000111";
when "010101" => y <= "001010";
when "010110" => y <= "001101";
when "010111" => y <= "010000";
when "011000" => y <= "001101";
when "011001" => y <= "010000";
when "011010" => y <= "010011";
when "011011" => y <= "010110";
when "011100" => y <= "010011";
when "011101" => y <= "010110";
when "011110" => y <= "011001";
when "011111" => y <= "011100";
when "100000" => y <= "000010";
when "100001" => y <= "000101";
when "100010" => y <= "001000";
when "100011" => y <= "001011";
when "100100" => y <= "001000";
when "100101" => y <= "001011";
when "100110" => y <= "001110";
when "100111" => y <= "010001";
when "101000" => y <= "001110";
when "101001" => y <= "010001";
when "101010" => y <= "010100";
when "101011" => y <= "010111";
when "101100" => y <= "010100";
when "101101" => y <= "010111";
when "101110" => y <= "011010";
when "101111" => y <= "011101";
when "110000" => y <= "000011";
when "110001" => y <= "000110";
when "110010" => y <= "001001";
when "110011" => y <= "001100";
when "110100" => y <= "001001";
when "110101" => y <= "001100";
when "110110" => y <= "001111";
when "110111" => y <= "010010";
when "111000" => y <= "001111";
when "111001" => y <= "010010";
when "111010" => y <= "010101";
when "111011" => y <= "011000";
when "111100" => y <= "010101";
when "111101" => y <= "011000";
when "111110" => y <= "011011";
when "111111" => y <= "011110";
when others =>
end case;
end process;
process (color)
begin
case color is
when "000000" => u <= "000000";
when "000001" => u <= "111111";
when "000010" => u <= "111101";
when "000011" => u <= "111100";
when "000100" => u <= "111101";
when "000101" => u <= "111100";
when "000110" => u <= "111010";
when "000111" => u <= "111001";
when "001000" => u <= "111010";
when "001001" => u <= "111001";
when "001010" => u <= "110111";
when "001011" => u <= "110110";
when "001100" => u <= "110111";
when "001101" => u <= "110110";
when "001110" => u <= "110100";
when "001111" => u <= "110011";
when "010000" => u <= "000100";
when "010001" => u <= "000011";
when "010010" => u <= "000001";
when "010011" => u <= "000000";
when "010100" => u <= "000001";
when "010101" => u <= "000000";
when "010110" => u <= "111111";
when "010111" => u <= "111101";
when "011000" => u <= "111111";
when "011001" => u <= "111101";
when "011010" => u <= "111100";
when "011011" => u <= "111010";
when "011100" => u <= "111100";
when "011101" => u <= "111010";
when "011110" => u <= "111001";
when "011111" => u <= "110111";
when "100000" => u <= "001001";
when "100001" => u <= "000111";
when "100010" => u <= "000110";
when "100011" => u <= "000100";
when "100100" => u <= "000110";
when "100101" => u <= "000100";
when "100110" => u <= "000011";
when "100111" => u <= "000001";
when "101000" => u <= "000011";
when "101001" => u <= "000001";
when "101010" => u <= "000000";
when "101011" => u <= "111111";
when "101100" => u <= "000000";
when "101101" => u <= "111111";
when "101110" => u <= "111101";
when "101111" => u <= "111100";
when "110000" => u <= "001101";
when "110001" => u <= "001100";
when "110010" => u <= "001010";
when "110011" => u <= "001001";
when "110100" => u <= "001010";
when "110101" => u <= "001001";
when "110110" => u <= "000111";
when "110111" => u <= "000110";
when "111000" => u <= "000111";
when "111001" => u <= "000110";
when "111010" => u <= "000100";
when "111011" => u <= "000011";
when "111100" => u <= "000100";
when "111101" => u <= "000011";
when "111110" => u <= "000001";
when "111111" => u <= "000000";
when others =>
end case;
end process;
process (color)
begin
case color is
when "000000" => v <= "000000";
when "000001" => v <= "000110";
when "000010" => v <= "001100";
when "000011" => v <= "010010";
when "000100" => v <= "111011";
when "000101" => v <= "000001";
when "000110" => v <= "000111";
when "000111" => v <= "001101";
when "001000" => v <= "110110";
when "001001" => v <= "111100";
when "001010" => v <= "000010";
when "001011" => v <= "001000";
when "001100" => v <= "110001";
when "001101" => v <= "110111";
when "001110" => v <= "111101";
when "001111" => v <= "000011";
when "010000" => v <= "111111";
when "010001" => v <= "000101";
when "010010" => v <= "001011";
when "010011" => v <= "010001";
when "010100" => v <= "111010";
when "010101" => v <= "000000";
when "010110" => v <= "000110";
when "010111" => v <= "001100";
when "011000" => v <= "110101";
when "011001" => v <= "111011";
when "011010" => v <= "000001";
when "011011" => v <= "000111";
when "011100" => v <= "110000";
when "011101" => v <= "110110";
when "011110" => v <= "111100";
when "011111" => v <= "000010";
when "100000" => v <= "111110";
when "100001" => v <= "000100";
when "100010" => v <= "001010";
when "100011" => v <= "010000";
when "100100" => v <= "111001";
when "100101" => v <= "111111";
when "100110" => v <= "000101";
when "100111" => v <= "001011";
when "101000" => v <= "110100";
when "101001" => v <= "111010";
when "101010" => v <= "000000";
when "101011" => v <= "000110";
when "101100" => v <= "101111";
when "101101" => v <= "110101";
when "101110" => v <= "111011";
when "101111" => v <= "000001";
when "110000" => v <= "111101";
when "110001" => v <= "000011";
when "110010" => v <= "001001";
when "110011" => v <= "001111";
when "110100" => v <= "111000";
when "110101" => v <= "111110";
when "110110" => v <= "000100";
when "110111" => v <= "001010";
when "111000" => v <= "110011";
when "111001" => v <= "111001";
when "111010" => v <= "111111";
when "111011" => v <= "000101";
when "111100" => v <= "101110";
when "111101" => v <= "110100";
when "111110" => v <= "111010";
when "111111" => v <= "000000";
when others =>
end case;
end process;
end Behavioral;

View File

@@ -166,8 +166,10 @@ set_global_assignment -name VHDL_FILE rtl/t80/T80.vhd
set_global_assignment -name VERILOG_FILE rtl/TTL74_257.v
set_global_assignment -name SYSTEMVERILOG_FILE rtl/keyboard.sv
set_global_assignment -name SYSTEMVERILOG_FILE rtl/cart.sv
set_global_assignment -name VHDL_FILE rtl/tv_video.vhd
set_global_assignment -name VHDL_FILE rtl/color_encoder.vhd
set_global_assignment -name VHDL_FILE rtl/yuv_table.vhd
set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top
set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top
set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top
set_global_assignment -name QIP_FILE rtl/RAM2K.qip
set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top

View File

@@ -5,3 +5,4 @@
{ "" "" "" "Net \"Cart_ram_Out\" at sg1000_top.sv(25) has no driver or initial value, using a default initial value '0'" { } { } 0 10030 "" 0 0 "Quartus II" 0 -1 0 ""}
{ "" "" "" "VHDL Process Statement warning at vdp_main.vhd(117): signal \"mask_column0\" is read inside the Process Statement but isn't in the Process Statement's sensitivity list" { } { } 0 10492 "" 0 0 "Quartus II" 0 -1 0 ""}
{ "" "" "" "*" { } { } 0 14284 "" 0 0 "Quartus II" 0 -1 0 ""}
{ "" "" "" "*" { } { } 0 10235 "" 0 0 "Quartus II" 0 -1 0 ""}