Subversion Repositories pentevo

Rev

Rev 213 | Rev 284 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. `include "../include/tune.v"
  2.  
  3. module top(
  4.  
  5.         // clocks
  6.         input fclk,
  7.         output clkz_out,
  8.         input clkz_in,
  9.  
  10.         // z80
  11.         input iorq_n,
  12.         input mreq_n,
  13.         input rd_n,
  14.         input wr_n,
  15.         input m1_n,
  16.         input rfsh_n,
  17.         output int_n,
  18.         output nmi_n,
  19.         output wait_n,
  20.         output res,
  21.  
  22.         inout [7:0] d,
  23.         input [15:0] a,
  24.  
  25.         // zxbus and related
  26.         output csrom,
  27.         output romoe_n,
  28.         output romwe_n,
  29.  
  30.         output rompg0_n,
  31.         output dos_n, // aka rompg1
  32.         output rompg2,
  33.         output rompg3,
  34.         output rompg4,
  35.  
  36.         input iorqge1,
  37.         input iorqge2,
  38.         output iorq1_n,
  39.         output iorq2_n,
  40.  
  41.         // DRAM
  42.         inout [15:0] rd,
  43.         output [9:0] ra,
  44.         output rwe_n,
  45.         output rucas_n,
  46.         output rlcas_n,
  47.         output rras0_n,
  48.         output rras1_n,
  49.  
  50.         // video
  51.         output [1:0] vred,
  52.         output [1:0] vgrn,
  53.         output [1:0] vblu,
  54.  
  55.         output vhsync,
  56.         output vvsync,
  57.         output vcsync,
  58.  
  59.         // AY control and audio/tape
  60.         output ay_clk,
  61.         output ay_bdir,
  62.         output ay_bc1,
  63.  
  64.         output beep,
  65.  
  66.         // IDE
  67.         output [2:0] ide_a,
  68.         inout [15:0] ide_d,
  69.  
  70.         output ide_dir,
  71.  
  72.         input ide_rdy,
  73.  
  74.         output ide_cs0_n,
  75.         output ide_cs1_n,
  76.         output ide_rs_n,
  77.         output ide_rd_n,
  78.         output ide_wr_n,
  79.  
  80.         // VG93 and diskdrive
  81.         output vg_clk,
  82.  
  83.         output vg_cs_n,
  84.         output vg_res_n,
  85.  
  86.         output vg_hrdy,
  87.         output vg_rclk,
  88.         output vg_rawr,
  89.         output [1:0] vg_a, // disk drive selection
  90.         output vg_wrd,
  91.         output vg_side,
  92.  
  93.         input step,
  94.         input vg_sl,
  95.         input vg_sr,
  96.         input vg_tr43,
  97.         input rdat_b_n,
  98.         input vg_wf_de,
  99.         input vg_drq,
  100.         input vg_irq,
  101.         input vg_wd,
  102.  
  103.         // serial links (atmega-fpga, sdcard)
  104.         output sdcs_n,
  105.         output sddo,
  106.         output sdclk,
  107.         input sddi,
  108.  
  109.         input spics_n,
  110.         input spick,
  111.         input spido,
  112.         output spidi,
  113.         output spiint_n
  114. );
  115.  
  116.         wire dos;
  117.  
  118.  
  119.         wire zclk; // z80 clock for short
  120.  
  121.         wire zpos,zneg;
  122.  
  123.         wire rst_n; // global reset
  124.  
  125.         wire rrdy;
  126.         wire cbeg;
  127.         wire [15:0] rddata;
  128.  
  129.         wire [4:0] rompg;
  130.  
  131.         wire [7:0] zports_dout;
  132.         wire zports_dataout;
  133.         wire porthit;
  134.  
  135.  
  136.         wire [39:0] kbd_data;
  137.         wire [ 7:0] mus_data;
  138.         wire kbd_stb,mus_xstb,mus_ystb,mus_btnstb,kj_stb;
  139.  
  140.         wire [ 4:0] kbd_port_data;
  141.         wire [ 4:0] kj_port_data;
  142.         wire [ 7:0] mus_port_data;
  143.  
  144.  
  145.  
  146.  
  147.         wire [7:0] wait_read,wait_write;
  148.         wire wait_rnw;
  149.         wire wait_start_gluclock;
  150.         wire wait_start_comport;
  151.         wire wait_end;
  152.         wire [7:0] gluclock_addr;
  153.         wire [2:0] comport_addr;
  154.         wire [6:0] waits;
  155.  
  156.  
  157.  
  158.  
  159.         // config signals
  160.         wire [7:0] not_used;
  161.         wire cfg_vga_on;
  162.         wire set_nmi;
  163.  
  164.  
  165.  
  166.  
  167.         wire tape_in;
  168.  
  169.         wire [15:0] ideout;
  170.         wire [15:0] idein;
  171.         wire idedataout;
  172.  
  173.  
  174.         wire [7:0] zmem_dout;
  175.         wire zmem_dataout;
  176.  
  177.  
  178.  
  179.         reg [3:0] ayclk_gen;
  180.  
  181.  
  182.         wire [7:0] received;
  183.         wire [7:0] tobesent;
  184.  
  185.  
  186.         wire intrq,drq;
  187.         wire vg_wrFF;
  188.  
  189.         wire [1:0] rstrom;
  190.  
  191.  
  192.  
  193.  
  194.         assign zclk = clkz_in;
  195.  
  196.  
  197.         // RESETTER
  198.         wire genrst;
  199.  
  200.         resetter myrst( .clk(fclk),
  201.                         .rst_in_n(~genrst),
  202.                         .rst_out_n(rst_n) );
  203.         defparam myrst.RST_CNT_SIZE = 6;
  204.  
  205.  
  206.  
  207.         assign nmi_n=set_nmi ? 1'b0 : 1'bZ;
  208.  
  209.         assign res= ~rst_n;
  210.  
  211.  
  212.  
  213.  
  214.  
  215.         assign ide_rs_n = rst_n;
  216.  
  217.         assign ide_d = idedataout ? ideout : 16'hZZZZ;
  218.         assign idein = ide_d;
  219.  
  220.         assign ide_dir = ~idedataout;
  221.  
  222.  
  223.  
  224.  
  225.  
  226.         wire [7:0] peff7;
  227.         wire [7:0] p7ffd;
  228.  
  229.  
  230.         wire romrw_en;
  231.         wire cpm_n;
  232.  
  233.  
  234.  
  235.         wire cpu_req,cpu_rnw,cpu_wrbsel,cpu_strobe;
  236.         wire [20:0] cpu_addr;
  237.         wire [15:0] cpu_rddata;
  238.         wire [7:0] cpu_wrdata;
  239.  
  240.  
  241.         wire cend,pre_cend,go;
  242.  
  243.  
  244.         wire sd_start;
  245.         wire [7:0] sd_dataout,sd_datain;
  246.  
  247.  
  248.         wire tape_read;
  249.  
  250.  
  251.  
  252. //AY control
  253.         always @(posedge fclk)
  254.         begin
  255.                 ayclk_gen <= ayclk_gen + 4'd1;
  256.         end
  257.  
  258.         assign ay_clk = ayclk_gen[3];
  259.  
  260.  
  261.  
  262.  
  263.  
  264.         // fix ATM2-style ROM addressing for PENT-like ROM layout.
  265.         // this causes compications when writing to the flashROM from Z80
  266.         // and need to split and re-build old ATM romfiles before burning in
  267.         // flash
  268.         wire [1:0] adr_fix;
  269.         assign adr_fix = ~{ rompg[0], rompg[1] };
  270.         assign rompg0_n = ~adr_fix[0];
  271.         assign dos_n    =  adr_fix[1];
  272.  
  273.         assign rompg2   =  1'b0;//rompg[2];
  274.         assign rompg3   =  1'b0;//rompg[3];
  275.         assign rompg4   =  1'b0;//rompg[4];
  276.  
  277.         wire [3:0] zclk_stall;
  278.  
  279.         zclock zclock( .fclk(fclk), .rst_n(rst_n), .zclk(zclk), .rfsh_n(rfsh_n), .zclk_out(clkz_out),
  280.                        .zpos(zpos), .zneg(zneg),
  281.                        .turbo( {1'b0,~(peff7[4]|dos)} ), .pre_cend(pre_cend), .cbeg(cbeg),
  282.                        .zclk_stall( |zclk_stall ) );
  283.  
  284.  
  285.  
  286.         wire [7:0] dout_ram;
  287.         wire ena_ram;
  288.         wire [7:0] dout_ports;
  289.         wire ena_ports;
  290.  
  291.  
  292.         wire [2:0] border;
  293.  
  294.         wire drive_ff;
  295.  
  296.  
  297.  
  298.  
  299.  
  300.         // data bus out: either RAM data or internal ports data or 0xFF with unused ports
  301.         assign d = ena_ram ? dout_ram : ( ena_ports ? dout_ports : ( drive_ff ? 8'hFF : 8'bZZZZZZZZ ) );
  302.  
  303.  
  304.  
  305.  
  306.         zbus zxbus( .iorq_n(iorq_n), .rd_n(rd_n), .wr_n(wr_n), .m1_n(m1_n),
  307.                     .iorq1_n(iorq1_n), .iorq2_n(iorq2_n), .iorqge1(iorqge1), .iorqge2(iorqge2),
  308.                     .porthit(porthit), .drive_ff(drive_ff) );
  309.  
  310.  
  311.  
  312.  
  313.         /////////////////////////////////////
  314.         // ATM memory pagers instantiation //
  315.         /////////////////////////////////////
  316.  
  317.         wire pager_off;
  318.  
  319.         wire        pent1m_ROM;
  320.         wire [ 5:0] pent1m_page;
  321.         wire        pent1m_ram0_0;
  322.         wire        pent1m_1m_on;
  323.  
  324.         wire atmF7_wr_fclk;
  325.  
  326.         wire [3:0] dos_turn_off,
  327.                    dos_turn_on;
  328.  
  329.         wire [ 7:0] page [0:3];
  330.         wire [ 3:0] romnram;
  331.  
  332.         generate
  333.  
  334.                 genvar i;
  335.  
  336.                 for(i=0;i<4;i=i+1)
  337.                 begin : instantiate_atm_pagers
  338.  
  339.                         atm_pager #( .ADDR(i) )
  340.                                   atm_pager( .rst_n(rst_n),
  341.                                              .fclk (fclk),
  342.                                              .zpos (zpos),
  343.                                              .zneg (zneg),
  344.  
  345.                                              .za(a),
  346.                                              .zd(d),
  347.                                              .mreq_n(mreq_n),
  348.                                              .rd_n  (rd_n),
  349.                                              .m1_n  (m1_n),
  350.  
  351.                                              .pager_off(pager_off),
  352.  
  353.                                              .pent1m_ROM   (pent1m_ROM),
  354.                                              .pent1m_page  (pent1m_page),
  355.                                              .pent1m_ram0_0(pent1m_ram0_0),
  356.                                              .pent1m_1m_on (pent1m_1m_on),
  357.  
  358.                                              .atmF7_wr(atmF7_wr_fclk),
  359.  
  360.                                              .dos(dos),
  361.  
  362.                                              .dos_turn_on (dos_turn_on[i]),
  363.                                              .dos_turn_off(dos_turn_off[i]),
  364.  
  365.                                              .zclk_stall(zclk_stall[i]),
  366.  
  367.                                              .page   (page[i]),
  368.                                              .romnram(romnram[i])
  369.                                            );
  370.                 end
  371.  
  372.         endgenerate
  373.  
  374.  
  375.         ///////////////////////////
  376.         // DOS signal controller //
  377.         ///////////////////////////
  378.  
  379.         zdos zdos( .rst_n(rst_n),
  380.  
  381.                    .fclk(fclk),
  382.  
  383.                    .dos_turn_on ( |dos_turn_on  ),
  384.                    .dos_turn_off( |dos_turn_off ),
  385.  
  386.                    .cpm_n(cpm_n),
  387.  
  388.                    .dos(dos)
  389.                  );
  390.  
  391.  
  392.  
  393.  
  394.         ///////////////////////////
  395.         // Z80 memory controller //
  396.         ///////////////////////////
  397.  
  398.         zmem z80mem( .fclk(fclk), .rst_n(rst_n), .zpos(zpos), .zneg(zneg),
  399.                      .cend(cend), .pre_cend(pre_cend), .za(a), .zd_in(d),
  400.                      .zd_out(dout_ram), .zd_ena(ena_ram), .m1_n(m1_n),
  401.                      .rfsh_n(rfsh_n), .iorq_n(iorq_n), .mreq_n(mreq_n),
  402.                      .rd_n(rd_n), .wr_n(wr_n),
  403.  
  404.                      .win0_romnram(romnram[0]),
  405.                      .win1_romnram(romnram[1]),
  406.                      .win2_romnram(romnram[2]),
  407.                      .win3_romnram(romnram[3]),
  408.  
  409.                      .win0_page(page[0]),
  410.                      .win1_page(page[1]),
  411.                      .win2_page(page[2]),
  412.                      .win3_page(page[3]),
  413.  
  414.                      .romrw_en(romrw_en),
  415.  
  416.                      .rompg(rompg),
  417.                      .romoe_n(romoe_n),
  418.                      .romwe_n(romwe_n),
  419.                      .csrom(csrom),
  420.  
  421.                      .cpu_req   (cpu_req),
  422.                      .cpu_rnw   (cpu_rnw),
  423.                      .cpu_wrbsel(cpu_wrbsel),
  424.                      .cpu_strobe(cpu_strobe),
  425.                      .cpu_addr  (cpu_addr),
  426.                      .cpu_wrdata(cpu_wrdata),
  427.                      .cpu_rddata(cpu_rddata)
  428.                    );
  429.  
  430.  
  431.  
  432.  
  433.  
  434.  
  435.         wire [20:0] daddr;
  436.         wire dreq;
  437.         wire drnw;
  438.         wire [15:0] drddata;
  439.         wire [15:0] dwrdata;
  440.         wire [1:0] dbsel;
  441.  
  442.  
  443.  
  444.  
  445.         dram dram( .clk(fclk),
  446.                    .rst_n(rst_n),
  447.  
  448.                    .addr(daddr),
  449.                    .req(dreq),
  450.                    .rnw(drnw),
  451.                    .cbeg(cbeg),
  452.                    .rrdy(drrdy),
  453.                    .rddata(drddata),
  454.                    .wrdata(dwrdata),
  455.                    .bsel(dbsel),
  456.  
  457.                    .ra(ra),
  458.                    .rd(rd),
  459.                    .rwe_n(rwe_n),
  460.                    .rucas_n(rucas_n),
  461.                    .rlcas_n(rlcas_n),
  462.                    .rras0_n(rras0_n),
  463.                    .rras1_n(rras1_n)
  464.                  );
  465.  
  466.  
  467.         wire [1:0] bw;
  468.  
  469.         wire [20:0] video_addr;
  470.         wire [15:0] video_data;
  471.         wire video_strobe;
  472.         wire video_next;
  473.  
  474.         arbiter dramarb( .clk(fclk),
  475.                          .rst_n(rst_n),
  476.  
  477.                          .dram_addr(daddr),
  478.                          .dram_req(dreq),
  479.                          .dram_rnw(drnw),
  480.                          .dram_cbeg(cbeg),
  481.                          .dram_rrdy(drrdy),
  482.                          .dram_bsel(dbsel),
  483.                          .dram_rddata(drddata),
  484.                          .dram_wrdata(dwrdata),
  485.  
  486.                          .cend(cend),
  487.                          .pre_cend(pre_cend),
  488.  
  489.                          .go(go),
  490.                          .bw(bw),
  491.  
  492.                          .video_addr(video_addr),
  493.                          .video_data(video_data),
  494.                          .video_strobe(video_strobe),
  495.                          .video_next(video_next),
  496.  
  497.                          //.cpu_waitcyc(cpu_waitcyc),
  498.                          //.cpu_stall(cpu_stall),
  499.                          .cpu_req(cpu_req),
  500.                          .cpu_rnw(cpu_rnw),
  501.                          .cpu_addr(cpu_addr),
  502.                          .cpu_wrbsel(cpu_wrbsel),
  503.                          .cpu_wrdata(cpu_wrdata),
  504.                          .cpu_rddata(cpu_rddata),
  505.                          .cpu_strobe(cpu_strobe) );
  506.  
  507.  
  508.         wire vga_hsync,hsync,hblank,hpix,hsync_start,line_start,hint_start,scanin_start,scanout_start;
  509.  
  510.         synch horiz_sync( .clk(fclk), .init(1'b0), .cend(cend), .pre_cend(pre_cend),
  511.                           .hsync(hsync), .hblank(hblank), .hpix(hpix), .hsync_start(hsync_start),
  512.                           .line_start(line_start), .hint_start(hint_start), .scanin_start(scanin_start) );
  513.  
  514.  
  515.         wire vblank,vsync,int_start,vpix;
  516.  
  517.         syncv vert_sync( .clk(fclk), .hsync_start(hsync_start), .line_start(line_start),
  518.                          .vblank(vblank), .vsync(vsync), .int_start(int_start),
  519.                          .vpix(vpix), .hint_start(hint_start) );
  520.  
  521.         vga_synch vga_synch( .clk(fclk), .hsync_start(hsync_start), .vga_hsync(vga_hsync), .scanout_start(scanout_start) );
  522.  
  523.  
  524.  
  525.         wire [5:0] pixel;
  526.  
  527.         fetch fecher( .clk(fclk), .cend(cend), .line_start(line_start), .vpix(vpix), .int_start(int_start),
  528.                       .vmode( {peff7[0],peff7[5]} ), .screen(p7ffd[3]), .video_addr(video_addr), .video_data(video_data),
  529.                       .video_strobe(video_strobe), .video_next(video_next), .go(go), .bw(bw), .pixel(pixel) );
  530.  
  531.  
  532.  
  533.  
  534.         videoout vidia( .clk(fclk), .pixel(pixel), .border({ border[1],1'b0,border[2],1'b0,border[0],1'b0 }),
  535.                         .hblank(hblank), .vblank(vblank), .hpix(hpix), .vpix(vpix), .hsync(hsync), .vsync(vsync),
  536.                         .vred(vred), .vgrn(vgrn), .vga_hsync(vga_hsync), .vblu(vblu),
  537.                         .vhsync(vhsync), .vvsync(vvsync), .vcsync(vcsync), .hsync_start(hsync_start),
  538.                         .scanin_start(scanin_start), .scanout_start(scanout_start), .cfg_vga_on(cfg_vga_on) );
  539.  
  540.  
  541.  
  542.  
  543.  
  544.  
  545.  
  546.         slavespi slavespi( .fclk(fclk), .rst_n(rst_n),
  547.                            .spics_n(spics_n), .spidi(spidi),
  548.                            .spido(spido), .spick(spick),
  549.                            .status_in({wait_rnw, waits[6:0]}), .genrst(genrst),
  550.                            .rstrom(rstrom), .kbd_out(kbd_data),
  551.                            .kbd_stb(kbd_stb), .mus_out(mus_data),
  552.                            .mus_xstb(mus_xstb), .mus_ystb(mus_ystb),
  553.                            .mus_btnstb(mus_btnstb), .kj_stb(kj_stb),
  554.                            .gluclock_addr(gluclock_addr),
  555.                            .comport_addr (comport_addr),
  556.                            .wait_write(wait_write),
  557.                            .wait_read(wait_read),
  558.                            .wait_rnw(wait_rnw),
  559.                            .wait_end(wait_end),
  560.                            .config0( { not_used[7:3], tape_read, set_nmi, cfg_vga_on} )
  561.                          );
  562.  
  563.         zkbdmus zkbdmus( .fclk(fclk), .rst_n(rst_n),
  564.                          .kbd_in(kbd_data), .kbd_stb(kbd_stb),
  565.                          .mus_in(mus_data), .mus_xstb(mus_xstb),
  566.                          .mus_ystb(mus_ystb), .mus_btnstb(mus_btnstb),
  567.                          .kj_stb(kj_stb), .kj_data(kj_port_data),
  568.                          .zah(a[15:8]), .kbd_data(kbd_port_data),
  569.                          .mus_data(mus_port_data)
  570.                        );
  571.  
  572.  
  573.         zports zports( .zclk(zclk), .fclk(fclk), .rst_n(rst_n), .zpos(zpos), .zneg(zneg),
  574.                        .din(d), .dout(dout_ports), .dataout(ena_ports),
  575.                        .a(a), .iorq_n(iorq_n), .rd_n(rd_n), .wr_n(wr_n), .porthit(porthit),
  576.                        .ay_bdir(ay_bdir), .ay_bc1(ay_bc1), .border(border), .beep(beep),
  577.                        .p7ffd(p7ffd), .peff7(peff7), .mreq_n(mreq_n), .m1_n(m1_n), .dos(dos),
  578.                        .rstrom(rstrom), .vg_intrq(intrq), .vg_drq(drq), .vg_wrFF(vg_wrFF),
  579.                        .vg_cs_n(vg_cs_n), .sd_start(sd_start), .sd_dataout(sd_dataout),
  580.                        .sd_datain(sd_datain), .sdcs_n(sdcs_n),
  581.                        .idein(idein), .ideout(ideout), .idedataout(idedataout),
  582.                        .ide_a(ide_a), .ide_cs0_n(ide_cs0_n), .ide_cs1_n(ide_cs1_n),
  583.                        .ide_wr_n(ide_wr_n), .ide_rd_n(ide_rd_n),
  584.  
  585.                        .keys_in(kbd_port_data),
  586.                        .mus_in(mus_port_data),
  587.                        .kj_in(kj_port_data),
  588.  
  589.                        .tape_read(tape_read),
  590.  
  591.                        .gluclock_addr(gluclock_addr),
  592.                        .comport_addr (comport_addr),
  593.                        .wait_start_gluclock(wait_start_gluclock),
  594.                        .wait_start_comport (wait_start_comport),
  595.                        .wait_rnw(wait_rnw),
  596.                        .wait_write(wait_write),
  597.                        .wait_read(wait_read),
  598.  
  599.                        .atmF7_wr_fclk(atmF7_wr_fclk),
  600.  
  601.                        .atm_scr_mode(),
  602.                        .atm_turbo   (),
  603.                        .atm_pen     (pager_off),
  604.                        .atm_cpm_n   (cpm_n),
  605.                        .atm_pen2    (),
  606.  
  607.                        .romrw_en(romrw_en),
  608.  
  609.                        .pent1m_ram0_0(pent1m_ram0_0),
  610.                        .pent1m_1m_on (pent1m_1m_on),
  611.                        .pent1m_page  (pent1m_page),
  612.                        .pent1m_ROM   (pent1m_ROM)
  613.  
  614.                      );
  615.  
  616.  
  617.         zint preryv( .fclk(fclk), .zclk(zclk), .int_start(int_start), .iorq_n(iorq_n), .m1_n(m1_n),
  618.                      .int_n(int_n) );
  619.  
  620.  
  621.  
  622.         zwait zwait( .wait_start_gluclock(wait_start_gluclock),
  623.                      .wait_start_comport (wait_start_comport),
  624.                      .wait_end(wait_end),
  625.                      .rst_n(rst_n),
  626.                      .wait_n(wait_n),
  627.                      .waits(waits),
  628.                      .spiint_n(spiint_n) );
  629.  
  630. //      assign wait_n = 1'bZ; // WTF??? FIXME,FIXME,FIXME,FIXME,FIXME,FIXME,FIXME,FIXME,FIXME,FIXME,FIXME,FIXME,FIXME
  631.  
  632.  
  633.  
  634.  
  635.         wire [1:0] vg_ddrv;
  636.         assign vg_a[0] = vg_ddrv[0] ? 1'b1 : 1'b0; // possibly open drain?
  637.         assign vg_a[1] = vg_ddrv[1] ? 1'b1 : 1'b0;
  638.  
  639.         vg93 vgshka( .zclk(zclk), .rst_n(rst_n), .fclk(fclk), .vg_clk(vg_clk),
  640.                      .vg_res_n(vg_res_n), .din(d), .intrq(intrq), .drq(drq), .vg_wrFF(vg_wrFF),
  641.                      .vg_hrdy(vg_hrdy), .vg_rclk(vg_rclk), .vg_rawr(vg_rawr), .vg_a(vg_ddrv),
  642.                      .vg_wrd(vg_wrd), .vg_side(vg_side), .step(step), .vg_sl(vg_sl), .vg_sr(vg_sr),
  643.                      .vg_tr43(vg_tr43), .rdat_n(rdat_b_n), .vg_wf_de(vg_wf_de), .vg_drq(vg_drq),
  644.                      .vg_irq(vg_irq), .vg_wd(vg_wd) );
  645.  
  646.  
  647.  
  648.  
  649.         spi2 zspi( .clock(fclk), .sck(sdclk), .sdo(sddo), .sdi(sddi), .start(sd_start),
  650.                    .speed(2'b00), .din(sd_datain), .dout(sd_dataout) );
  651.  
  652. endmodule
  653.  
  654.