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

📄 q6805_cpu.v

📁 q6805.zip
💻 V
字号:

`timescale 1ns/1ns  

module Q6805_CPU( CLK_2Xi,
				  CLK_2Xo,
				  CPU_CLK,
 				  WClockp,
				  EClock,
				  EClock_n,
				  EClockStretch,
			  	  CPU_PC,
				  RD_D,
				  WR_D,
			      WR_n,
			      WRDELq,
			      WRQ1,	
			      RD_n,
				  RDQ1,
			      OPCOD_n,
			      FETCH_n,
			      IACK_n,
			      DISC_n,
				  INT,
				  ACC,
				  XREG,
				  CCR,
				  PROD,
				  VECTOR,
				  STACK_BASE,
				  STK_PTR,
			      WAITNG_n,
			      STOPD_n,
			      RESET_n,
				  RESET,
		          READY,
			      CPU_RDY,
				  MULE,
			      TCK,
			      TDI,
			      TDO,
			      TMS,
			      TRST_n,
				  EVNT0_n,
				  EVNT1_n );

input CLK_2Xi;
inout CLK_2Xo;
output WClockp;
output CPU_CLK;
output EClock;
inout EClock_n;
output EClockStretch;
output [15:0] CPU_PC;
input  [7:0] RD_D;
output [7:0] WR_D;
output WR_n;
output WRDELq;
output WRQ1;
output RD_n;
output RDQ1;
output OPCOD_n;
output FETCH_n;
output IACK_n;
output DISC_n;
input  [5:0] INT;
output [7:0] ACC;
output [15:0] XREG;
output [7:0] CCR;
input  [15:0] PROD;
input  [15:5] VECTOR;
input  [15:6] STACK_BASE;
output [15:0] STK_PTR;
output WAITNG_n;
output STOPD_n;
input  RESET_n;
output RESET;
input  READY;
output CPU_RDY;
input  MULE;
input  TCK;
input  TDI;
input  TMS;
input  TRST_n;
output TDO;
inout  EVNT0_n;
output EVNT1_n;

reg Clock;
reg EClockStretch;
reg ResetSync;
reg WClock;




wire [7:0] RD_D;
wire [7:0] WR_D;
wire EClock;


wire WRq;
wire WRDELq;
wire CPU_RESET;
wire [15:0] CPU_PC;
wire [7:0] MON_INST;
wire [7:0] MON_WR_DAT;
wire [15:0] MON_ADR;
wire [15:0] STK_PTR;
wire CLK_LM;
wire CPU_RDY;
wire MFUNC;
wire MON_CYC_CMPLT;
wire MCMPLT_n;
wire MSR_CMPLT;
wire MON_IN_SRVC;
wire MON_IN_SRVC_n;
wire WAITNG;
wire MFUNC_REQ;
wire STOPD;
wire BRK_CMPLT;
wire BRK_CMPLT_n;
wire BRK_IN_SRVC;
wire BRK_IN_SRVC_n;
wire UPDAT_STAT;
wire BRK_PND;
wire BRK_REQ;
wire BRK_REQ_n;
wire OPCODq;
wire DSCNTYq;
wire IACKq;
wire RD;
wire FETCHq;
wire BREAK;
wire CNTR_EVNT;
wire EVNT0_IN;
wire XCLK_L;		
wire READY;	
wire RESET;
wire CPU_CLK;
wire TCK;	
wire TMS;	
wire TDO_OE;
wire TDO;
wire J_TDO;	
wire TDI;	
wire J_XTRST;
wire OSCi;
wire OSCi_n;
wire OSCobi_n;
wire OSCobi;
wire EVNT1_n;
wire EVNT0_n;
wire [7:0] ACC;
wire [15:0] XREG;
wire [7:0] CCR;
wire [15:0] PROD;
wire [15:5] VECTOR;
wire [15:6] STACK_BASE;
wire FETCH1;
wire IACK1;
wire WRQ1;
wire MULE = 1'b0;
wire WR_n;
wire RDQ1;
wire RD_CLK;




assign WR_n = !WRq;

assign CLK_LM = WClock;
assign WAITNG_n = !WAITNG;
assign OPCOD_n = !OPCODq;
assign STOPD_n = !STOPD;
assign IACK_n = !IACKq;
assign RD_n = !RD;
assign FETCH_n = !FETCHq;
assign EVNT1_n = CNTR_EVNT ? 1'b0 : 1'bz;
assign EVNT0_IN = !EVNT0_n;
assign EVNT0_n = BREAK ? 1'b0 : 1'bz;
assign XCLK_L = !CPU_CLK;		 
assign TDO = TDO_OE ? J_TDO : 1'bz;	
assign DISC_n = !DSCNTYq;
assign BRK_REQ_n = !BRK_REQ;
assign BRK_IN_SRVC_n = !BRK_IN_SRVC;
assign MCMPLT_n = !MON_CYC_CMPLT;
assign MON_IN_SRVC_n = !MON_IN_SRVC;
assign BRK_CMPLT_n = !BRK_CMPLT;

assign OSCi_n = !(CLK_2Xi & !STOPD);
assign OSCi   =   CLK_2Xi & !STOPD;
assign CLK_2Xo = OSCi_n;				
assign OSCobi_n = CLK_2Xo;
assign OSCobi = !CLK_2Xo;
assign EClock = !Clock;
assign EClock_n = Clock;
assign WClockp = WClock;



//gclkbuff_25um cpu_gclk(.A(Clock), .Z(CPU_CLK));


assign CPU_CLK = Clock;

initial begin					 // this is just to put the register in a known state for simulation purposes
	force WClock = 1'b0;
	force Clock = 1'b0;
	force EClockStretch = 1'b1;
	force ResetSync = 1'b1;

	#10
	release WClock;
	release Clock;
	release EClockStretch;
	release ResetSync;
end


core core ( 
		 .ACC({ACC[7:0]}),
		 .BRK_CMPLT(BRK_CMPLT),
 		 .BRK_IN_SRVC(BRK_IN_SRVC), 
 		 .BRK_PND(BRK_PND),
		 .CCR({CCR[7:0]}),
         .CLK(CPU_CLK), 
         .CLK_LM(CLK_LM), 
         .CPU_RDY(CPU_RDY),
         .DB(RD_D), 
         .DISCNTY_G(DSCNTYq), 
         .DOUT({ WR_D[7:0] }),
         .FETCH(FETCHq), 
         .FETCH1(FETCH1), 
         .FRST_WRD(OPCODq),
         .IACK(IACKq), 
         .IACK1(IACK1), 
         .INT({ INT[5:0] }), 
         .MFUNC(MFUNC),
         .MFUNC_REQ(MFUNC_REQ), 
         .MON_ADRS({ MON_ADR[15:0] }),
         .MON_CYC_CMPLT(MON_CYC_CMPLT), 
         .MON_IN_SRVC(MON_IN_SRVC),
         .MON_INST({ MON_INST[7:0] }), 
         .MON_WR_DAT({ MON_WR_DAT[7:0] }),
		 .MULE(MULE),
         .MSR_CMPLT(MSR_CMPLT), 
         .NMI(BRK_REQ), 
         .PC({ CPU_PC[15:0] }), 
		 .PROD({PROD[15:0]}),
         .RD(RD),
         .RDQ1(RDQ1), 
         .READY(READY), 
         .RESET(RESET),
         .STACK({ STK_PTR[15:0] }), 
		 .STACK_BASE({STACK_BASE[15:6]}),
         .STOPD(STOPD), 
         .UPDAT_STAT(UPDAT_STAT),
		 .VECTOR({VECTOR[15:5]}),
         .WAITNG(WAITNG), 
         .WR(WRq), 
         .WR_DEL(WRDELq), 
         .WRQ1(WRQ1),
         .XCLK_L(XCLK_L),
         .XREG({XREG[15:0]}));


debug debug ( 
		 .BREAK(BREAK), 
	     .BRK_CMPLT(BRK_CMPLT), 
         .BRK_IN_SRVC(BRK_IN_SRVC),
         .BRK_PND(BRK_PND), 
         .BRK_REQ(BRK_REQ), 
         .CLR_MFUNC(UPDAT_STAT),
         .CNTR_EVNT(CNTR_EVNT), 
         .CPU_CLK(CPU_CLK),
         .CPU_DISC(DSCNTYq), 
         .CPU_FRST_WRD(OPCODq), 
         .CPU_FTCH(FETCH1), 
         .CPU_PC({ CPU_PC[15:0] }),
         .CPU_RD(RDQ1), 
         .CPU_RDY(CPU_RDY), 
         .CPU_RESET(RESET),
         .CPU_STOP(STOPD), 
         .CPU_WAIT(WAITNG), 
         .CPU_WR(WRQ1),
         .DB(RD_D), 
         .EVNT0_IN(EVNT0_IN),
         .EXT_RESET_IN(ResetSync), 
		 .IACKq(IACKq),
         .MFUNC_CMPLT(MON_CYC_CMPLT),
         .MFUNC_REQ(MFUNC_REQ), 
         .MON_ADR({ MON_ADR[15:0] }),
         .MON_DAT({ MON_WR_DAT[7:0] }), 
         .MON_EXC(MFUNC),
         .MON_IN_SRVC(MON_IN_SRVC), 
         .MON_OPCD({ MON_INST[7:0] }),
         .MSR_CMPLT(MSR_CMPLT), 
         .STK_PTR({ STK_PTR[7:0] }), 
         .TCK(TCK),
         .TDI(TDI), 
         .TDO(J_TDO), 
         .TDO_OE(TDO_OE), 
         .TMS(TMS),
         .XCLK_L(XCLK_L), 
         .XTCK(!TCK), 
         .XTRST(TRST_n) );


always @(posedge OSCobi_n ) begin
		Clock <= !Clock;
		if (!Clock & CPU_RDY) EClockStretch <= 1'b0;
		else if (Clock) EClockStretch <= 1'b1;
end

always @(posedge CPU_CLK) begin
	 ResetSync <= !RESET_n;
end


always @(posedge OSCobi ) begin
		WClock <= !Clock;
end



endmodule // Q6805_CPU

⌨️ 快捷键说明

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