⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uusb_mmc_sm.v

📁 实现USB接口功能的VHDL和verilog完整源代码
💻 V
字号:
/*    
# --------------------------------------------------------------------------
#    Module      : Uusb_dual.v 
#     
#    Revision     : $Revision: 1.37 $
#    
#---------------------------------------------------------------------------
#   Purpose : 
#-------------------------------------------------------------------------
*/   

// FOR FPGA TEST TOP MODULE  

module Uusb_mmc_sm
	(
	// inputs from bus
                testmode,
                testreset,
		pwronresetb,
		//sm64_enable,
		clock48,	// 48 MHz clock
		rcvin,		// differential in
		vpin,		// plus in
		vmin,		// minus in
                // inputs from smart media
                card_ready,
                smart_rd_data,

		vmo,		// minus out
		vpo,		// plus out
		usboen,	// oe for usb bits
		suspend,
		usbclock,
		usbclockout,

         gpiopin0,
		 gpiopin1,
		 gpiopin2,
		 gpiopin3,
		 gpiopin4,
		 gpiopin5,
		 gpiopin6,
		 gpiopin7,
		  // in /out for mmc
                dataout_dat_in,
                dataout_dat_out,
                dataout_dat_enable,

//                data_cf_in,
                disablebus,
                //sm64_enable,
                clock_fc_out,

//                data_fc_out,
                datain_cmd_in,
                datain_cmd_out,
                datain_cmd_enable,
           // for MCU I/F
				data_in,
				data_out,
				clk_mcu,
                // outputs to smart media
                mcclock_out,
                mcclock,
                ale,
                cle,
                reb,
                web,
                wpb,
                out_enable,
                smart_wr_data

	);
  
  input      testmode;
  input      testreset;
  input      pwronresetb;
  //input      sm64_enable;
  input	     clock48;
  input	     rcvin;
  input	     vpin;
  input	     vmin;

  input      dataout_dat_in;
  output     dataout_dat_out;
  output     dataout_dat_enable;

  input              card_ready;
  input        [7:0] smart_rd_data;

  output     vmo;
  output     vpo;
  output     usboen;
  output     suspend;
  output     clock_fc_out;
  input      datain_cmd_in;
  output     datain_cmd_out;
  output     datain_cmd_enable;

  output     disablebus;
  output     mcclock_out;
  input      mcclock;
  input      usbclock;
  output     usbclockout;
  output             ale;
  output             cle;
  output             reb;
  output             web;
  output             wpb;
  output             out_enable;
  output       [7:0] smart_wr_data;

  input     gpiopin0;
  input     gpiopin1;
  input     gpiopin2;

  output    gpiopin3;
  output    gpiopin4;
  output    gpiopin5;
  output    gpiopin6;
  output    gpiopin7;

  output   data_out;
  output   clk_mcu;
  input    data_in;

// wires for endpoints
wire      out_enable1;
  wire	     endp0rdstall = 1'b0;
  wire	     endp0wrstall = 1'b0;
  wire      endp3rdready = 1'b1;

  wire [7:0] currentalternatesetting;
  wire [7:0] endpwrdata;
  wire [7:0] endp2rddata;
  wire [7:0] endp3rddata;
  wire [7:0] endp0rddata;
  wire [6:0] devromdescriptorindex;
  wire [7:0] devromsetupaddr;
  wire [7:0] romdevsetupdata;
  wire [2:0] setupbyteaddr = 3'b000;
  wire [7:0] setupdataout;	// one of 8 bytes of the setup stage data
  wire[10:0] framenumber;
  wire[15:0] datawr3data;
  wire[2:0] clockrate;
  wire[2:0] setmode;
