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

📄 pio8wk.v

📁 q6805.zip
💻 V
字号:
																						
	module IOKey (  BlockSel,
			   		RegSel,
			   		CPUWR,
			   		CPUClock,
			   		IntRequest,
			   		IOPort,
			   		DIn,
			   		DOut,
			   		Reset,
			   		Ready);

	input 			BlockSel,
					CPUWR,
					CPUClock,
					Reset,
					Ready;

	inout [7:0] 	IOPort;
	input [1:0] 	RegSel;
	input [7:0] 	DIn;

	output [7:0] 	DOut;
	output		 	IntRequest;


	reg [7:0] DDR;
	reg [7:0] DReg;
	reg [7:0] KeyIFResetReg;
	reg [7:0] KeyIF;
	reg [7:0] KeyIE;

	reg [7:0] DOut;

	wire IntRequest =  ((KeyIF[7] & KeyIE[7]) |
					    (KeyIF[6] & KeyIE[6]) |
					    (KeyIF[5] & KeyIE[5]) |
					    (KeyIF[4] & KeyIE[4]) |
					    (KeyIF[3] & KeyIE[3]) |
					    (KeyIF[2] & KeyIE[2]) |
					    (KeyIF[1] & KeyIE[1]) |
					    (KeyIF[0] & KeyIE[0]));


	wire DRegSel  = BlockSel & (RegSel[1:0] == 2'b00) & Ready;
	wire DDRSel   = BlockSel & (RegSel[1:0] == 2'b01) & Ready;
	wire KeyIESel = BlockSel & (RegSel[1:0] == 2'b10) & Ready;
	wire KeyIFSel = BlockSel & (RegSel[1:0] == 2'b11) & Ready;

	wire [7:0] 	IOPort;									   // these are the actual pins
	wire [7:0]  DRegIn;

	wire DRegIn7_n = !DRegIn[7];
	wire DRegIn6_n = !DRegIn[6];
	wire DRegIn5_n = !DRegIn[5];
	wire DRegIn4_n = !DRegIn[4];
	wire DRegIn3_n = !DRegIn[3];
	wire DRegIn2_n = !DRegIn[2];
	wire DRegIn1_n = !DRegIn[1];
	wire DRegIn0_n = !DRegIn[0];
			   
	assign IOPort[7] = DDR[7] ? DReg[7] : 1'bz;
	assign IOPort[6] = DDR[6] ? DReg[6] : 1'bz;
	assign IOPort[5] = DDR[5] ? DReg[5] : 1'bz;
	assign IOPort[4] = DDR[4] ? DReg[4] : 1'bz;
	assign IOPort[3] = DDR[3] ? DReg[3] : 1'bz;
	assign IOPort[2] = DDR[2] ? DReg[2] : 1'bz;
	assign IOPort[1] = DDR[1] ? DReg[1] : 1'bz;
	assign IOPort[0] = DDR[0] ? DReg[0] : 1'bz;

	assign DRegIn = IOPort;
	
   
	always @(posedge CPUClock or posedge Reset) begin
		if (Reset)
			DDR[7:0] <= 8'h00;
		else begin
			if (DDRSel & CPUWR) begin
			   	DDR[7:0] <= DIn[7:0];
			end
		end
	end

	always @(posedge CPUClock or posedge Reset) begin
		if (Reset)
			DReg[7:0] <= 8'h00;
		else begin
			if (DRegSel & CPUWR) begin
			   	DReg[7:0] <= DIn[7:0];
			end
		end
	end

   
   always @(posedge CPUClock or posedge Reset) begin
		if (Reset)
			KeyIE[7:0] <= 8'h00;
		else begin
			if (KeyIESel & CPUWR) begin
			   	KeyIE[7:0] <= DIn[7:0];
			end
		end
	end



	always @(posedge CPUClock or posedge Reset) begin
		if (Reset) begin
			KeyIFResetReg[7:0] <= 8'b1111_1111;
		end
		else begin
					if (KeyIF[7] & KeyIFSel & CPUWR) KeyIFResetReg[7] <= DIn[7];
					else KeyIFResetReg[7] <= 1'b0;	
							   
					if (KeyIF[6] & KeyIFSel & CPUWR) KeyIFResetReg[6] <= DIn[6];
					else KeyIFResetReg[6] <= 1'b0;	
							   
					if (KeyIF[5] & KeyIFSel & CPUWR) KeyIFResetReg[5] <= DIn[5];
					else KeyIFResetReg[5] <= 1'b0;	
							   
					if (KeyIF[4] & KeyIFSel & CPUWR) KeyIFResetReg[4] <= DIn[4];
					else KeyIFResetReg[4] <= 1'b0;	
							   
					if (KeyIF[3] & KeyIFSel & CPUWR) KeyIFResetReg[3] <= DIn[3];
					else KeyIFResetReg[3] <= 1'b0;	
							   
					if (KeyIF[2] & KeyIFSel & CPUWR) KeyIFResetReg[2] <= DIn[2];
					else KeyIFResetReg[2] <= 1'b0;	
							   
					if (KeyIF[1] & KeyIFSel & CPUWR) KeyIFResetReg[1] <= DIn[1];
					else KeyIFResetReg[1] <= 1'b0;	
							   
					if (KeyIF[0] & KeyIFSel & CPUWR) KeyIFResetReg[0] <= DIn[0];
					else KeyIFResetReg[0] <= 1'b0;			   
		end
	end
			
    always @(posedge DRegIn7_n or posedge KeyIFResetReg[7]) begin
		if (KeyIFResetReg[7])
    		KeyIF[7] <= 1'b0;
        else 
            KeyIF[7] <= 1'b1;
    end           

    always @(posedge DRegIn6_n or posedge KeyIFResetReg[6]) begin
		if (KeyIFResetReg[6])
    		KeyIF[6] <= 1'b0;
         else 
            KeyIF[6] <= 1'b1;
    end           

    always @(posedge  DRegIn5_n or posedge KeyIFResetReg[5]) begin
		if (KeyIFResetReg[5])
    		KeyIF[5] <= 1'b0;
        else 
            KeyIF[5] <= 1'b1;
    end           

    always @(posedge  DRegIn4_n or posedge KeyIFResetReg[4]) begin
		if (KeyIFResetReg[4])
    		KeyIF[4] <= 1'b0;
        else 
            KeyIF[4] <= 1'b1;
    end           

    always @(posedge  DRegIn3_n or posedge KeyIFResetReg[3]) begin
		if (KeyIFResetReg[3])
    		KeyIF[3] <= 1'b0;
        else 
            KeyIF[3] <= 1'b1;
    end           

    always @(posedge  DRegIn2_n or posedge KeyIFResetReg[2]) begin
		if (KeyIFResetReg[2])
    		KeyIF[2] <= 1'b0;
        else 
            KeyIF[2] <= 1'b1;
    end           

    always @(posedge  DRegIn1_n or posedge KeyIFResetReg[1]) begin
		if (KeyIFResetReg[1])
    		KeyIF[1] <= 1'b0;
        else 
            KeyIF[1] <= 1'b1;
    end           

    always @(posedge  DRegIn0_n or posedge KeyIFResetReg[0]) begin
		if (KeyIFResetReg[0])
    		KeyIF[0] <= 1'b0;
        else 
            KeyIF[0] <= 1'b1;
    end       
    
    
    always @(RegSel or DDR or DRegIn or KeyIE or KeyIF) begin
    	casex (RegSel)   
			2'b00 : DOut = DRegIn;
			2'b01 : DOut = DDR;
			2'b10 : DOut = KeyIE;
			2'b11 : DOut = KeyIF;
			default : DOut = 8'hxx;
		endcase
	end

endmodule	//IOKey

⌨️ 快捷键说明

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