Pastebin launched a little side project called VERYVIRAL.com, check it out ;-) Want more features on Pastebin? Sign Up, it's FREE!
Guest

Untitled

By: a guest on Nov 19th, 2011  |  syntax: VeriLog  |  size: 10.15 KB  |  views: 51  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. module gd_emu (mclock,
  2.                                         gd_data, gd_addr, gd_rd_n, gd_wr_n, gd_dma_rq, gd_dma_ack, gd_int_rq, gd_iordy, gd_cs, gd_rst,  // GD-Rom stuff.
  3.                                         gd_cdlrck, gd_cdda_clk, gd_cdbck,       // CDDA stuff (missing CDSD atm).
  4.                                         cf_data, cf_addr, cf_rd_n, cf_wr_n, cf_dma_rq, cf_dma_ack,      // Onboard IDE / CF Card.
  5.                                         led);
  6.  
  7.  
  8.         input wire mclock;              // Master clock input
  9.  
  10.         reg [15:0] cf_data_write;
  11.  
  12.         inout [15:0] cf_data;           // Hard drive / CF card data port (bidir).
  13.         assign cf_data = !cf_wr_n ? cf_data_write : 16'bz;      // Output data to IDE when "cf_wr_n" is low.
  14.                                                                                                                         // (force to High-Z if "cf_rd_n" is low too).
  15.  
  16.         output reg [2:0] cf_addr;       // IDE address bits.
  17. //      output reg [1:0] cf_cs;         // IDE "Chip-Select" bits. NOTE: The MSB is labelled CS3 on many specs!
  18.                                                                 // (Note: CS pins are hard-tied on Nemesis board. OzOnE).
  19.         output reg cf_rd_n;                     // IDE Read (active low).
  20.         output reg cf_wr_n;                     // IDE Write (active low).
  21.  
  22.         input cf_dma_rq;                        // IDE DMA ReQuest input.
  23.         output reg cf_dma_ack;          // IDE DMA ACKnowledge output.
  24.        
  25.         reg [23:0] cf_hold_time;        // (for holding Read or Write pin state for a set time).
  26.  
  27. //      reg gd_rd_n_1, gd_rd_n_2;
  28. //      reg gd_wr_n_1, gd_wr_n_2;
  29. //      reg gd_rst_1, gd_rst_2;
  30.  
  31.         reg [15:0] gd_data_write;
  32.  
  33.         inout wire [15:0] gd_data/* synthesis noprune */;
  34.         assign gd_data = 16'bz;                                                         // !! GD-Rom drive Spy mode !!
  35.  
  36. //      inout wire gd_data = !gd_wr_n ? gd_data_write : 16'bz;  // !! GD-Rom emu mode !!
  37.  
  38.         reg gd_wr_n_1;  // Flip-flops for detecting edges.
  39.         reg gd_wr_n_2;
  40.         reg gd_rd_n_1;
  41.         reg gd_rd_n_2;
  42.        
  43.         wire gd_wr_rising = gd_wr_n_1 & ~gd_wr_n_2;
  44.         wire gd_rd_rising = gd_rd_n_1 & ~gd_rd_n_2;
  45.        
  46.         input wire [2:0] gd_addr/* synthesis noprune */;        // !! GD-Rom drive Spy mode !!
  47.         input wire gd_rd_n/* synthesis noprune */;
  48.         input wire gd_wr_n/* synthesis noprune */;
  49.         input wire gd_dma_rq/* synthesis noprune */;
  50.         input wire gd_dma_ack/* synthesis noprune */;
  51.         input wire gd_int_rq/* synthesis noprune */;
  52.         input wire gd_iordy/* synthesis noprune */;
  53.         input wire [1:0] gd_cs/* synthesis noprune */;
  54.         input wire gd_rst/* synthesis noprune */;
  55.        
  56.         input wire gd_cdlrck/* synthesis noprune */;
  57.         input wire gd_cdda_clk/* synthesis noprune */;
  58.         input wire gd_cdbck/* synthesis noprune */;
  59.  
  60.         output wire led = !gd_dma_ack;
  61.        
  62.         reg [7:0] cf_sec_count;
  63.  
  64.         reg [31:0] cf_lba;
  65.         wire [7:0] cf_lba3 = cf_lba[31:24] | 8'hE0;     // Need to BITWISE OR the top LBA byte with 0xE0 (use 0xE0 mask to select MASTER drive).
  66.         wire [7:0] cf_lba2 = cf_lba[23:16];
  67.         wire [7:0] cf_lba1 = cf_lba[15:8];
  68.         wire [7:0] cf_lba0 = cf_lba[7:0];
  69.        
  70.         reg [7:0] cf_wordcount;
  71.        
  72.         reg [9:0] gd_state;
  73.         reg [15:0] ata_cmd;
  74.        
  75.         reg [15:0] gd_ata_cmd;
  76.  
  77.         reg [15:0] packet_1/* synthesis noprune */;
  78.         reg [15:0] packet_2/* synthesis noprune */;
  79.         reg [15:0] packet_3/* synthesis noprune */;
  80.         reg [15:0] packet_4/* synthesis noprune */;
  81.         reg [15:0] packet_5/* synthesis noprune */;
  82.         reg [15:0] packet_6/* synthesis noprune */;
  83.  
  84.         wire [7:0] packet_0b = packet_1[7:0]/* synthesis noprune */;
  85.         wire [7:0] packet_1b = packet_1[15:8]/* synthesis noprune */;
  86.         wire [7:0] packet_2b = packet_2[7:0]/* synthesis noprune */;
  87.         wire [7:0] packet_3b = packet_2[15:8]/* synthesis noprune */;
  88.         wire [7:0] packet_4b = packet_3[7:0]/* synthesis noprune */;
  89.         wire [7:0] packet_5b = packet_3[15:8]/* synthesis noprune */;
  90.         wire [7:0] packet_6b = packet_4[7:0]/* synthesis noprune */;
  91.         wire [7:0] packet_7b = packet_4[15:8]/* synthesis noprune */;
  92.         wire [7:0] packet_8b = packet_5[7:0]/* synthesis noprune */;
  93.         wire [7:0] packet_9b = packet_5[15:8]/* synthesis noprune */;
  94.         wire [7:0] packet_10b = packet_6[7:0]/* synthesis noprune */;
  95.         wire [7:0] packet_11b = packet_6[15:8]/* synthesis noprune */;
  96.        
  97.         reg [11:0] gd_sector_type/* synthesis noprune */;       // No point wasting bits! (OzOnE).
  98.         reg [31:0] gd_start_sector/* synthesis noprune */;
  99.         reg [31:0] gd_sector_count/* synthesis noprune */;
  100.        
  101.         reg [3:0] gd_status;            // Only using nibble!
  102.         reg [3:0] gd_discformat;        // Only using nibble!
  103.         reg [3:0] cdda_repeats;         // Only using nibble!
  104.        
  105.         reg [23:0] cdda_curraddr;       // Using full three bytes together (need to part select when needed). OzOnE.
  106.        
  107.         reg [7:0] gd_stat [0:9];        // Array of bytes for sending status back.
  108.        
  109.         reg [9:0] reply_rom_addr;
  110.        
  111.         reg toc_density/* synthesis noprune */;
  112.         reg [15:0] toc_bytes/* synthesis noprune */;
  113.         reg [15:0] toc_byte_count/* synthesis noprune */;
  114.  
  115. // ATA Commands
  116. parameter ATA_NOP =                     8'h00;
  117. parameter ATA_SOFT_RESET =      8'h08;
  118. parameter ATA_EXEC_DIAG =       8'h90;
  119. parameter ATA_SPI_PACKET =      8'hA0;
  120. parameter ATA_IDENTIFY_DEV = 8'hA1;
  121. parameter ATA_SET_FEATURES = 8'hEF;
  122.  
  123. // SPI Packet Commands
  124. parameter SPI_TEST_UNIT =       8'h00;
  125. parameter SPI_REQ_STAT =        8'h10;
  126. parameter SPI_REQ_MODE =        8'h11;
  127. parameter SPI_SET_MODE =        8'h12;
  128. parameter SPI_REQ_ERROR =       8'h13;
  129. parameter SPI_GET_TOC =         8'h14;
  130. parameter SPI_REQ_SES =         8'h15;
  131. parameter SPI_CD_OPEN =         8'h16;
  132. parameter SPI_CD_PLAY =         8'h20;
  133. parameter SPI_CD_SEEK =         8'h21;
  134. parameter SPI_CD_SCAN =         8'h22;
  135. parameter SPI_CD_READ =         8'h30;
  136. parameter SPI_CD_READ2 =        8'h31;
  137. parameter SPI_GET_SCD =         8'h40;
  138.  
  139. initial begin
  140.         gd_state <= 10'd0;
  141.         ata_cmd <= 8'h0;
  142. //      led <= 1'b0;
  143.  
  144.         reply_rom_addr <= 10'h00;
  145.  
  146.         cf_addr <= 3'h00;       // Zero IDE address (not really necessary).
  147. //      cf_cs <= 2'b10;         // IDE CS3 = HIGH, IDE CS1 = LOW (tied on Nemesis board anyway)
  148.         cf_dma_ack <= 1'b1;     // De-assert DMA ACKnowledge (active low).
  149.        
  150.         cf_rd_n <= 1'b1;                // De-assert IDE Read at power up!
  151.         cf_wr_n <= 1'b1;                // De-assert IDE WRite at power up!
  152.         end
  153.  
  154.  
  155. always @(posedge mclock) begin
  156.         gd_wr_n_1 <= gd_wr_n;
  157.         gd_wr_n_2 <= gd_wr_n_1;
  158.  
  159.         gd_rd_n_1 <= gd_rd_n;
  160.         gd_rd_n_2 <= gd_rd_n_1;
  161.  
  162.         case (gd_state)
  163.                 0: if (gd_addr == 3'd7 && gd_wr_rising) begin  // If in COMMAND reg on RISING edge of "gd_wr_n"...
  164.                                 gd_ata_cmd <= gd_data;
  165.                                 gd_state <= 10'd2;
  166.                 end
  167.  
  168. //              1: gd_state <= 10'd2;   // Spare.
  169.  
  170.                 2: begin
  171.                         case (gd_ata_cmd[7:0])
  172.                                 ATA_NOP: gd_state <= 10'd0;                             // Unhandled? (as yet). OzOnE
  173.  
  174.                                 ATA_SOFT_RESET: gd_state <= 10'd0;              // Unhandled (as yet). OzOnE
  175.  
  176.                                 ATA_EXEC_DIAG: gd_state <= 10'd0;               // Unhandled (as yet) - not implemented on nullDC anyway. OzOnE
  177.  
  178.                                 ATA_SPI_PACKET:                                                                 // PACKET command! (Sega type, duh!)
  179.                                         if (gd_addr == 3'd0 && gd_wr_rising) begin      // If in DATA reg on RISING edge of "gd_wr_n"...
  180.                                                 packet_1 <= gd_data;                                    // Grab packet WORD 1.
  181.                                                 gd_state <= 10'd3;
  182.                                                 end
  183.  
  184.                                 ATA_IDENTIFY_DEV: gd_state <= 10'd0;    // Unhandled (as yet) - don't think it ever gets called by my DC BIOS? OzOnE
  185.  
  186.                                 ATA_SET_FEATURES: gd_state <= 10'd0;    // Unhandled (as yet). OzOnE
  187.  
  188.                         default: gd_state <= 10'd0;             // Unhandled ATA command, back to idle.
  189.                         endcase
  190.                 end
  191.                        
  192.                 3: if (gd_addr == 3'd0 && gd_wr_rising) begin
  193.                                 packet_2 <= gd_data;                                    // Grab packet WORD 2.
  194.                                 gd_state <= 10'd4;
  195.                 end
  196.  
  197.                
  198.                 4: if (gd_addr == 3'd0 && gd_wr_rising) begin
  199.                                 packet_3 <= gd_data;                                    // Grab packet WORD 3.
  200.                                 gd_state <= 10'd5;
  201.                 end
  202.  
  203.                 5: if (gd_addr == 3'd0 && gd_wr_rising) begin
  204.                                 packet_4 <= gd_data;                                    // Grab packet WORD 4.
  205.                                 gd_state <= 10'd6;
  206.                 end
  207.  
  208.                 6: if (gd_addr == 3'd0 && gd_wr_rising) begin
  209.                                 packet_5 <= gd_data[7:0];                               // Grab packet WORD 5.
  210.                                 gd_state <= 10'd7;
  211.                 end
  212.  
  213.                 7: if (gd_addr == 3'd0 && gd_wr_rising) begin
  214.                                 packet_6 <= gd_data[7:0];                               // Grab packet WORD 6.
  215.                                 gd_state <= 10'd8;
  216.                 end
  217.  
  218.                 8: begin                                                                // ** Process SPI (Sega) command packet **
  219.                         case (packet_0b)                                        // <- (byte addressing starts at zero!)
  220.  
  221.                                 SPI_TEST_UNIT: gd_state <= 10'd0;       // Unhandled (as yet). OzOnE
  222.  
  223.                                 SPI_REQ_STAT: begin
  224.                                         gd_stat[0] <= {4'b0, gd_status};        // Status is low nibble (force top bits to zero).
  225.                                         gd_stat[1] <= {gd_discformat, cdda_repeats};
  226.                                         gd_stat[2] <= 8'h04;                            // ? This is what nullDC does?
  227.                                         gd_stat[3] <= 8'd02;                            // TNO
  228.                                         gd_stat[4] <= 8'd00;                            // X
  229.                                         gd_stat[5] <= cdda_curraddr[23:16];     // Current FAD (MSB?)
  230.                                         gd_stat[6] <= cdda_curraddr[15:8];      // Current FAD
  231.                                         gd_stat[7] <= cdda_curraddr[7:0];       // Current FAD (LSB?)
  232.                                         gd_stat[8] <= 8'd00;                            // Max Read Error Retry Times.
  233.                                         gd_stat[9] <= 8'd00;                            // All bits zeros.
  234.                                        
  235.                                                                                                                 // *** TODO - SORT OUT PIO WORD OUTPUT !! ***
  236.                                
  237.                                         gd_state <= 10'd0;
  238.                                 end
  239.  
  240.                                 SPI_REQ_MODE: gd_state <= 10'd0;        // Unhandled (as yet). OzOnE
  241.  
  242.                                 SPI_SET_MODE: gd_state <= 10'd0;        // Unhandled (as yet). OzOnE
  243.  
  244.                                 SPI_REQ_ERROR: gd_state <= 10'd0;       // Unhandled (as yet). OzOnE
  245.  
  246.                                 SPI_GET_TOC: begin
  247.                                         toc_density <= packet_1b[0];                    // Request TOC from Single-density area (0) or Double-density area (1).
  248.                                         toc_bytes <= {packet_3b, packet_4b};    // Allocation length in bytes, usually 0x198 (408 bytes).
  249.                                         gd_state <= 10'd0;
  250.                                 end
  251.  
  252.                                 8'h70: gd_state <= 10'd0;                       // Unhandled (as yet). OzOnE
  253.  
  254.                                 8'h71: gd_state <= 10'd0;                       // Unhandled (as yet). OzOnE
  255.  
  256.                                 SPI_REQ_SES: gd_state <= 10'd0;         // Unhandled (as yet). OzOnE
  257.  
  258.                                 SPI_CD_OPEN: gd_state <= 10'd0;         // Unhandled (as yet). OzOnE
  259.  
  260.                                 SPI_CD_PLAY: gd_state <= 10'd0;         // Unhandled (as yet). OzOnE
  261.  
  262.                                 SPI_CD_SEEK: gd_state <= 10'd0;         // Unhandled (as yet). OzOnE
  263.  
  264.                                 SPI_CD_SCAN: gd_state <= 10'd0;         // Unhandled (as yet). OzOnE
  265.  
  266.                                 SPI_CD_READ: begin
  267.                                         if (packet_1b[7]==1 && packet_1b[6]==1 && packet_1b[5]==1 && packet_1b[3:1]==3 && packet_1b[4]==0) gd_sector_type <= 12'd2340;
  268.                                         else gd_sector_type <= 12'd2048;
  269.                                        
  270.                                         if (packet_1b[0]) begin // If "parameter type" == 1 (MSF)...
  271.                                                 gd_start_sector <= (packet_2b*60*75<<16) | (packet_3b*75<<8) | (packet_4b[2]);
  272.                                         end else
  273.                                                 gd_start_sector <= (packet_2b<<16) | (packet_3b<<8) | (packet_4b);
  274.                                        
  275.                                         gd_sector_count = (packet_8b<<16) | (packet_9b<<8) | (packet_10b);
  276.                                        
  277.                                         gd_state <= 10'd0;
  278.                                 end
  279.  
  280.                                 SPI_CD_READ2: gd_state <= 10'd0;        // Unhandled (as yet). OzOnE
  281.  
  282.                                 SPI_GET_SCD: gd_state <= 10'd0;         // Unhandled (as yet). OzOnE
  283.  
  284.                         default:  gd_state <= 10'd0;    // Unhandled SPI command, back to idle.
  285.                         endcase
  286.                 end
  287.  
  288.  
  289.         default: gd_state <= 10'd0;     // Shouldn't ever get a wrong state here, but just in case.
  290.         endcase
  291. end
  292.  
  293. wire [15:0] reply_rom_data;
  294.  
  295. reply_rom       reply_rom_inst (
  296.         .address ( reply_rom_addr ),
  297.         .clock ( mclock ),
  298.         .q ( reply_rom_data )
  299.         );
  300.  
  301. endmodule
  302.  
  303.