mirror of
https://github.com/nippur72/Apple1_MiST.git
synced 2024-09-27 09:55:45 +00:00
use multiple unison clocks
This commit is contained in:
parent
d4c8ce6296
commit
35876b4b7d
@ -23,9 +23,10 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
module apple1(
|
module apple1(
|
||||||
input clk7, // 7 MHz master clock
|
|
||||||
input reset, // reset
|
input reset, // reset
|
||||||
|
|
||||||
|
input sys_clock, // system clock
|
||||||
|
input pixel_clock, // 7 MHz pixel clock
|
||||||
input cpu_clken, // cpu clock enable
|
input cpu_clken, // cpu clock enable
|
||||||
|
|
||||||
// RAM interface
|
// RAM interface
|
||||||
@ -65,7 +66,7 @@ assign ram_wr = we & ram_cs;
|
|||||||
// 6502
|
// 6502
|
||||||
|
|
||||||
arlet_6502 arlet_6502(
|
arlet_6502 arlet_6502(
|
||||||
.clk (clk7),
|
.clk (sys_clock),
|
||||||
.enable (cpu_clken),
|
.enable (cpu_clken),
|
||||||
.rst (reset),
|
.rst (reset),
|
||||||
.ab (addr),
|
.ab (addr),
|
||||||
@ -92,7 +93,7 @@ assign ram_wr = we & ram_cs;
|
|||||||
// PS/2 keyboard interface
|
// PS/2 keyboard interface
|
||||||
wire [7:0] ps2_dout;
|
wire [7:0] ps2_dout;
|
||||||
ps2keyboard keyboard(
|
ps2keyboard keyboard(
|
||||||
.clk7(clk7),
|
.clk(sys_clock),
|
||||||
.rst(reset),
|
.rst(reset),
|
||||||
.key_clk(ps2_clk),
|
.key_clk(ps2_clk),
|
||||||
.key_din(ps2_din),
|
.key_din(ps2_din),
|
||||||
@ -102,7 +103,7 @@ assign ram_wr = we & ram_cs;
|
|||||||
);
|
);
|
||||||
|
|
||||||
display display(
|
display display(
|
||||||
.clk(clk7),
|
.clk(pixel_clock),
|
||||||
.enable(display_cs & cpu_clken),
|
.enable(display_cs & cpu_clken),
|
||||||
.rst(reset),
|
.rst(reset),
|
||||||
|
|
||||||
|
@ -90,8 +90,6 @@ localparam conf_str_len = $size(CONF_STR)>>3;
|
|||||||
wire st_reset_switch = buttons[1];
|
wire st_reset_switch = buttons[1];
|
||||||
wire st_menu_reset = status[6];
|
wire st_menu_reset = status[6];
|
||||||
|
|
||||||
wire clk7; // the 14.31818 MHz clock
|
|
||||||
wire clk_osd; // x2 clock for the OSD menu
|
|
||||||
wire r, g, b;
|
wire r, g, b;
|
||||||
wire hs, vs;
|
wire hs, vs;
|
||||||
|
|
||||||
@ -116,6 +114,8 @@ wire reset_button = status[0] | st_menu_reset | st_reset_switch | !pll_locked;
|
|||||||
|
|
||||||
wire pll_locked;
|
wire pll_locked;
|
||||||
|
|
||||||
|
wire pixel_clock; // the 14.31818 MHz clock
|
||||||
|
wire clk_osd; // x2 clock for the OSD menu
|
||||||
wire sdram_clock; // cpu x 7 x 8 for sdram.v interface
|
wire sdram_clock; // cpu x 7 x 8 for sdram.v interface
|
||||||
wire sdram_clock_ph; // cpu x 7 x 8 phase shifted -2.5 ns
|
wire sdram_clock_ph; // cpu x 7 x 8 phase shifted -2.5 ns
|
||||||
|
|
||||||
@ -123,8 +123,8 @@ pll pll
|
|||||||
(
|
(
|
||||||
.inclk0(CLOCK_27),
|
.inclk0(CLOCK_27),
|
||||||
.locked(pll_locked),
|
.locked(pll_locked),
|
||||||
.c0(clk_osd), // x2 clock for OSD menu
|
.c0( clk_osd ), // x2 video clock for OSD menu
|
||||||
.c1(clk7), // 7.15909 MHz (14.318180/2)
|
.c1( pixel_clock ), // 7.15909 MHz (14.318180/2)
|
||||||
.c2( sdram_clock ), // cpu x 7 x 8
|
.c2( sdram_clock ), // cpu x 7 x 8
|
||||||
.c3( sdram_clock_ph ) // cpu x 7 x 8 phase shifted -2.5 ns
|
.c3( sdram_clock_ph ) // cpu x 7 x 8 phase shifted -2.5 ns
|
||||||
);
|
);
|
||||||
@ -164,7 +164,7 @@ downloader
|
|||||||
.ROM_done ( ROM_loaded ),
|
.ROM_done ( ROM_loaded ),
|
||||||
|
|
||||||
// external ram interface
|
// external ram interface
|
||||||
.clk ( clk7 ),
|
.clk ( sdram_clock ),
|
||||||
.clk_ena ( cpu_clken ),
|
.clk_ena ( cpu_clken ),
|
||||||
.wr ( download_wr ),
|
.wr ( download_wr ),
|
||||||
.addr ( download_addr ),
|
.addr ( download_addr ),
|
||||||
@ -179,7 +179,7 @@ downloader
|
|||||||
|
|
||||||
// RAM
|
// RAM
|
||||||
ram ram(
|
ram ram(
|
||||||
.clk (clk7 ),
|
.clk (sdram_clock),
|
||||||
.ena (cpu_clken ),
|
.ena (cpu_clken ),
|
||||||
.address(sdram_addr[15:0]),
|
.address(sdram_addr[15:0]),
|
||||||
.w_en (sdram_wr ),
|
.w_en (sdram_wr ),
|
||||||
@ -225,7 +225,7 @@ assign LED = ~dummy;
|
|||||||
// WozMon ROM
|
// WozMon ROM
|
||||||
wire [7:0] rom_dout;
|
wire [7:0] rom_dout;
|
||||||
rom_wozmon rom_wozmon(
|
rom_wozmon rom_wozmon(
|
||||||
.clk(clk7),
|
.clk(sdram_clock),
|
||||||
.address(cpu_addr[7:0]),
|
.address(cpu_addr[7:0]),
|
||||||
.dout(rom_dout)
|
.dout(rom_dout)
|
||||||
);
|
);
|
||||||
@ -233,7 +233,7 @@ rom_wozmon rom_wozmon(
|
|||||||
// Basic ROM
|
// Basic ROM
|
||||||
wire [7:0] basic_dout;
|
wire [7:0] basic_dout;
|
||||||
rom_basic rom_basic(
|
rom_basic rom_basic(
|
||||||
.clk(clk7),
|
.clk(sdram_clock),
|
||||||
.address(cpu_addr[11:0]),
|
.address(cpu_addr[11:0]),
|
||||||
.dout(basic_dout)
|
.dout(basic_dout)
|
||||||
);
|
);
|
||||||
@ -255,10 +255,11 @@ wire [7:0] bus_dout = basic_cs ? basic_dout :
|
|||||||
|
|
||||||
apple1 apple1
|
apple1 apple1
|
||||||
(
|
(
|
||||||
.clk7(clk7),
|
|
||||||
.reset(reset_button),
|
.reset(reset_button),
|
||||||
|
|
||||||
.cpu_clken(cpu_clken), // apple1 outputs the CPU clock enable
|
.sys_clock(sdram_clock), // system clock
|
||||||
|
.pixel_clock(pixel_clock), // pixel clock 7 Mhz
|
||||||
|
.cpu_clken(cpu_clken), // CPU clock enable
|
||||||
|
|
||||||
// RAM interface
|
// RAM interface
|
||||||
.ram_addr (cpu_addr),
|
.ram_addr (cpu_addr),
|
||||||
@ -326,7 +327,7 @@ user_io
|
|||||||
user_io (
|
user_io (
|
||||||
.conf_str (CONF_STR ),
|
.conf_str (CONF_STR ),
|
||||||
|
|
||||||
.clk_sys (clk7 ),
|
.clk_sys (sdram_clock ),
|
||||||
|
|
||||||
.SPI_CLK (SPI_SCK ),
|
.SPI_CLK (SPI_SCK ),
|
||||||
.SPI_SS_IO (CONF_DATA0 ),
|
.SPI_SS_IO (CONF_DATA0 ),
|
||||||
@ -418,7 +419,7 @@ wire cpu_clken; // provides the cpu clock enable signal derived from main clock
|
|||||||
|
|
||||||
//wire cpu_clken;
|
//wire cpu_clken;
|
||||||
clock clock(
|
clock clock(
|
||||||
.clk7 ( clk7 ), // input: main clock
|
.sys_clock( sdram_clock ), // input: main clock
|
||||||
.reset ( reset_button ), // input: reset signal
|
.reset ( reset_button ), // input: reset signal
|
||||||
.cpu_clken( cpu_clken ) // output: cpu clock enable
|
.cpu_clken( cpu_clken ) // output: cpu clock enable
|
||||||
);
|
);
|
||||||
|
26
rtl/clock.v
26
rtl/clock.v
@ -25,31 +25,27 @@
|
|||||||
|
|
||||||
module clock
|
module clock
|
||||||
(
|
(
|
||||||
input clk7, // 7MHz clock master clock
|
input sys_clock, // master clock
|
||||||
input reset, // reset
|
input reset, // reset
|
||||||
|
|
||||||
// Clock enables
|
// Clock enables
|
||||||
output reg cpu_clken // 1MHz clock enable for the CPU and devices
|
output reg cpu_clken // 1MHz clock enable for the CPU and devices
|
||||||
);
|
);
|
||||||
|
|
||||||
// generate clock enable once every
|
reg [7:0] clk_div;
|
||||||
// 14 clocks. This will (hopefully) make
|
always @(posedge sys_clock or posedge reset)
|
||||||
// the 6502 run at 1 MHz
|
|
||||||
//
|
|
||||||
// the clock division counter is synchronously
|
|
||||||
// reset using rst_n to avoid undefined signals
|
|
||||||
// in simulation
|
|
||||||
//
|
|
||||||
|
|
||||||
reg [4:0] clk_div;
|
|
||||||
always @(posedge clk7)
|
|
||||||
begin
|
begin
|
||||||
if (clk_div == 7 || reset )
|
if(reset) begin
|
||||||
|
clk_div <= 0;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
if (clk_div == 6)
|
||||||
clk_div <= 0;
|
clk_div <= 0;
|
||||||
else
|
else
|
||||||
clk_div <= clk_div + 1'b1;
|
clk_div <= clk_div + 1;
|
||||||
|
|
||||||
cpu_clken <= (clk_div[4:0] == 0);
|
cpu_clken <= (clk_div[7:0] == 0);
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
16
rtl/pll.v
16
rtl/pll.v
@ -123,11 +123,11 @@ module pll (
|
|||||||
altpll_component.clk1_duty_cycle = 50,
|
altpll_component.clk1_duty_cycle = 50,
|
||||||
altpll_component.clk1_multiply_by = 715909,
|
altpll_component.clk1_multiply_by = 715909,
|
||||||
altpll_component.clk1_phase_shift = "0",
|
altpll_component.clk1_phase_shift = "0",
|
||||||
altpll_component.clk2_divide_by = 337500,
|
altpll_component.clk2_divide_by = 2700000,
|
||||||
altpll_component.clk2_duty_cycle = 50,
|
altpll_component.clk2_duty_cycle = 50,
|
||||||
altpll_component.clk2_multiply_by = 715909,
|
altpll_component.clk2_multiply_by = 715909,
|
||||||
altpll_component.clk2_phase_shift = "0",
|
altpll_component.clk2_phase_shift = "0",
|
||||||
altpll_component.clk3_divide_by = 337500,
|
altpll_component.clk3_divide_by = 2700000,
|
||||||
altpll_component.clk3_duty_cycle = 50,
|
altpll_component.clk3_duty_cycle = 50,
|
||||||
altpll_component.clk3_multiply_by = 715909,
|
altpll_component.clk3_multiply_by = 715909,
|
||||||
altpll_component.clk3_phase_shift = "-2500",
|
altpll_component.clk3_phase_shift = "-2500",
|
||||||
@ -214,8 +214,8 @@ endmodule
|
|||||||
// Retrieval info: PRIVATE: DUTY_CYCLE3 STRING "50.00000000"
|
// Retrieval info: PRIVATE: DUTY_CYCLE3 STRING "50.00000000"
|
||||||
// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "14.318180"
|
// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "14.318180"
|
||||||
// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "7.159090"
|
// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "7.159090"
|
||||||
// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "57.272720"
|
// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE2 STRING "7.159090"
|
||||||
// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "57.272720"
|
// Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE3 STRING "7.159090"
|
||||||
// Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0"
|
// Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0"
|
||||||
// Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0"
|
// Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0"
|
||||||
// Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1"
|
// Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1"
|
||||||
@ -251,8 +251,8 @@ endmodule
|
|||||||
// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1"
|
// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1"
|
||||||
// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "14.31818000"
|
// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "14.31818000"
|
||||||
// Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "7.15909000"
|
// Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "7.15909000"
|
||||||
// Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "57.27272000"
|
// Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "7.15909000"
|
||||||
// Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "57.27272000"
|
// Retrieval info: PRIVATE: OUTPUT_FREQ3 STRING "7.15909000"
|
||||||
// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1"
|
// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1"
|
||||||
// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "1"
|
// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "1"
|
||||||
// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "1"
|
// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "1"
|
||||||
@ -320,11 +320,11 @@ endmodule
|
|||||||
// Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50"
|
// Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50"
|
||||||
// Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "715909"
|
// Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "715909"
|
||||||
// Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0"
|
// Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0"
|
||||||
// Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "337500"
|
// Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "2700000"
|
||||||
// Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50"
|
// Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50"
|
||||||
// Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "715909"
|
// Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "715909"
|
||||||
// Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0"
|
// Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0"
|
||||||
// Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "337500"
|
// Retrieval info: CONSTANT: CLK3_DIVIDE_BY NUMERIC "2700000"
|
||||||
// Retrieval info: CONSTANT: CLK3_DUTY_CYCLE NUMERIC "50"
|
// Retrieval info: CONSTANT: CLK3_DUTY_CYCLE NUMERIC "50"
|
||||||
// Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "715909"
|
// Retrieval info: CONSTANT: CLK3_MULTIPLY_BY NUMERIC "715909"
|
||||||
// Retrieval info: CONSTANT: CLK3_PHASE_SHIFT STRING "-2500"
|
// Retrieval info: CONSTANT: CLK3_PHASE_SHIFT STRING "-2500"
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
module ps2keyboard (
|
module ps2keyboard (
|
||||||
input clk7, // 25MHz clock
|
input clk, // 25MHz clock
|
||||||
input rst, // active high reset
|
input rst, // active high reset
|
||||||
|
|
||||||
// I/O interface to keyboard
|
// I/O interface to keyboard
|
||||||
@ -43,7 +43,7 @@ module ps2keyboard (
|
|||||||
reg [7:0] rx; // scancode receive buffer
|
reg [7:0] rx; // scancode receive buffer
|
||||||
|
|
||||||
// wire ps2_clkdb; // debounced PS/2 clock signal
|
// wire ps2_clkdb; // debounced PS/2 clock signal
|
||||||
reg prev_ps2_clkdb; // previous clock state (in clk7 domain)
|
reg prev_ps2_clkdb; // previous clock state (in clk domain)
|
||||||
|
|
||||||
// keyboard translation signals
|
// keyboard translation signals
|
||||||
reg [7:0] ascii; // ASCII code of received character
|
reg [7:0] ascii; // ASCII code of received character
|
||||||
@ -54,13 +54,13 @@ module ps2keyboard (
|
|||||||
|
|
||||||
// debounce ps2clk_debounce
|
// debounce ps2clk_debounce
|
||||||
// (
|
// (
|
||||||
// .clk7(clk7),
|
// .clk(clk),
|
||||||
// .rst(rst),
|
// .rst(rst),
|
||||||
// .sig_in(key_clk),
|
// .sig_in(key_clk),
|
||||||
// .sig_out(ps2_clkdb)
|
// .sig_out(ps2_clkdb)
|
||||||
// );
|
// );
|
||||||
|
|
||||||
always @(posedge clk7 or posedge rst)
|
always @(posedge clk or posedge rst)
|
||||||
begin
|
begin
|
||||||
if (rst)
|
if (rst)
|
||||||
begin
|
begin
|
||||||
@ -112,7 +112,7 @@ module ps2keyboard (
|
|||||||
localparam S_KEYE0 = 3'b010; // extended key state
|
localparam S_KEYE0 = 3'b010; // extended key state
|
||||||
localparam S_KEYE0F0 = 3'b011; // extended release state
|
localparam S_KEYE0F0 = 3'b011; // extended release state
|
||||||
|
|
||||||
always @(posedge clk7 or posedge rst)
|
always @(posedge clk or posedge rst)
|
||||||
begin
|
begin
|
||||||
if (rst)
|
if (rst)
|
||||||
begin
|
begin
|
||||||
|
Loading…
Reference in New Issue
Block a user