From 8733d015a4a6e3a380ec8ce2b3ca44624d296c59 Mon Sep 17 00:00:00 2001 From: Eugene Lozovoy Date: Fri, 25 Nov 2022 19:23:57 +0300 Subject: [PATCH] general sound - 16mhz clock --- README.md | 2 +- cpld/rtl/top.v | 35 ++++++++++++++++++----------------- cpld/syn/clocks.sdc | 2 +- out/cpld.rev.A1.pof | Bin 16658 -> 16658 bytes 4 files changed, 20 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 7b9fb37..d5da68f 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Sound card for ZX Spectrum (NemoBus). ### Tech specs * TurboSound FM (2xYM2203) -* General Sound (12MHz, 1024Kb of RAM) +* General Sound (16MHz, 1024Kb of RAM) * SAA1099 (use port #FF/#1FF to access SAA chip, write #F7/#FF to #FFFD port to enable/disable SAA) * SounDrive (ports #0F, #1F, #4F, #5F) * MIDI (controlled via YM(AY) chip - compatible with ZX Spectrum 128K / ZXUNO) diff --git a/cpld/rtl/top.v b/cpld/rtl/top.v index 3a30c9a..f344f08 100644 --- a/cpld/rtl/top.v +++ b/cpld/rtl/top.v @@ -83,6 +83,19 @@ wire gs_ena = cfg[2]; wire sd_ena = cfg[3]; +/* CLOCKS */ +reg [5:0] clk3_5_cnt = 0; +reg [1:0] clk8_cnt = 0; +reg [2:0] clk12_cnt = 0; +always @(posedge clk32) clk3_5_cnt <= clk3_5_cnt + 6'd7; +always @(posedge clk32) clk8_cnt <= clk8_cnt + 1'b1; +always @(posedge clk32) clk12_cnt <= clk12_cnt + 3'd3; +wire clk3_5 = clk3_5_cnt[5]; +wire clk8 = clk8_cnt[1]; +wire clk12 = clk12_cnt[2]; +wire clk16 = clk8_cnt[0]; + + /* TURBO SOUND FM */ wire port_bffd = a[15:14] == 2'b10 && a[1:0] == 2'b01 && ym_ena; wire port_fffd = a[15:14] == 2'b11 && a[1:0] == 2'b01 && ym_ena; @@ -107,11 +120,7 @@ always @(posedge clk32 or negedge rst_n) begin end end -reg [5:0] ym_m_cnt = 0; -assign ym_m = ym_m_cnt[5]; -always @(posedge clk32) begin - ym_m_cnt <= ym_m_cnt + 6'd7; -end +assign ym_m = clk3_5; /* SAA1099 */ @@ -128,28 +137,20 @@ always @(posedge clk32 or negedge rst_n) begin saa_clk_en <= ~d[3]; end -reg [1:0] saa_clk_cnt = 0; -assign saa_clk = saa_clk_en? saa_clk_cnt[1] : 1'b0; -always @(posedge clk32) begin - saa_clk_cnt <= saa_clk_cnt + 1'b1; -end +assign saa_clk = saa_clk_en? clk8 : 1'b0; /* MIDI */ -reg [2:0] midi_clk_cnt = 0; -assign midi_clk = midi_clk_cnt[2]; -always @(posedge clk32) begin - midi_clk_cnt <= midi_clk_cnt + 3'd3; -end +assign midi_clk = clk12; /* GENERAL SOUND */ -assign gclk = midi_clk; +assign gclk = clk16; assign n_grst = n_rstout; reg [8:0] g_int_cnt; wire g_int_reload = g_int_cnt[8:6] == 4'b101; -always @(posedge gclk or negedge rst_n) begin +always @(posedge clk12 or negedge rst_n) begin if (!rst_n) begin g_int_cnt <= 0; n_gint <= 1'b1; diff --git a/cpld/syn/clocks.sdc b/cpld/syn/clocks.sdc index 457c9f4..aaf4db8 100644 --- a/cpld/syn/clocks.sdc +++ b/cpld/syn/clocks.sdc @@ -1,5 +1,5 @@ create_clock -period 32.1MHz -name {clk_32mhz} [get_ports {clk32}] -create_generated_clock -name {gclk} -divide_by 2 -source [get_ports {clk32}] [get_registers {midi_clk_cnt[2]}] +create_generated_clock -name {clk12} -divide_by 2 -source [get_ports {clk32}] [get_registers {clk12_cnt[2]}] set_false_path -from [get_ports {cfg[*]}] diff --git a/out/cpld.rev.A1.pof b/out/cpld.rev.A1.pof index 9833104ea65f72b776c54aa6865fd393ac3cf0d9..89a8a17c700670b4eef92305258b506f27a30fcc 100644 GIT binary patch literal 16658 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 literal 16658 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