1
0
mirror of https://github.com/mist-devel/mist-board.git synced 2026-02-06 16:14:42 +00:00
Files
mist-devel.mist-board/tutorials/soc/lektion3/soc.v
2015-11-26 13:52:16 +01:00

96 lines
2.2 KiB
Verilog

// Ein einfaches System-on-a-chip (SOC)
// (c) 2015 Till Harbaum
module soc (
input [1:0] CLOCK_27,
output SDRAM_nCS,
output VGA_HS,
output VGA_VS,
output [5:0] VGA_R,
output [5:0] VGA_G,
output [5:0] VGA_B
);
// Deaktivieren des unbenutzten SDRAMs
assign SDRAM_nCS = 1;
wire pixel_clock;
// Einbinden des VGA-Controllers
vga vga (
.pclk ( pixel_clock ),
.cpu_clk ( cpu_clock ),
.cpu_wr ( !cpu_wr_n && !cpu_addr[15] ),
.cpu_addr ( cpu_addr[13:0] ),
.cpu_data ( cpu_dout ),
.hs (VGA_HS),
.vs (VGA_VS),
.r (VGA_R),
.g (VGA_G),
.b (VGA_B)
);
// CPU bekommt die ersten 256 CPU-Taktzyklen einen Reset
reg [7:0] cpu_reset_cnt = 8'h00;
wire cpu_reset = (cpu_reset_cnt != 255);
always @(posedge cpu_clock)
if(cpu_reset_cnt != 255)
cpu_reset_cnt <= cpu_reset_cnt + 8'd1;
// CPU-Steuersignale
wire cpu_clock;
wire [15:0] cpu_addr;
wire [7:0] cpu_din;
wire [7:0] cpu_dout;
wire cpu_rd_n;
wire cpu_wr_n;
wire cpu_mreq_n;
// Einbinden der Z80-CPU
T80s T80s (
.RESET_n ( !cpu_reset ),
.CLK_n ( cpu_clock ),
.WAIT_n ( 1'b1 ),
.INT_n ( 1'b1 ),
.NMI_n ( 1'b1 ),
.BUSRQ_n ( 1'b1 ),
.MREQ_n ( cpu_mreq_n ),
.RD_n ( cpu_rd_n ),
.WR_n ( cpu_wr_n ),
.A ( cpu_addr ),
.DI ( cpu_din ),
.DO ( cpu_dout )
);
// RAM wird in oberer Haelfte des Adressraums gelesen (A15=1),
// ROM in unserer (A15=0)
wire [7:0] ram_data_out, rom_data_out;
assign cpu_din = cpu_addr[15]?ram_data_out:rom_data_out;
// Einbinden des 4k Programmcodes im boot_rom
boot_rom boot_rom (
.clock ( cpu_clock ),
.address ( cpu_addr[11:0] ),
.q ( rom_data_out )
);
// Einbinden des 4k RAM
ram4k ram4k (
.clock ( cpu_clock ),
.address ( cpu_addr[11:0] ),
.wren ( !cpu_wr_n && cpu_addr[15] ),
.data ( cpu_dout ),
.q ( ram_data_out )
);
// PLL, um aus den 27MHz den VGA-Pixeltakt und den CPU-Takt zu erzeugen
pll pll (
.inclk0 ( CLOCK_27[0] ),
.c0 ( pixel_clock ), // 25.175 MHz
.c1 ( cpu_clock ) // 4 MHz
);
endmodule