📄 minimig1.v
字号:
.clk(clk), .aen(selciaa), .rd(rd), .wr(lwr), .reset(reset), .rs(address[11:8]), .datain(data[7:0]), .dataout(ciadataout[7:0]), .tick(sof),//vsync count .e(e), .irq(int2), .portain({_fire1,_fire0,_ready,_track0,_wprot,_change}), .portaout({_led,ovl}), .kbdrst(kbdrst), .kbddat(kbddat), .kbdclk(kbdclk), .osdctrl(osdctrl));//instantiate cia Bciab ciab ( .clk(clk), .aen(selciab), .rd(rd), .wr(hwr), .reset(reset), .rs(address[11:8]), .datain(data[15:8]), .dataout(ciadataout[15:8]), .tick(sol),//hsync count .e(e), .flag(indx), .irq(int6), .portain({1'b0,cts,1'b0}), .portaout({dtr,rts}), .portbout({_motor,_sel3,_sel2,_sel1,_sel0,side,direc,_step}));//instantiate cpu bridgem68k_bridge M1 ( .clk(clk), .qclk(qclk), .cen(cpuok), ._as(_as), ._lds(_lds), ._uds(_uds), .r_w(r_w), ._dtack(_dtack), .rd(cpurd), .hwr(cpuhwr), .lwr(cpulwr), .data(cpudata), .dataout(cpudataout), .datain(data));//instantiate sram bridgesram_bridge S1 ( .clk(clk), .qclk(qclk), .aen1((~ovr|~cpurd)&selchip&(~address[19])),//first 512Kbyte of chipram .aen2(selchip&address[19]&extra_chip | selslow&~extra_chip&extra_slow),//second 512Kbyte of chipram .aen3((selcart&aron) | (selslow&~aron&extra_chip&extra_slow)),//512Kbyte of slow ram or Action Replay ROM .aen4(selkick&(boot|rd)),//512Kbyte of kickstart rom (write enabled when boot asserted) .datain(data), .dataout(ramdataout), .rd(rd), .hwr(hwr), .lwr(lwr), ._ub(_ub), ._lb(_lb), ._we(_we), ._oe(_oe), ._sel0(_ramsel0), ._sel1(_ramsel1), .data(ramdata), .address19(ramaddress[19]));assign ramaddress[18:1] = address[18:1];ActionReplay AR1( .clk(clk), .reset(reset), .cpuaddress(cpuaddress[23:1]), .regaddress(regaddress), .datain(data), .dataout(cartdataout), .cpurd(cpurd), .cpuhwr(cpuhwr), .cpulwr(cpulwr), .dma(dma), .boot(boot), .freeze(osdctrl[4]), .int7(int7), .ovr(ovr), .selmem(selcart), .aron(aron));//level 7 interrupt for CPUassign _ipl = int7 ? 3'b000 : _iplx; //m68k interrupt request//instantiate garygary G1 ( .clk(clk), .e(e), .cpuaddress(cpuaddress[23:12]), .cpurd(cpurd), .cpuhwr(cpuhwr), .cpulwr(cpulwr), .cpuok(cpuok), .dma(dma), .dmawr(dmawr), .dmapri(dmapri), .ovl(ovl), .boot(boot), .rd(rd), .hwr(hwr), .lwr(lwr), .selreg(selreg), .selchip(selchip), .selslow(selslow), .selciaa(selciaa), .selciab(selciab), .selkick(selkick), .selboot(selboot) );//instantiate boot rombootrom R1 ( .clk(clk), .aen(selboot), .rd(rd), .address(cpuaddress[10:1]), .dataout(bootdataout) );//instantiate system controlsyscontrol L1 ( .clk(clk), .mrst(kbdrst|usrrst), .bootdone(selciaa&selciab), .reset(reset), .boot(boot), .bootrst(bootrst));//instantiate clock generatorclock_generator C1( .mclk(mclk), .clk28m(clk28m), //28.37516 MHz clock output .clk(clk), //7.09379 MHz clock output .clk90(qclk), .e(e));//-------------------------------------------------------------------------------------//data multiplexerassign data[15:0]=ramdataout[15:0]|cpudataout[15:0]|pauladataout[15:0]|userdataout|denisedataout[15:0]|bootdataout[15:0]|ciadataout[15:0]|agnusdataout[15:0]|cartdataout[15:0];//--------------------------------------------------------------------------------------//spi multiplexerassign spidout=(!_spisel0 || !_spisel1) ? (paulaspidout|userspidout) : 1'bz;//--------------------------------------------------------------------------------------//cpu reset and clockassign _cpureset=~reset;assign cpuclk=~clk;//--------------------------------------------------------------------------------------endmodule//--------------------------------------------------------------------------------------//--------------------------------------------------------------------------------------//--------------------------------------------------------------------------------------//syscontrol handles the startup of the FGPA,//after fpga config, it automatically does a global system reset and asserts boot.//the boot signal puts gary in a special mode so that the bootrom//is mapped into the system memory map. The firmware in the bootrom//then loads the kickstart via the diskcontroller into the kickstart ram area.//When kickstart has been loaded, the bootrom asserts bootdone by selecting both cia's at once. //This resets the system for a second time but it also de-asserts boot.//Thus, the system now boots as a regular amiga.//Subsequent resets by asserting mrst will not assert boot again.//JB://2008-07-11 - reset to bootloadermodule syscontrol( input clk, //bus clock input mrst, //master/user reset input input bootdone, //bootrom program finished input output reg reset, //global synchronous system reset output reg boot, //bootrom overlay enable output input bootrst //reset to bootloader);//local signalsreg smrst; //registered inputreg bootff=0; //boot control SHOULD BE CLEARED BY CONFIGreg [23:0]rstcnt=24'h0; //reset timer SHOULD BE CLEARED BY CONFIG//asynchronous mrst input synchronizer (JB: hmmm, it seems that all reset inputs are synchronous)always @(posedge clk) smrst <= mrst;//reset timer and mrst controlalways @(posedge clk) if(smrst || (boot && bootdone && rstcnt[23])) rstcnt <= 0; else if (!rstcnt[23]) rstcnt <= rstcnt+1;//boot controlalways @(posedge clk) if (bootrst) bootff <= 0; else if (bootdone && rstcnt[23]) bootff <= 1;//global reset outputalways @(posedge clk) reset <= ~rstcnt[23];//boot outputalways @(posedge clk) boot <= ~bootff;endmodule//--------------------------------------------------------------------------------------//--------------------------------------------------------------------------------------//--------------------------------------------------------------------------------------// This module interfaces the minimig's synchronous bus to the asynchronous sram// on the Minimig rev1.0 boardmodule sram_bridge(clk,qclk,aen1,aen2,aen3,aen4,datain,dataout,rd,hwr,lwr,_ub,_lb,_we,_oe,_sel0,_sel1,data,address19);input clk; //bus clockinput qclk; //quadrature bus clockinput aen1; //bus adress enable sram block 1input aen2; //bus adress enable sram block 2input aen3; //bus adress enable sram block 3input aen4; //bus adress enable sram block 4input [15:0] datain; //bus data inoutput [15:0] dataout; //bus data outinput rd; //bus readinput hwr; //bus high writeinput lwr; //bus low writeoutput _ub; //sram upper byteoutput _lb; //sram lower byteoutput _we; //sram write enableoutput _oe; //sram output enableoutput _sel0; //sram bank 0 enableoutput _sel1; //sram bank 1 enableinout [15:0]data; //sram dataoutput address19; //sram address line 19 wire enable; // enable signalreg p1; // used to time write and driver enablereg p2; // used to time write and driver enablereg p3; // used to time write and driver enablewire write; // write pulse timingwire drive; // output drive pulse timingwire t; // output drive enable// generate enable signal if we are adressedassign enable=aen1|aen2|aen3|aen4;// generate write pulse and data output drive pulsealways @(posedge clk) p1<=~p1;always @(negedge clk) p2<=p1;always @(negedge qclk) p3<=p1;assign write=(p2^p3);assign drive=~(p1^p2);// generate _weassign _we=~( write&enable&(hwr|lwr) ); //generate tassign t=~( drive&enable&(hwr|lwr) );// generate _oeassign _oe=~( enable & rd );// generate _ubassign _ub=~( enable & (rd|hwr) );// generate _lbassign _lb=~( enable & (rd|lwr) );// map aen1..aen4 to sram// the sram is organized in 2 1MBbyte 16bit wide memory banks// ean1..aen4 select 512kbyte banksassign _sel0=~(aen1|aen2);assign _sel1=~(aen3|aen4);assign address19=aen2|aen4;// dataout multiplexerassign dataout[15:0]=(enable && rd)?data[15:0]:16'b0000000000000000;// data tristate buffersassign data[15:0]=(t)?16'bz:datain[15:0];endmodule//--------------------------------------------------------------------------------------//--------------------------------------------------------------------------------------//--------------------------------------------------------------------------------------// This module interfaces the minimig's synchronous bus to the asynchronous // MC68SEC000 bus on the Minimig rev1.0 boardmodule m68k_bridge(clk,qclk,cen,_as,_lds,_uds,r_w,_dtack,rd,hwr,lwr,data,dataout,datain);input clk; // bus clockinput qclk; // bus quadrature clockinput cen; // bus clock enable (dma slot for m68k bridge)input _as; // m68k adress strobeinput _lds; // m68k lower data strobe d0-d7input _uds; // m68k upper data strobe d8-d15input r_w; // m68k read / writeoutput _dtack; // m68k data acknowledge to cpuoutput rd; // bus read output hwr; // bus high writeoutput lwr; // bus low writeinout [15:0] data; // m68k dataoutput [15:0] dataout; // bus data outinput [15:0] datain; // bus data inreg _dtack; // see abovewire t; // bidirectional buffer controlreg [15:0]ldatain; // latched datainreg [15:0]ldataout; // latched dataoutreg enable; // enablereg [15:0]dataout; // see output descriptionreg rd,hwr,lwr; // see output descriptionwire l_as,l_lds,l_uds,lr_w,l_dtack; // synchronised inputswire valid; // true if synchronised inputs are validreg [4:0]latcha;reg [4:0]latchb;reg [9:0]latchc;// latch input signals phase Aalways @(negedge qclk)begin latcha[0]<=_as; latcha[1]<=_lds; latcha[2]<=_uds; latcha[3]<=r_w; latcha[4]<=_dtack;end// latch input signals phase Balways @(posedge clk)begin latchb[0]<=_as; latchb[1]<=_lds; latchb[2]<=_uds; latchb[3]<=r_w; latchb[4]<=_dtack;end// latch input signals phase Calways @(posedge qclk) latchc[9:0]<={latchb[4:0],latcha[4:0]};// generate synchronised signals and valid signalassign valid=(latchc[9:5]==latchc[4:0])?1:0;assign l_as=latchc[5];assign l_lds=latchc[6];assign l_uds=latchc[7];assign lr_w=latchc[8];assign l_dtack=latchc[9]; // generate rd,hwr,lwr and enablealways @(valid or l_as or l_lds or l_uds or lr_w or l_dtack or cen)begin // normal cpu cycle if(valid && cen && !l_as && l_dtack && (!l_uds || !l_lds)) begin if(lr_w) begin// 16bit read cycle enable=1; rd=1; hwr=0; lwr=0; end else begin// 16bit or 8bit write cycle rd=0; enable=1; if(!l_uds) hwr=1; else hwr=0; if(!l_lds) lwr=1; else lwr=0; end end else begin// IDLE cycle enable=0; rd=0; hwr=0; lwr=0; endend// generate tassign t=(~r_w) | (_lds&_uds);// dtack controlalways @(negedge clk) if(l_as && valid) _dtack<=1; else if(enable) _dtack<=0;//--------------------------------------------------------------------------------------// dataout multiplexer and latch always @(posedge clk) ldataout<=data; always @(hwr or lwr or ldataout) if(hwr || lwr) dataout=ldataout; else dataout=16'b0000000000000000;// datain latchalways @(posedge clk) if(enable) ldatain<=datain;//--------------------------------------------------------------------------------------// data tristate buffersassign data[15:0]=(t)?16'bz:ldatain[15:0];endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -