From e4fc4f257a07c0906e6d0962f42e92c7abd722a8 Mon Sep 17 00:00:00 2001 From: ikari Date: Fri, 11 Sep 2009 11:03:00 +0200 Subject: [PATCH] cleanup schematic, edge triggered cycle start detection, debug output cleanup --- pcb/cart/sd2snes17.sch | Bin 365803 -> 366619 bytes src/memory.c | 5 --- src/snes.c | 2 +- verilog/sd2snes/dcm.v | 10 +++-- verilog/sd2snes/main.ucf | 3 +- verilog/sd2snes/main.v | 79 ++++++++++++++++++++++++++--------- verilog/sd2snes/sd2snes.xise | 4 ++ 7 files changed, 72 insertions(+), 31 deletions(-) diff --git a/pcb/cart/sd2snes17.sch b/pcb/cart/sd2snes17.sch index 2d8e572deaa44769e0143a74eb9039fd9b35849f..3bd4abde61f54ff64feaeae5d445e4b87c57a7ef 100644 GIT binary patch delta 14572 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 delta 13332 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 B>24)&0xf]); uart_putc(hex[(crc>>20)&0xf]); uart_putc(hex[(crc>>16)&0xf]); */ - uart_putc(hex[(crc>>12)&0xf]); - uart_putc(hex[(crc>>8)&0xf]); - uart_putc(hex[(crc>>4)&0xf]); - uart_putc(hex[(crc)&0xf]); - uart_putcrlf(); return crc; } diff --git a/src/snes.c b/src/snes.c index 89b7a11..9dbc180 100644 --- a/src/snes.c +++ b/src/snes.c @@ -53,11 +53,11 @@ void snes_main_loop() { sram_crc = calc_sram_crc(sram_size); if(sram_crc != sram_crc_old) { uart_putc('U'); + uart_puthexlong(sram_crc); uart_putcrlf(); set_busy_led(1); save_sram("/test.srm", sram_size, sram_base_addr); set_busy_led(0); } sram_crc_old = sram_crc; - uart_putc('.'); } diff --git a/verilog/sd2snes/dcm.v b/verilog/sd2snes/dcm.v index df75da1..7916673 100644 --- a/verilog/sd2snes/dcm.v +++ b/verilog/sd2snes/dcm.v @@ -23,7 +23,9 @@ module my_dcm ( input CLKFB, output CLK2X, output CLKFX, - output CLK0 + output CLK0, + output LOCKED, + input RST ); // DCM: Digital Clock Manager Circuit @@ -37,15 +39,16 @@ module my_dcm ( .CLKFX_DIVIDE(1), // Can be any integer from 1 to 32 .CLKFX_MULTIPLY(4), // Can be any integer from 2 to 32 .CLKIN_DIVIDE_BY_2("FALSE"), // TRUE/FALSE to enable CLKIN divide by two feature - .CLKIN_PERIOD(46000.0), // Specify period of input clock + .CLKIN_PERIOD(46.561), // Specify period of input clock .CLKOUT_PHASE_SHIFT("NONE"), // Specify phase shift of NONE, FIXED or VARIABLE - .CLK_FEEDBACK("1X"), // Specify clock feedback of NONE, 1X or 2X + .CLK_FEEDBACK("NONE"), // Specify clock feedback of NONE, 1X or 2X .DESKEW_ADJUST("SYSTEM_SYNCHRONOUS"), // SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or // an integer from 0 to 15 .DFS_FREQUENCY_MODE("LOW"), // HIGH or LOW frequency mode for frequency synthesis .DLL_FREQUENCY_MODE("LOW"), // HIGH or LOW frequency mode for DLL .DUTY_CYCLE_CORRECTION("TRUE"), // Duty cycle correction, TRUE or FALSE .FACTORY_JF(16'hC080), // FACTORY JF values +// .LOC("DCM_X0Y0"), .PHASE_SHIFT(0), // Amount of fixed phase shift from -255 to 255 .STARTUP_WAIT("FALSE") // Delay configuration DONE until DCM LOCK, TRUE/FALSE ) DCM_inst ( @@ -68,5 +71,4 @@ module my_dcm ( .PSINCDEC(PSINCDEC), // Dynamic phase adjust increment/decrement .RST(RST) // DCM asynchronous reset input ); - assign RST=0; endmodule diff --git a/verilog/sd2snes/main.ucf b/verilog/sd2snes/main.ucf index df137f3..0efde38 100644 --- a/verilog/sd2snes/main.ucf +++ b/verilog/sd2snes/main.ucf @@ -1,7 +1,6 @@ NET "CLKIN" TNM_NET = CLKIN; -TIMESPEC TS_CLKIN = PERIOD "CLKIN" 30 MHz HIGH 50 %; +TIMESPEC TS_CLKIN = PERIOD "CLKIN" 21.477 MHz HIGH 50 %; NET "AVR_ENA" IOSTANDARD = LVCMOS33; -NET "MODE" IOSTANDARD = LVCMOS33; NET "SNES_ADDR[0]" IOSTANDARD = LVCMOS33; NET "SNES_ADDR[10]" IOSTANDARD = LVCMOS33; NET "SNES_ADDR[11]" IOSTANDARD = LVCMOS33; diff --git a/verilog/sd2snes/main.v b/verilog/sd2snes/main.v index 095b86e..dba82ab 100644 --- a/verilog/sd2snes/main.v +++ b/verilog/sd2snes/main.v @@ -111,28 +111,64 @@ my_dcm snes_dcm(.CLKIN(CLKIN), .CLK2X(CLK), .CLKFB(CLKFB), .CLKFX(CLK2), - .CLK0(CLK0) + .CLK0(CLK0), + .LOCKED(DCM_LOCKED), + .RST(DCM_RST) ); + +my_dcm2 snes_dcm2(.CLKIN(CLK2), + .CLKFB(CLKFB2), + .CLKFX(FASTCLK), + .CLK0(CLK0_2)); +assign CLKFB2 = CLK0_2; +/* +reg DCM_RESET_ACK; +reg DCM_RST_BUF; +reg [1:0] DCM_LOCKEDr; +assign DCM_RST = DCM_RST_BUF; +assign DCM_FAIL = (DCM_LOCKEDr == 2'b10); + +always @(posedge CLKIN) begin + DCM_LOCKEDr <= {DCM_LOCKEDr[0], DCM_LOCKED}; +end + +always @(posedge CLKIN) begin + if (DCM_FAIL) begin + DCM_RST_BUF <= 1; + end else begin + DCM_RST_BUF <= 0; + end +end*/ /*my_dcm snes_dcm2(.CLKIN(CLK), .CLK2X(CLK2), .CLKFB(CLKFB2), .CLKFX(CLKFX2) );*/ -assign CLKFB = CLK0; +//assign CLKFB = CLK0; //assign CLKFB2 = CLK2; wire SNES_RW; -reg SNES_READs; -reg SNES_WRITEs; -reg SNES_CSs; +reg [1:0] SNES_READr; +reg [1:0] SNES_WRITEr; +reg [1:0] SNES_CSr; +reg [1:0] SNES_CPU_CLKr; +reg [3:0] SNES_RWr; -assign SNES_RW = (SNES_READs & SNES_WRITEs); +wire SNES_READs = (SNES_READr == 2'b11); +wire SNES_WRITEs = (SNES_WRITEr == 2'b11); +wire SNES_CSs = (SNES_CSr == 2'b11); +wire SNES_CPU_CLKs = SNES_CPU_CLK; // (SNES_CPU_CLKr == 2'b11); +wire SNES_RW_start = (SNES_RWr == 4'b1110); // falling edge marks beginning of cycle + +assign SNES_RW = (SNES_READ & SNES_WRITE); always @(posedge CLK2) begin - SNES_READs <= SNES_READ; - SNES_WRITEs <= SNES_WRITE; - SNES_CSs <= SNES_CS; + SNES_READr <= {SNES_READr[0], SNES_READ}; + SNES_WRITEr <= {SNES_WRITEr[0], SNES_WRITE}; + SNES_CSr <= {SNES_CSr[0], SNES_CS}; + SNES_CPU_CLKr <= {SNES_CPU_CLKr[0], SNES_CPU_CLK}; + SNES_RWr <= {SNES_RWr[2:0], SNES_RW}; end reg ADDR_WRITE; @@ -186,7 +222,7 @@ parameter STATE_7 = 10'b0010000000; parameter STATE_8 = 10'b0100000000; parameter STATE_9 = 10'b1000000000; -reg [9:0] STATE; +reg [10:0] STATE; reg [3:0] STATEIDX; reg STATE_RESET, CYCLE_RESET, CYCLE_RESET_ACK; @@ -264,18 +300,25 @@ end // the minimum of 6 cycles to get everything done. always @(posedge CLK2) begin - if (!SNES_RW /* || !AVR_ENA */) begin - if (!CYCLE_RESET_ACK) + if (SNES_RW_start /* || !AVR_ENA */) //begin +// if (!CYCLE_RESET_ACK) CYCLE_RESET <= 1; else CYCLE_RESET <= 0; - end +// end end always @(posedge CLK2) begin - if (CYCLE_RESET && !CYCLE_RESET_ACK) begin - CYCLE_RESET_ACK <= 1; + if (SNES_RW_start/* && !CYCLE_RESET_ACK*/) begin +// CYCLE_RESET_ACK <= 1; STATE <= STATE_0; + SNES_READ_CYCLE <= SNES_READ; + SNES_WRITE_CYCLE <= SNES_WRITE; + AVR_READ_CYCLE <= AVR_READ; + AVR_WRITE_CYCLE <= AVR_WRITE; + +// end else if (!DCM_LOCKED) begin +// CYCLE_RESET_ACK <= 0; // ready for new cycle end else begin case (STATE) STATE_0: @@ -311,10 +354,6 @@ always @(posedge CLK2) begin case (STATE) STATE_9: begin - SNES_READ_CYCLE <= SNES_READs; - SNES_WRITE_CYCLE <= SNES_WRITEs; - AVR_READ_CYCLE <= AVR_READ; - AVR_WRITE_CYCLE <= AVR_WRITE; STATEIDX <= 9; end @@ -353,6 +392,8 @@ always @(posedge CLK2) begin STATE_8: begin STATEIDX <= 0; end + default: + STATEIDX <= 9; endcase end diff --git a/verilog/sd2snes/sd2snes.xise b/verilog/sd2snes/sd2snes.xise index dbcc7a9..2be8f3d 100644 --- a/verilog/sd2snes/sd2snes.xise +++ b/verilog/sd2snes/sd2snes.xise @@ -61,6 +61,10 @@ + + + +