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

📄 expwin.v

📁 q6805.zip
💻 V
字号:
																						
	module ExpWin ( BlockSel,
			   		RegSel,
					INTRNL_ADDRS,
			   		CPUWR,
					CPURD,
			   		CPUClock, 
					EClockStretch,
					NotWClock,
					AddrsIn,
					AddrsOutQ,
					CSP0_n,
					CSP1_n,
					CSD0_n,
					CSD1_n,
					CS3_n,
					CS2_n,
					CS1_n,
					CS0_n,
			   		DIn,
					WaitReqQ,
			   		DOut,
			   		Reset,
			   		Ready);

	input 			BlockSel,
					INTRNL_ADDRS,
					CPUWR,
					CPURD,
					CPUClock,
					EClockStretch,
					NotWClock,
					Reset,
					Ready;

	input [1:0]		RegSel;
	input [7:0] 	DIn;
	input [15:0]	AddrsIn;

	output [7:0] 	DOut;

	output [21:0]   AddrsOutQ;

	output			CSP0_n,
					CSP1_n,
					CSD0_n,
					CSD1_n,
					CS3_n,
					CS2_n,
					CS1_n,
					CS0_n,
					WaitReqQ;

	reg	 [7:0] 	    PWax;
	reg	 [7:0] 	    DWax;
	reg	 [7:0] 	    CSCNTRL;
	reg	 [7:0] 	    WSTG;
	reg	 [7:0] 	    DOut;
	reg				WaitReqQ;
	reg	[1:0]		WaitCount;
	reg	[1:0]		WaitLength;

 	wire  [21:0]	AddrsOutQ;
	wire [21:14]	AddrsOut;
	wire			BUS_CYCL = CPUWR | CPURD;
	wire	    	CSP0;
	wire		    CSP1;
	wire		    CSD0;
	wire		    CSD1;
	wire		    CS3;
	wire		    CS2;
	wire		    CS1;
	wire		    CS0;
    wire			CSP0_n = !(CSP0 & BUS_CYCL & ~INTRNL_ADDRS); 
	wire			CSP1_n = !(CSP1 & BUS_CYCL & ~INTRNL_ADDRS); 
	wire			CSD0_n = !(CSD0 & BUS_CYCL & ~INTRNL_ADDRS); 
	wire			CSD1_n = !(CSD1 & BUS_CYCL & ~INTRNL_ADDRS); 
	wire			CS3_n  = !(CS3  & BUS_CYCL & ~INTRNL_ADDRS);  
	wire			CS2_n  = !(CS2  & BUS_CYCL & ~INTRNL_ADDRS);  
	wire			CS1_n  = !(CS1  & BUS_CYCL & ~INTRNL_ADDRS);  
	wire			CS0_n  = !(CS0  & BUS_CYCL & ~INTRNL_ADDRS);  
	wire			WindowActive;
	wire			WaitReq;
	wire PWaxSel     = BlockSel & (RegSel[1:0] == 2'b00) & Ready;
	wire DWaxSel     = BlockSel & (RegSel[1:0] == 2'b01) & Ready;
	wire CntrlSel    = BlockSel & (RegSel[1:0] == 2'b10) & Ready;
	wire WSTGSel     = BlockSel & (RegSel[1:0] == 2'b11) & Ready;
	wire NotClock;
	wire [1:0] 		WaitGroup;

		
	assign AddrsOutQ =  {AddrsOut, AddrsIn[13:0]};
	assign NotClock = !CPUClock;
	assign WindowActive = CSP1 | CSD1;
	assign CSP0 = CSCNTRL[7] & !CSP1 & !CSD0 & !CSD1 & !CS3 & !CS2 & !CS1 & !CS0 & ~Reset; 
	assign CSP1 = CSCNTRL[6] & (AddrsIn[15:14] == 2'b10) & ~Reset;
	assign CSD0 = CSCNTRL[5] & !AddrsIn[15] & !CSD1 & !CS3 & !CS2 & !CS1 & !CS0;
	assign CSD1 = CSCNTRL[4] & (AddrsIn[15:14] == 2'b01);
	assign CS3  = CSCNTRL[3] & (AddrsIn[15:7] == 9'b0000_0100_1);
	assign CS2  = CSCNTRL[2] & (AddrsIn[15:7] == 9'b0000_0100_0);
	assign CS1  = CSCNTRL[1] & (AddrsIn[15:7] == 9'b0000_0011_1);
	assign CS0  = CSCNTRL[0] & (AddrsIn[15:7] == 9'b0000_0011_0);
	assign AddrsOut = WindowActive ? (CSP1 ? PWax : DWax) : {6'b1111_11, AddrsIn[15:14]};
	assign WaitGroup[1] =  CSP0 | CSP1 | CSD0 | CSD1;
	assign WaitGroup[0] =  CSP0 | CSP1 | CS3  | CS2;

	
	always @(posedge CPUClock or posedge Reset) begin
		if (Reset) begin
			PWax    <= 8'hFF;
			DWax    <= 8'h00;
			CSCNTRL <= 8'h80;							//CSP0 is enabled at Reset
			WSTG	<= 8'hFF;							//everybody gets 3 wait states at powerup
		end
		else begin
			if (PWaxSel & CPUWR) begin
			   	PWax[7:0] <= DIn[7:0];							 
			end
			if (DWaxSel & CPUWR) begin							 
			   	DWax[7:0] <= DIn[7:0];
			end													 
			if (CntrlSel & CPUWR) begin
			   	CSCNTRL[7:0] <= DIn[7:0];						 
			end
			if (WSTGSel & CPUWR) begin
			   	WSTG[7:0] <= DIn[7:0];
			end

		end
	end

	always @(posedge NotWClock or posedge Reset) begin
		if (Reset) begin
			WaitReqQ <= 1'b1;
			WaitCount <= 2'b0;
		end
		else if (~INTRNL_ADDRS) begin
			if (!(WaitCount == WaitLength)) begin
				WaitReqQ <= 1'b0;
				WaitCount <= WaitCount + 1;
			end
			else begin
				WaitReqQ <= 1'b1;
				WaitCount <= 2'b0;
			end
		end
	end

    
    always @(RegSel or PWax or DWax or CSCNTRL or WSTG) begin
    	case (RegSel)   
			2'b00 : DOut = PWax;
			2'b01 : DOut = DWax;
			2'b10 : DOut = CSCNTRL;
			2'b11 : DOut = WSTG;
		endcase
	end

	always @(WSTG or WaitGroup) begin
		
		casex (WaitGroup)
			2'b00 : WaitLength[1:0] = WSTG[1:0];
			2'b01 : WaitLength[1:0] = WSTG[3:2];
			2'b10 : WaitLength[1:0] = WSTG[5:4];
			2'b11 : WaitLength[1:0] = WSTG[7:6];
			default : WaitLength[1:0] = 2'bxx;
		endcase
	end

			

endmodule	//ExpWin

⌨️ 快捷键说明

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