Line 10... |
Line 10... |
module CC3_top(
|
module CC3_top(
|
input wire clk40_i,
|
input wire clk40_i,
|
/* CPU Bus */
|
/* CPU Bus */
|
output wire cpuclk_o,
|
output wire cpuclk_o,
|
output wire reset_o,
|
output wire reset_o,
|
output wire [15:0] addr_o,
|
output wire [18:0] addr_o,
|
output wire oen_o,
|
output wire oen_o,
|
output wire wen_o,
|
output wire wen_o,
|
output wire cen_o,
|
output wire cen_o,
|
output wire [7:0] data_io,
|
inout wire [15:0] data_io,
|
output wire [5:0] state_o,
|
output wire [5:0] state_o,
|
/* Debug */
|
/* Debug */
|
output wire [7:0] leds_o,
|
output wire [7:0] leds_o,
|
/* VGA output */
|
/* VGA output */
|
output wire hsync_o,
|
output wire hsync_o,
|
output wire vsync_o,
|
output wire vsync_o,
|
output wire red_o,
|
output wire red_o,
|
output wire green_o,
|
output wire green_o,
|
output wire blue_o
|
output wire blue_o,
|
|
/* logic analyzer probe */
|
|
output wire [5:0] laddr_o,
|
|
output wire loen_o,
|
|
output wire lwen_o,
|
|
output wire lcen_o,
|
|
output wire [7:0] ldata_io
|
|
|
);
|
);
|
|
|
reg cpu_clk, clk_div2;
|
reg cpu_clk, clk_div2;
|
reg [3:0] reset_cnt;
|
reg [3:0] reset_cnt;
|
Line 36... |
Line 42... |
/* CPU IO */
|
/* CPU IO */
|
wire [15:0] cpu0_addr_o, cpu1_addr_o;
|
wire [15:0] cpu0_addr_o, cpu1_addr_o;
|
wire [7:0] cpu0_data_in, cpu0_data_out, cpu1_data_in, cpu1_data_out;
|
wire [7:0] cpu0_data_in, cpu0_data_out, cpu1_data_in, cpu1_data_out;
|
wire cpu0_we, cpu0_oe, cpu1_we, cpu1_oe, cpu_reset;
|
wire cpu0_we, cpu0_oe, cpu1_we, cpu1_oe, cpu_reset;
|
wire [5:0] cpu0_state;
|
wire [5:0] cpu0_state;
|
|
/* Memory */
|
|
wire bios_en, video_en, extram_en;
|
|
wire [7:0] data_from_bios, data_from_video;
|
|
|
|
assign bios_en = cpu0_addr_o[15:12] == 4'hf;
|
|
assign video_en = cpu0_addr_o[15:12] == 4'he;
|
|
assign extram_en = !(bios_en | video_en);
|
|
|
|
assign cpu0_data_in = bios_en ? data_from_bios:
|
|
video_en ? data_from_video:data_io[7:0];
|
|
|
|
wire debug_data;
|
|
|
/* Module io */
|
/* Module io */
|
|
|
assign addr_o = cpu0_addr_o;
|
assign addr_o = { 3'b000, cpu0_addr_o };
|
assign data_io = cpu0_we ? cpu0_data_out:cpu0_data_in;
|
assign data_io = { 8'hzz, cpu0_we ? cpu0_data_out:8'hzz };
|
/*
|
|
assign hsync_o = 0;
|
|
assign vsync_o = 0;
|
|
assign red_o = 0;
|
|
assign green_o = 0;
|
|
assign blue_o = 0;
|
|
*/
|
|
assign leds_o = leds_r;
|
assign leds_o = leds_r;
|
|
|
assign oen_o = !cpu0_oe;
|
assign oen_o = !cpu0_oe;
|
assign wen_o = cpu0_we & (cpu0_addr_o[15:12] == 4'h0);
|
assign wen_o = !cpu0_we;
|
assign cen_o = !(cpu0_oe | cpu0_we);
|
assign cen_o = !extram_en;// !(extram_en & (cpu0_oe | cpu0_we));
|
assign cpuclk_o = cpu_clk;
|
assign cpuclk_o = cpu_clk;
|
assign reset_o = cpu_reset;
|
assign reset_o = cpu_reset;
|
assign state_o = cpu0_state;
|
assign state_o = /*{ bios_en, video_en, extram_en };*/cpu0_state;
|
|
/* logic analyzer probe */
|
|
assign laddr_o = cpu0_addr_o[5:0]; //debug_data[15:9];
|
|
assign ldata_io = data_io[7:0];//cpu0_we ? cpu0_data_out:cpu0_data_in;//debug_data[7:0];
|
|
assign loen_o = !cpu0_oe;
|
|
assign lwen_o = !cpu0_we;
|
|
assign lcen_o = ! (extram_en & (cpu0_oe | cpu0_we));
|
|
|
|
`ifdef SERIAL_DEBUG
|
|
reg [7:0] div;
|
|
|
always @(posedge clk40_i)
|
always @(posedge clk40_i)
|
cpu_clk <= !cpu_clk;
|
begin
|
|
if (!cpu_reset)
|
|
begin
|
|
if (div == 65)
|
|
div <= 0;
|
|
else
|
|
div <= div + 1;
|
|
end
|
|
end
|
|
|
|
always @(posedge clk40_i)
|
|
if (div < 8'h2)
|
|
cpu_clk <= 1'b1;
|
|
else
|
|
cpu_clk <= 1'b0;
|
|
`else
|
|
|
|
reg div;
|
|
|
|
always @(posedge clk40_i)
|
|
div <= ~div;
|
|
|
|
always @(posedge div)
|
|
cpu_clk <= ~cpu_clk;
|
|
|
|
`endif
|
assign cpu_reset = reset_cnt != 4'd14;
|
assign cpu_reset = reset_cnt != 4'd14;
|
|
|
always @(posedge cpu_clk)
|
always @(posedge clk40_i)
|
begin
|
begin
|
if (reset_cnt != 4'd14)
|
if (reset_cnt != 4'd14)
|
reset_cnt <= reset_cnt + 4'h1;
|
reset_cnt <= reset_cnt + 4'h1;
|
if (cpu0_we)
|
if (cpu0_we)
|
leds_r <= cpu0_data_out;
|
leds_r <= cpu0_data_out[7:0];
|
end
|
end
|
|
|
|
|
MC6809_cpu cpu0(
|
MC6809_cpu cpu0(
|
.cpu_clk(cpu_clk),
|
.cpu_clk(cpu_clk),
|
Line 81... |
Line 127... |
.cpu_state_o(cpu0_state),
|
.cpu_state_o(cpu0_state),
|
.cpu_we_o(cpu0_we),
|
.cpu_we_o(cpu0_we),
|
.cpu_oe_o(cpu0_oe),
|
.cpu_oe_o(cpu0_oe),
|
.cpu_addr_o(cpu0_addr_o),
|
.cpu_addr_o(cpu0_addr_o),
|
.cpu_data_i(cpu0_data_in),
|
.cpu_data_i(cpu0_data_in),
|
.cpu_data_o(cpu0_data_out)
|
.cpu_data_o(cpu0_data_out),
|
|
.debug_clk(clk40_i),
|
|
.debug_data_o(debug_data)
|
);
|
);
|
|
|
/* Memory */
|
/* Memory */
|
|
|
wire bios_en, video_en;
|
|
wire [7:0] data_from_bios, data_from_video;
|
|
|
|
assign bios_en = cpu0_addr_o[15:12] == 4'hf;
|
|
assign video_en = cpu0_addr_o[15:12] == 4'h0;
|
|
|
|
assign cpu0_data_in = bios_en ? data_from_bios:
|
|
video_en ? data_from_video:8'hzz;
|
|
|
|
bios2k bios(
|
bios2k bios(
|
.DataInA(cpu0_data_out[7:0]),
|
.DataInA(cpu0_data_out[7:0]),
|
.DataInB(cpu1_data_out[7:0]),
|
.DataInB(cpu1_data_out[7:0]),
|
.AddressA(cpu0_addr_o[10:0]),
|
.AddressA(cpu0_addr_o[10:0]),
|