wire spimode = (setmode == 3'b001) ? 1'b1 : 1'b0;
wire enmmc   = (setmode == 3'b010 || setmode == 3'b001) ? 1'b1 : 1'b0;
wire disablebus =(setmode == 3'b000 || setmode == 3'b001) ? 1'b1 : 1'b0; 
wire sm64_enable  = (setmode == 3'b100) ? 1'b1 :1'b0;
wire sm_enable = (setmode == 3'b011 || setmode == 3'b100) ? 1'b1 : 1'b0;

wire busy_end_out;
wire busy_end_mmc = (enmmc && !spimode) ? busy_end_out:1'b1;

Ucore core (
        .testmode(testmode),
        .testreset(testreset),
        .clock48 (clock48),
        .rcvin (rcvin),
        .vpin (vpin),
        .vmin (vmin),
        .vmo (vmo),
        .vpo (vpo),
        .usboen (usboen),
        .usbclockout (usbclockout),
        .usbclock (usbclock),
        .pwronreset(~pwronresetb),
    	.usbreset (usbreset),
    	.endpwrdata (endpwrdata),
    	.datapacketok (datapacketok),
    	.datapacketnotok (datapacketnotok),
        .devromdescriptorindex(devromdescriptorindex),
        .devromsetupaddr(devromsetupaddr),
        .romdevsetupdata(romdevsetupdata),
    	.romen(romen),
    	.endp0internaltogglebit(endp0internaltogglebit),
        .setupcycle(setupcycle),
        .setupbyteaddr(setupbyteaddr),
        .setupdata(setupdataout),
	    .rcvack(rcvack),
	    .suspend(suspend),
		.synthsof(synthsof),
	    .framenumber(framenumber),
	    .currentalternatesetting (currentalternatesetting),

        `include "Uvendorconnections.v"
 
	// connections to endpoint0 - read/write
	.endp0wr (endp0wr),
	.endp0wrready (endp0wrready),
	.endp0wrstall (endp0wrstall),
	.endp0rd (endp0rd),
	.endp0rddata (endp0rddata),
	//.endp0rdready (1'b1),
	.endp0rdready (endp0rdready && busy_end_mmc),
	.endp0rdstall (endp0rdstall),

	// connections to endpoint1 - write only
	.endp1wr (endp1wr),
	.endp1wrready (endp1wrready),
	//.endp1wrstall (endp1wrstall),

	// connections to endpoint2 - read only
	.endp2rd (endp2rd),
	.endp2rddata(endp2rddata),
	.endp2rdready(endp2rdready),
	//.endp2rdstall (endp2rdstall),
	
	.endp3rd (endp3rd),
	.endp3rddata(endp3rddata),
	.endp3rdready(endp3rdready)
	//.endp3rdstall (endp3rdstall)
	
	);
wire[7:0] datarddata;
wire[7:0] statusdatammc;
wire[7:0] statusdatasm;
wire[7:0] datawrdatammc;
wire[7:0] datawrdatasm;
wire[7:0] cmddatamc;



wire clock48mmc  = clock48;
wire cmdrdmmc , cmdrdsm;
wire statuswrmmc, statuswrsm;
wire datardmmc,datardsm;
wire datawrmmc, datawrsm;
wire cmdrdmc = (enmmc) ? cmdrdmmc : cmdrdsm ;
wire statuswrmc =(enmmc)? statuswrmmc : statuswrsm ;
wire[7:0]  statusdatamc =(enmmc)? statusdatammc :statusdatasm;
wire datard = (enmmc) ? datardmmc :datardsm;
wire datawr = (enmmc) ? datawrmmc :datawrsm;
wire[7:0] datawrdata = (enmmc)? datawrdatammc :datawrdatasm;
wire clock_5m, sync_reset_made ;

reg sofmmc;
always@(posedge mcclock)
 sofmmc <= synthsof;

UCtlreg ctlreg (
				.getbusy(getbusy),
				.getstatus(getstatus),
				.getstatuscheck(getstatuscheck),
				.usbclock(usbclock),
				.mcclock(mcclock),
				.syncreset(usbreset),
				.mcreset(mcreset),
				.datapacketok(datapacketok),
				.datapacketnotok(datapacketnotok),
				.cmdwrusb(endp0wr),
				.statusrdusb(endp0rd),
				.cmddatausb(endpwrdata),
				.statusdatausb(endp0rddata),
				.statusrdreadyusb(endp0rdready),
				.cmdwrreadyusb(endp0wrready),
                              // Memory Card
				.cmdrdmc(cmdrdmc),
				.cmddatamc(cmddatamc),
				.statuswrmc(statuswrmc),
				.statusdatamc(statusdatamc),
				.statuswrreadymc(statuswrreadymc),
				.cmdrdreadymc(cmdrdreadymc),
				// Configuration of MMC or SSFDC
				.enmmc(enmmc)//(enmmc)
				);
reg getdataout;
reg getstatusmc;
reg getstatuscheckmc;
reg setcmdwrmc;
reg getbusymc;

always@(posedge mcclock)
 begin
	getdataout <= getdata || setcmdrd;
	getstatusmc <=getstatus;
	getstatuscheckmc <= getstatuscheck;
	setcmdwrmc <= setcmdwr;
	getbusymc <= getbusy;
 end


usbmmc u_usbmmc   (
				.getstatus_check(getstatuscheckmc),
                .busy_end_out(busy_end_out),
				.sof(sofmmc),
                .usb_48_clock_uf_in(clock48mmc),
                .usb_clock_uf_in(usbclock),
                .mmc_enable(enmmc),
                //.disablebus(disablebus),
                .spimode(spimode),
                .divide_rate(clockrate),
                .sync_reset_uf_in(usbreset),
                .clock_5m_out(mcclock_out),
                .clock_5m(mcclock),
                //.sync_reset_made(sync_reset_made),
                .sync_reset_made(mcreset),
                .dataout_dat_in(dataout_dat_in),
                .dataout_dat_out(dataout_dat_out),
                .dataout_dat_enable(dataout_dat_enable),

                .getstatus(getstatusmc),
                .getdata(getdataout),

                .cmdrdready_uf_in(cmdrdreadymc),
                .cmdrddata_uf_in(cmddatamc),

                .endp1rdready_uf_in(datardready),
                .endp1rddata_uf_in(datarddata),

                .statuswrready_uf_in(statuswrreadymc),
                .endp2wrready_uf_in(datawrready),

                .cmdrd_fu_out(cmdrdmmc),
                .cmdrddatadone_fu_out(cmddatadone),

                .statuswr_fu_out(statuswrmmc),
                .statuswrdata_fu_out(statusdatammc),
                .statuswrdatadone_fu_out(statuswrdone),

                .endp1rd_fu_out(datardmmc),
                .endp1rddatadone_fu_out(datarddone),

                .endp2wr_fu_out(datawrmmc),
                .endp2wrdata_fu_out(datawrdatammc),
                .endp2wrdatadone_fu_out(datawrdone),
                .data_in(data_in),
				.data_out(data_out),
				.clk_mcu(clk_mcu),
                .setcmdwr(setcmdwrmc),
                .clock_fc_out(clock_fc_out),
                .datain_cmd_in(datain_cmd_in),
                .datain_cmd_out(datain_cmd_out),
                .datain_cmd_enable(datain_cmd_enable),
                .endp3(datawr3data)
                );
wire[7:0] smart_rd_data;
wire[7:0] smart_wr_data;

smarti  u_smarti(
           .mcclock(mcclock),
           .mcreset(mcreset),
           .sm_enable(sm_enable),
	   .sof(sofmmc),
	   .sm64_enable(sm64_enable),
           .disablebus(disablebus),
           .cmdrdready(cmdrdreadymc),
           .statuswrready(statuswrreadymc),
           .getbusy(getbusymc),
           .getstatus(getstatusmc),
           .getdata(getdataout),
           .datardready(datardready),
           .datawrready(datawrready),
           .cmddata(cmddatamc),
           .datarddata(datarddata),
           .card_ready(card_ready),
           .smart_rd_data(smart_rd_data),

           .cmdrd(cmdrdsm),
           .statuswr(statuswrsm),
           .statusdata(statusdatasm),
           .datard(datardsm),
           .datawr(datawrsm),
           .datawrdata(datawrdatasm),
           .web(web),
           .reb(reb),
           .cle(cle),
           .ale(ale),
           //.wpb(wpb),
           .out_enable(out_enable1),
           //.sm_state(sm_state), rha 11.29
           .smart_wr_data(smart_wr_data)
           );

assign out_enable = ~out_enable1;
Ufifo3rd endpoint3rd(
	   .usbclock(usbclock),
	   .syncreset(usbreset),
	   .fiford(endp3rd),
	   .fifowrdata(datawr3data),
	   .fiforddata(endp3rddata)
	   );

Udevrom rom (
	// addressing
	.devromdescriptorindex (devromdescriptorindex),
	.devromsetupaddr (devromsetupaddr),

	// read port
	.romdevsetupdata (romdevsetupdata)
	);

Ufifo endpoint1wr (
          .usbclock(usbclock),
          .mcclock(mcclock),
          .syncreset(usbreset),
          .mmcreset(mcreset),
          // To Fifo
          .fifowrdata(endpwrdata),
          // write port USB
          .fifowr(endp1wr),
          .fifowrready(endp1wrready),
          .datapacketok(datapacketok),
          .datapacketnotok(datapacketnotok),
          // read port M/C
          .fiforddata(datarddata),
          .fiford(datard),   // 8051 make the read strobe for getting data
          .fifordready(datardready)
          );

Ufiforx endpoint2rd (
          .setcmdwr(setcmdwr),
		  .getdata(getdataout),
		  .mcclock(mcclock),
          .usbclock(usbclock),
          .syncreset(usbreset),
          .mmcreset(mcreset),
          // To fifo
          .fiforddata(endp2rddata),
          // write port  M/C
          .fifowr(datawr),
          .fifowrdata(datawrdata),
          .fifowrready(datawrready),
          .datapacketok(datapacketok),
          .datapacketnotok(datapacketnotok),
          // read port  USB
          .fiford(endp2rd),
          .fifordready(endp2rdready)
          );


endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -