Revision 84
Added by markw about 11 years ago
mist/atari800core_mist.vhd | ||
---|---|---|
LIBRARY work;
|
||
|
||
ENTITY atari800core_mist IS
|
||
GENERIC
|
||
(
|
||
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)
|
||
);
|
||
PORT
|
||
(
|
||
CLOCK_27 : IN STD_LOGIC_VECTOR(1 downto 0);
|
||
... | ... | |
SIGNAL KEYBOARD_SCAN : STD_LOGIC_VECTOR(5 DOWNTO 0);
|
||
|
||
SIGNAL PAL : std_logic;
|
||
SIGNAL COMPOSITE_ON_HSYNC : std_logic;
|
||
SIGNAL VGA : std_logic;
|
||
|
||
signal SDRAM_REQUEST : std_logic;
|
||
signal SDRAM_REQUEST_COMPLETE : std_logic;
|
||
... | ... | |
-- ps2
|
||
signal SLOW_PS2_CLK : std_logic; -- around 16KHz
|
||
|
||
-- scandoubler
|
||
signal half_scandouble_enable_reg : std_logic;
|
||
signal half_scandouble_enable_next : std_logic;
|
||
signal VIDEO_B : std_logic_vector(7 downto 0);
|
||
|
||
BEGIN
|
||
pal <= '1'; -- TODO, two builds, with appropriate pll settings
|
||
pal <= '1' when tv=1 else '0';
|
||
vga <= '1' when video=2 else '0';
|
||
composite_on_hsync <= '1' when composite_sync=1 else '0';
|
||
|
||
-- mist spi io
|
||
mist_spi_interface : entity work.data_io
|
||
... | ... | |
cycle_length => 32,
|
||
internal_rom => 0,
|
||
internal_ram => 0,
|
||
video_bits => 6
|
||
video_bits => 8,
|
||
palette => 0
|
||
)
|
||
PORT MAP
|
||
(
|
||
... | ... | |
|
||
VIDEO_VS => VGA_VS_RAW,
|
||
VIDEO_HS => VGA_HS_RAW,
|
||
VIDEO_B => VGA_B,
|
||
VIDEO_G => VGA_G,
|
||
VIDEO_R => VGA_R,
|
||
VIDEO_B => VIDEO_B,
|
||
VIDEO_G => open,
|
||
VIDEO_R => open,
|
||
|
||
AUDIO_L => AUDIO_L_PCM,
|
||
AUDIO_R => AUDIO_R_PCM,
|
||
... | ... | |
--SDRAM_CKE <= '1';
|
||
LED <= '0';
|
||
|
||
VGA_HS <= not(VGA_HS_RAW xor VGA_VS_RAW);
|
||
VGA_VS <= not(VGA_VS_RAW);
|
||
--VGA_HS <= not(VGA_HS_RAW xor VGA_VS_RAW);
|
||
--VGA_VS <= not(VGA_VS_RAW);
|
||
|
||
process(clk,RESET_N,SDRAM_RESET_N,reset_atari)
|
||
begin
|
||
if ((RESET_N and SDRAM_RESET_N and not(reset_atari))='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;
|
||
|
||
half_scandouble_enable_next <= not(half_scandouble_enable_reg);
|
||
|
||
scandoubler1: entity work.scandoubler
|
||
GENERIC MAP
|
||
(
|
||
video_bits=>6
|
||
)
|
||
PORT MAP
|
||
(
|
||
CLK => CLK,
|
||
RESET_N => RESET_N and SDRAM_RESET_N and not(reset_atari),
|
||
|
||
VGA => vga,
|
||
COMPOSITE_ON_HSYNC => composite_on_hsync,
|
||
|
||
colour_enable => half_scandouble_enable_reg,
|
||
doubled_enable => '1',
|
||
|
||
-- GTIA interface
|
||
colour_in => VIDEO_B,
|
||
vsync_in => VGA_VS_RAW,
|
||
hsync_in => VGA_HS_RAW,
|
||
|
||
-- TO TV...
|
||
R => VGA_R,
|
||
G => VGA_G,
|
||
B => VGA_B,
|
||
|
||
VSYNC => VGA_VS,
|
||
HSYNC => VGA_HS
|
||
);
|
||
|
||
zpu: entity work.zpucore
|
||
GENERIC MAP
|
||
(
|
mist/build.sh | ||
---|---|---|
rm -rf build
|
||
mkdir build
|
||
cp atari800core_mist.vhd build
|
||
cp pll.* build
|
||
cp atari800core.sdc build
|
||
cp data_io.vhdl build
|
||
cp user_io.v build
|
||
cp mist_sector_buffer.* build
|
||
cp zpu_rom.vhdl build
|
||
mkdir build/common
|
||
mkdir build/common/a8core
|
||
mkdir build/common/components
|
||
mkdir build/common/zpu
|
||
cp ../common/a8core/* ./build/common/a8core
|
||
cp ../common/components/* ./build/common/components
|
||
cp ../common/zpu/* ./build/common/zpu
|
||
#!/usr/bin/perl -w
|
||
use strict;
|
||
|
||
cd build
|
||
../makeqsf ../atari800core.qsf ./common/a8core ./common/components ./common/zpu
|
||
my $wanted_variant = shift @ARGV;
|
||
|
||
quartus_sh --flow compile atari800core
|
||
#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_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_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\n";
|
||
|
||
my $dir = "build_$variant";
|
||
`rm -rf $dir`;
|
||
mkdir $dir;
|
||
`cp atari800core_mist.vhd $dir`;
|
||
`cp *pll*.* $dir`;
|
||
`cp *mist_sector*.* $dir`;
|
||
`cp *.v $dir`;
|
||
`cp *.vhdl $dir`;
|
||
`cp zpu_rom.vhdl $dir`;
|
||
`cp atari800core.sdc $dir`;
|
||
`mkdir $dir/common`;
|
||
`mkdir $dir/common/a8core`;
|
||
`mkdir $dir/common/components`;
|
||
`mkdir $dir/common/zpu`;
|
||
`cp ../common/a8core/* ./$dir/common/a8core`;
|
||
`cp ../common/components/* ./$dir/common/components`;
|
||
`cp ../common/zpu/* ./$dir/common/zpu`;
|
||
|
||
chdir $dir;
|
||
`../makeqsf ../atari800core.qsf ./common/a8core ./common/components ./common/zpu`;
|
||
|
||
foreach my $key (sort keys %{$variants{$variant}})
|
||
{
|
||
my $val = $variants{$variant}->{$key};
|
||
`echo set_parameter -name $key $val >> atari800core.qsf`;
|
||
}
|
||
|
||
`quartus_sh --flow compile atari800core > build.log 2> build.err`;
|
||
|
||
`quartus_cpf --convert ../output_file.cof`;
|
||
|
||
chdir "..";
|
||
}
|
||
|
mist/makeqsf | ||
---|---|---|
my @vhdl = glob ("$_/*.vhd");
|
||
push @vhdl, glob ("$_/*.vhdl");
|
||
my @verilog = glob ("$_/*.v");
|
||
my @qip = glob ("$_/*.qip");
|
||
|
||
foreach (@verilog)
|
||
{
|
||
... | ... | |
{
|
||
print QSF_OUT "set_global_assignment -name VHDL_FILE $_\n";
|
||
}
|
||
|
||
foreach (@qip)
|
||
{
|
||
print QSF_OUT "set_global_assignment -name QIP_FILE $_\n";
|
||
}
|
||
}
|
||
|
||
close (QSF_OUT);
|
mist/output_file.cof | ||
---|---|---|
<?xml version="1.0" encoding="US-ASCII" standalone="yes"?>
|
||
<cof>
|
||
<eprom_name>CFI_128Mb</eprom_name>
|
||
<output_filename>output_files/atari800core.rbf</output_filename>
|
||
<n_pages>1</n_pages>
|
||
<width>1</width>
|
||
<mode>0</mode>
|
||
<sof_data>
|
||
<user_name>Page_0</user_name>
|
||
<page_flags>1</page_flags>
|
||
<bit0>
|
||
<sof_filename>output_files/atari800core.sof<compress_bitstream>1</compress_bitstream></sof_filename>
|
||
</bit0>
|
||
</sof_data>
|
||
<version>5</version>
|
||
<create_cvp_file>0</create_cvp_file>
|
||
<options>
|
||
</options>
|
||
</cof>
|
Also available in: Unified diff
Added scandoubler. Build some variants.