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

📄 minimig1.v

📁 Verilog, c and asm source codes of the Minimig system, a fpga implementation of the Amiga computer.
💻 V
📖 第 1 页 / 共 2 页
字号:
	.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 + -