📄 uusb_mmc_sm.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 + -