Revision 331
Added by markw over 10 years ago
| papilioduo/atari800core_papilioduo.vhd | ||
|---|---|---|
|
ENTITY atari800core_papilioduo IS
|
||
|
GENERIC
|
||
|
(
|
||
|
TV : integer := 1; -- 1 = PAL, 0=NTSC
|
||
|
SCANDOUBLE : integer := 0; -- 1 = YES, 0=NO, (+ later scanlines etc)
|
||
|
TV : integer; -- 1 = PAL, 0=NTSC
|
||
|
VIDEO : integer; -- 1 = RGB, 2 = VGA
|
||
|
COMPOSITE_SYNC : integer; --0 = no, 1 = yes!
|
||
|
SCANDOUBLE : integer; -- 1 = YES, 0=NO, (+ later scanlines etc)
|
||
|
internal_rom : integer := 1 ;
|
||
|
--internal_ram : integer := 16384;
|
||
|
internal_ram : integer := 0;
|
||
| ... | ... | |
|
-- scandoubler
|
||
|
signal half_scandouble_enable_reg : std_logic;
|
||
|
signal half_scandouble_enable_next : std_logic;
|
||
|
signal scanlines_reg : std_logic;
|
||
|
signal scanlines_next : std_logic;
|
||
|
SIGNAL COMPOSITE_ON_HSYNC : std_logic;
|
||
|
SIGNAL VGA : std_logic;
|
||
|
|
||
|
function palette_from_scandouble( scandouble : integer ) return integer is
|
||
|
begin
|
||
|
if (scandouble = 1) then
|
||
|
return 0;
|
||
|
else
|
||
|
return 1;
|
||
|
end if;
|
||
|
end palette_from_scandouble;
|
||
|
|
||
|
-- dma/virtual drive
|
||
|
signal DMA_ADDR_FETCH : std_logic_vector(23 downto 0);
|
||
|
signal DMA_WRITE_DATA : std_logic_vector(31 downto 0);
|
||
| ... | ... | |
|
internal_rom => internal_rom,
|
||
|
internal_ram => internal_ram,
|
||
|
video_bits => 8,
|
||
|
palette => palette_from_scandouble(scandouble),
|
||
|
palette => 0,
|
||
|
low_memory => 2,
|
||
|
STEREO => 0,
|
||
|
COVOX => 0
|
||
| ... | ... | |
|
);
|
||
|
|
||
|
-- Video options
|
||
|
gen_scandouble_off: if scandouble=0 generate
|
||
|
VGA_HSYNC <= not(VIDEO_HS xor VIDEO_VS);
|
||
|
VGA_VSYNC <= not(VIDEO_VS);
|
||
|
VGA_BLUE <= VIDEO_B(7 downto 4);
|
||
|
VGA_GREEN <= VIDEO_G(7 downto 4);
|
||
|
VGA_RED <= VIDEO_R(7 downto 4);
|
||
|
end generate;
|
||
|
pal <= '1' when tv=1 else '0';
|
||
|
vga <= '1' when video=2 else '0';
|
||
|
composite_on_hsync <= '1' when composite_sync=1 else '0';
|
||
|
|
||
|
gen_scandouble_on: if scandouble=1 generate
|
||
|
process(clk,reset_n)
|
||
|
begin
|
||
|
if (reset_n='0') then
|
||
|
half_scandouble_enable_reg <= '0';
|
||
|
elsif (clk'event and clk='1') then
|
||
|
half_scandouble_enable_reg <= half_scandouble_enable_next;
|
||
|
end if;
|
||
|
end process;
|
||
|
process(clk,RESET_N,reset_atari)
|
||
|
begin
|
||
|
if ((RESET_N and not(reset_atari))='0') then
|
||
|
half_scandouble_enable_reg <= '0';
|
||
|
scanlines_reg <= '0';
|
||
|
elsif (clk'event and clk='1') then
|
||
|
half_scandouble_enable_reg <= half_scandouble_enable_next;
|
||
|
scanlines_reg <= scanlines_next;
|
||
|
end if;
|
||
|
end process;
|
||
|
|
||
|
half_scandouble_enable_next <= not(half_scandouble_enable_reg);
|
||
|
half_scandouble_enable_next <= not(half_scandouble_enable_reg);
|
||
|
scanlines_next <= scanlines_reg xor (not(ps2_keys(16#11#)) and ps2_keys_next(16#11#)); -- left alt
|
||
|
|
||
|
scandoubler1: entity work.scandoubler
|
||
|
PORT MAP
|
||
|
(
|
||
|
CLK => CLK,
|
||
|
RESET_N => reset_n,
|
||
|
|
||
|
VGA => '1',
|
||
|
COMPOSITE_ON_HSYNC => '1', -- TODO
|
||
|
scandoubler1: entity work.scandoubler
|
||
|
PORT MAP
|
||
|
(
|
||
|
CLK => CLK,
|
||
|
RESET_N => reset_n,
|
||
|
|
||
|
VGA => vga,
|
||
|
COMPOSITE_ON_HSYNC => composite_on_hsync,
|
||
|
|
||
|
colour_enable => half_scandouble_enable_reg,
|
||
|
doubled_enable => '1',
|
||
|
|
||
|
-- GTIA interface
|
||
|
pal => PAL,
|
||
|
colour_in => VIDEO_B,
|
||
|
vsync_in => VIDEO_VS,
|
||
|
hsync_in => VIDEO_HS,
|
||
|
|
||
|
-- TO TV...
|
||
|
R => VGA_RED,
|
||
|
G => VGA_GREEN,
|
||
|
B => VGA_BLUE,
|
||
|
|
||
|
VSYNC => VGA_VSYNC,
|
||
|
HSYNC => VGA_HSYNC
|
||
|
);
|
||
|
end generate;
|
||
|
colour_enable => half_scandouble_enable_reg,
|
||
|
doubled_enable => '1',
|
||
|
scanlines_on => scanlines_reg,
|
||
|
|
||
|
-- GTIA interface
|
||
|
pal => PAL,
|
||
|
colour_in => VIDEO_B,
|
||
|
vsync_in => VIDEO_VS,
|
||
|
hsync_in => VIDEO_HS,
|
||
|
|
||
|
-- TO TV...
|
||
|
R => VGA_RED,
|
||
|
G => VGA_GREEN,
|
||
|
B => VGA_BLUE,
|
||
|
|
||
|
VSYNC => VGA_VSYNC,
|
||
|
HSYNC => VGA_HSYNC
|
||
|
);
|
||
|
|
||
|
zpu: entity work.zpucore
|
||
|
GENERIC MAP
|
||
|
(
|
||
|
platform => 1,
|
||
|
spi_clock_div => 1, -- 28MHz/2. Max for SD cards is 25MHz...
|
||
|
spi_clock_div => 2, -- 28MHz/2. Max for SD cards is 25MHz...
|
||
|
usb => 0
|
||
|
)
|
||
|
PORT MAP
|
||
| papilioduo/build.pl | ||
|---|---|---|
|
#!/usr/bin/perl -w
|
||
|
use strict;
|
||
|
|
||
|
my $wanted_variant = shift @ARGV;
|
||
|
|
||
|
my $name="papilioduo";
|
||
|
|
||
|
#variants...
|
||
|
my $PAL = 1;
|
||
|
my $NTSC = 0;
|
||
|
|
||
|
my $RGB = 1; # i.e. not scandoubled
|
||
|
my $VGA = 2;
|
||
|
|
||
|
#Added like this to the generated qsf
|
||
|
#set_parameter -name TV 1
|
||
|
|
||
|
my %variants =
|
||
|
(
|
||
|
"PAL_RGB" =>
|
||
|
{
|
||
|
"TV" => $PAL,
|
||
|
"SCANDOUBLE" => 0,
|
||
|
"VIDEO" => $RGB,
|
||
|
"COMPOSITE_SYNC" => 1
|
||
|
},
|
||
|
"PAL_RGBHV" =>
|
||
|
{
|
||
|
"TV" => $PAL,
|
||
|
"SCANDOUBLE" => 0,
|
||
|
"VIDEO" => $RGB,
|
||
|
"COMPOSITE_SYNC" => 0
|
||
|
},
|
||
|
"PAL_VGA" =>
|
||
|
{
|
||
|
"TV" => $PAL,
|
||
|
"SCANDOUBLE" => 1,
|
||
|
"VIDEO" => $VGA,
|
||
|
"COMPOSITE_SYNC" => 0
|
||
|
},
|
||
|
"PAL_VGA_CS" =>
|
||
|
{
|
||
|
"TV" => $PAL,
|
||
|
"SCANDOUBLE" => 1,
|
||
|
"VIDEO" => $VGA,
|
||
|
"COMPOSITE_SYNC" => 1
|
||
|
},
|
||
|
"NTSC_RGB" =>
|
||
|
{
|
||
|
"TV" => $NTSC,
|
||
|
"SCANDOUBLE" => 0,
|
||
|
"VIDEO" => $RGB,
|
||
|
"COMPOSITE_SYNC" => 1
|
||
|
},
|
||
|
"NTSC_RGBHV" =>
|
||
|
{
|
||
|
"TV" => $NTSC,
|
||
|
"SCANDOUBLE" => 0,
|
||
|
"VIDEO" => $RGB,
|
||
|
"COMPOSITE_SYNC" => 0
|
||
|
},
|
||
|
"NTSC_VGA" =>
|
||
|
{
|
||
|
"TV" => $NTSC,
|
||
|
"SCANDOUBLE" => 1,
|
||
|
"VIDEO" => $VGA,
|
||
|
"COMPOSITE_SYNC" => 0
|
||
|
},
|
||
|
"NTSC_VGA_CS" =>
|
||
|
{
|
||
|
"TV" => $NTSC,
|
||
|
"SCANDOUBLE" => 1,
|
||
|
"VIDEO" => $VGA,
|
||
|
"COMPOSITE_SYNC" => 1
|
||
|
}
|
||
|
);
|
||
|
|
||
|
if (not defined $wanted_variant or (not exists $variants{$wanted_variant} and $wanted_variant ne "ALL"))
|
||
|
{
|
||
|
die "Provide variant of ALL or ".join ",",sort keys %variants;
|
||
|
}
|
||
|
|
||
|
foreach my $variant (sort keys %variants)
|
||
|
{
|
||
|
next if ($wanted_variant ne $variant and $wanted_variant ne "ALL");
|
||
|
print "Building $variant of $name\n";
|
||
|
|
||
|
my $dir = "build_$variant";
|
||
|
`rm -rf $dir`;
|
||
|
mkdir $dir;
|
||
|
chdir $dir;
|
||
|
|
||
|
`cp -p ../pll/* .`;
|
||
|
`cp -p ../../common/a8core/*.vhd .`;
|
||
|
`cp -p ../../common/a8core/*.vhdl .`;
|
||
|
`cp -p ../../common/components/*.vhd .`;
|
||
|
`cp -p ../../common/components/*.vhdl .`;
|
||
|
`cp -p ../../common/zpu/*.vhd .`;
|
||
|
`cp -p ../../common/zpu/*.vhdl .`;
|
||
|
`cp -p ../*.vhd .`;
|
||
|
`cp -p ../*.vhdl .`;
|
||
|
|
||
|
`cp -p ../$name.ucf .`;
|
||
|
`cp -p ../$name.ut .`;
|
||
|
`cp -p ../$name.prj .`;
|
||
|
|
||
|
`mkdir -p xst/projnav.tmp/`;
|
||
|
|
||
|
`cp -p ../*.xst .`;
|
||
|
# TODO make project file `../makexst ../atari800core.qsf ./common/a8core ./common/components ./common/zpu`;
|
||
|
my $generics = "-generics {";
|
||
|
foreach my $key (sort keys %{$variants{$variant}})
|
||
|
{
|
||
|
my $val = $variants{$variant}->{$key};
|
||
|
$generics.="$key=$val ";
|
||
|
}
|
||
|
$generics .= "}\n";
|
||
|
`echo '$generics' >> $name.xst`;
|
||
|
|
||
|
`echo "Starting Synthesis" >> build.log 2>>build.err`;
|
||
|
`xst -intstyle ise -ifn $name.xst -ofn $name.syr >> build.log 2>>build.err`;
|
||
|
|
||
|
`echo "Starting NGD" >> build.log 2>>build.err`;
|
||
|
`ngdbuild -intstyle ise -uc $name.ucf -dd _ngo -nt timestamp -p xc6slx9-tqg144-3 $name.ngc $name.ngd >> build.log 2>>build.err`;
|
||
|
|
||
|
`echo "Starting Map..." >> build.log 2>>build.err`;
|
||
|
`map -intstyle ise -p xc6slx9-tqg144-3 -w -logic_opt off -ol high -t 1 -xt 0 -register_duplication off -r 4 -global_opt off -mt off -detail -ir off -pr off -lc off -power off -o ${name}_map.ncd $name.ngd $name.pcf >> build.log 2>>build.err`;
|
||
|
|
||
|
`echo "Starting Place & Route..." >> build.log 2>>build.err`;
|
||
|
`par -w -intstyle ise -ol high -mt off ${name}_map.ncd $name.ncd $name.pcf >> build.log 2>>build.err`;
|
||
|
|
||
|
`echo "Starting Timing Analysis..." >> build.log 2>>build.err`;
|
||
|
`trce -intstyle ise -v 3 -s 3 -n 3 -fastpaths -xml $name.twx $name.ncd -o $name.twr $name.pcf >> build.log 2>>build.err`;
|
||
|
|
||
|
`echo "Starting Bitgen..." >> build.log 2>>build.err`;
|
||
|
`bitgen -intstyle ise -f $name.ut $name.ncd >> build.log 2>>build.err`;
|
||
|
|
||
|
|
||
|
chdir "..";
|
||
|
}
|
||
|
|
||
| papilioduo/build.sh | ||
|---|---|---|
|
#!/bin/bash
|
||
|
|
||
|
name=papilioduo
|
||
|
args=$@
|
||
|
shift
|
||
|
|
||
|
. /home/markw/fpga/xilinx/14.7/ISE_DS/settings64.sh
|
||
|
|
||
|
mkdir -p build
|
||
|
pushd build
|
||
|
export XILINX_DSP
|
||
|
export LD_LIBRARY_PATH
|
||
|
export XILINX_EDK
|
||
|
export PATH
|
||
|
export XILINX_PLANAHEAD
|
||
|
export XILINX
|
||
|
|
||
|
# copy source files
|
||
|
cp -p ../pll/* .
|
||
|
cp -p ../../common/a8core/*.vhd .
|
||
|
cp -p ../../common/a8core/*.vhdl .
|
||
|
cp -p ../../common/components/*.vhd .
|
||
|
cp -p ../../common/components/*.vhdl .
|
||
|
cp -p ../../common/zpu/*.vhd .
|
||
|
cp -p ../../common/zpu/*.vhdl .
|
||
|
#rm -f delay_line.vhdl
|
||
|
cp -p ../*.vhd .
|
||
|
cp -p ../*.vhdl .
|
||
|
cp -p ../*.xst .
|
||
|
which xst
|
||
|
|
||
|
cp -p ../$name.ucf .
|
||
|
cp -p ../$name.ut .
|
||
|
cp -p ../$name.prj .
|
||
|
./build.pl ${args}
|
||
|
|
||
|
mkdir -p xst/projnav.tmp/
|
||
|
|
||
|
echo "Starting Synthesis"
|
||
|
xst -intstyle ise -ifn $name.xst -ofn $name.syr
|
||
|
|
||
|
echo "Starting NGD"
|
||
|
ngdbuild -intstyle ise -uc $name.ucf -dd _ngo -nt timestamp -p xc6slx9-tqg144-3 $name.ngc $name.ngd
|
||
|
|
||
|
echo "Starting Map..."
|
||
|
map -intstyle ise -p xc6slx9-tqg144-3 -w -logic_opt off -ol high -t 1 -xt 0 -register_duplication off -r 4 -global_opt off -mt off -detail -ir off -pr off -lc off -power off -o $name_map.ncd $name.ngd $name.pcf
|
||
|
|
||
|
echo "Starting Place & Route..."
|
||
|
par -w -intstyle ise -ol high -mt off $name_map.ncd $name.ncd $name.pcf
|
||
|
|
||
|
echo "Starting Timing Analysis..."
|
||
|
trce -intstyle ise -v 3 -s 3 -n 3 -fastpaths -xml $name.twx $name.ncd -o $name.twr $name.pcf
|
||
|
|
||
|
echo "Starting Bitgen..."
|
||
|
bitgen -intstyle ise -f $name.ut $name.ncd
|
||
|
|
||
|
popd
|
||
| papilioduo/zpu_rom.vhdl | ||
|---|---|---|
|
X"04fc3d0d",
|
||
|
X"800b83e7",
|
||
|
X"bc348480",
|
||
|
X"805284a4",
|
||
|
X"80528498",
|
||
|
X"808051ff",
|
||
|
X"b5923f83",
|
||
|
X"e0800880",
|
||
| ... | ... | |
|
X"08f40508",
|
||
|
X"872e0981",
|
||
|
X"06ffab38",
|
||
|
X"84a88080",
|
||
|
X"849c8080",
|
||
|
X"51ebcf3f",
|
||
|
X"ff0b83e7",
|
||
|
X"c00c800b",
|
||
Added multiple build types