亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ps2.v

?? 此模塊用于"PS/2接口的鼠標或鍵盤"與"具有外部讀寫的8位并口單片機"雙向通信模塊. Verilog HDL語言編寫,在Quartus II 8.1 (32-Bit)軟件中編譯,并下載至EPM7
?? V
字號:
//PS/2接口與8位并口通信模塊  YTL-2009-01-18
//此模塊用于PS/2接口與單片機相互通信.
//用于EPM7128SLC84-10芯片實驗已通過

module PS2 (sys_clk, ps_clk, ps_data, nCS, nOE, nWE, DataReady, SendFin, data, nReset, stat, out);
	parameter ps_read_later = 4'd7;			//讀取延時,單位1uS; (默認值:4'd8)
	parameter ps_write_later = 4'd5;		//發送延時,單位1uS (默認值:4'd5)
	parameter ps_comm_overtime = 5'd15;		//PS2接口接收超時檢測延時,單位100uS (默認值:5'd15)
	parameter ps_begin_time = 8'd120;		//PS2接口發送起始位延時量,單位1uS (默認值:8'd150)
	parameter ps_send_overtime = 5'd15;		//PS2接口發送超時檢測延時,單位100uS (默認值:5'd20)
	parameter Prescaler = 6'd50;			//對于系統時鐘分頻值, 分頻周期max=63*2=126uS/pulse (默認值:6'd50)
	
	input sys_clk;			//系統時鐘 1Mhz
	input nCS, nOE, nWE, nReset;	//芯片選擇|讀取數據|發送數據|芯片復位
	input stat;				//0=讀取PS/2最后接收到的數據,1=讀取內部狀態寄存器選擇
	inout ps_clk, ps_data;	//PS/2時鐘|PS/2數據
	inout [7:0] data;		//8位數據雙向總線
	output DataReady;		//PS2數據有效中斷(高電平有效)
	output SendFin;			//PS2數據發送完成(高電平有效)

	output [7:0] out;		//用于直接顯示內部狀態寄存器(status)的內容,可以不用.

	/*內部狀態寄存器各位含義(只讀)
	b0-外部無應答錯誤
	b1-發送數據超時錯誤
	b2-讀取數據超時
	b3-奇偶檢驗錯誤
	b4-輸入緩存溢出
	b5-允許b1位清除,用于外部在讀取狀態之前保留此信息
	b6-允許b2位清除,用于外部在讀取狀態之前保留此信息*/
	tri1 ps_clk, ps_data;
	reg [6:0] status;				//內部狀態寄存器
	reg DataReady;					//已收到一字節的PS/2數據(高電平有效)
	reg main_clk;					//100分頻后的脈沖
//聲明外部發送PS2數據模塊變量
	reg write_ps_enable;			//開始發送PS/2數據
	reg SendFin;					//PS數據發送完成中斷輸出(高電平有效)
//聲明系統時鐘計數模塊變量
	reg send_overtime;				//發送數據超時脈沖信號
	reg ps_overtime;				//讀取數據超時脈沖信號
//聲明讀取PS數據模塊變量
	reg in_rdy;						//PS數據接收完成
	reg read_ps_enable;				//表明正在讀取PS數據中
	reg [7:0] in_buff;				//輸入緩存
//聲明發送PS數據模塊變量
	reg [7:0] out_buff;				//輸出緩存
	reg ps_data_out;				//PS2_data串行輸出
	reg ps_clk_out;					//PS2_clk時鐘輸出
	reg send_fin_pulse;				//通知"外部發送PS2數據進程"已完成發送脈沖信號
	wire clr_WE;					//復位發送
//讀寫PS/2時鐘生成模塊
	reg R_clk;						//PS/2讀時鐘延時信號(上升沿有效)
	reg W_clk;						//PS/2時鐘延時信號(上升沿有效)
	reg clr_read_pulse;				//讀取模塊復位
	reg clr_write_pulse;			//發送模塊復位
	wire clr_RW;					//復位讀寫PS/2時鐘生成模塊
//PS/2接口濾波變量
	reg ps_clk_filter;				//濾波后的PS/2-clk
	reg ps_data_filter;				//濾波后的PS/2-data



	initial 	//上電初始化內部寄存器
	begin
		in_buff <= 0;
		in_rdy <= 0;
		out_buff <= 0;
		DataReady <= 0;
		main_clk = 0;
		write_ps_enable <= 0;
		read_ps_enable <= 0;
		ps_data_out <= 1'bz;
		ps_clk_out <= 1'bz;	
		ps_overtime <= 0;
		status <= 5'b0;
		send_fin_pulse <= 0;
		send_overtime <= 0;					
		SendFin <= 1'b1;
		R_clk <= 0;
		W_clk <= 0;
		clr_read_pulse <= 0;
		clr_write_pulse <= 0;
		ps_clk_filter <= 0;
		ps_data_filter <= 0;
	end

	assign data = (!nOE && !nCS)? ((stat)? status : in_buff) : 8'bz;	//三態8位數據總線,外部讀取PS2數據
	assign ps_data = (write_ps_enable)? ps_data_out : 1'bz;				//發送PS2數據
	assign ps_clk = (write_ps_enable)? ps_clk_out : 1'bz;				//發送clk數據
	assign clr_RW = ps_overtime | send_overtime | !nReset;				//讀寫脈沖生成器復位
	assign clr_WE = send_fin_pulse | send_overtime | clr_write_pulse;	//ps_write_clk_count狀態復位
	assign out = status;


//對于1MHz(1uS)50分頻,生成1個100uS/脈沖周期
	always @(posedge sys_clk)
	begin : Prescaler_clk
		reg [5:0] pc;
		pc = pc + 6'b1;
		if (pc>=Prescaler) begin 
			main_clk <= ~main_clk;
			pc <= 0;
		end
	end

	
//讀取PS2數據時清除中斷標志
	always @(posedge in_rdy or negedge nOE or negedge nReset)		
	begin
		if (!nOE || !nReset) begin
			if (!nCS && !stat) DataReady <= 0;	
		end
		else DataReady <= in_rdy;
	end
	
	
//外部發送PS2數據
	always @(negedge nWE or posedge clr_WE) 	
	begin
		if (clr_WE) begin
			write_ps_enable <= 0; 
			SendFin <= 1'b1;
		end
		else begin
			if (!nCS && !write_ps_enable) begin 
				SendFin <= 0;
				out_buff <= data;
				write_ps_enable <= 1'b1;
			end
		end
	end
	
	
//系統時鐘計數
	always @(posedge main_clk or negedge nOE or negedge nReset)  	
	begin : count_overtime
		reg [4:0] sys_clk_count;
		reg befo;	//讀寫轉換間清零計數器
		//reg clr1, clr2;
		
		if (!nReset) begin
			status[1] <= 0;
			status[2] <= 0;
			status[5] <= 1;
			status[6] <= 1;
			sys_clk_count <= 0;
			befo <= 0;
		end
		else if (!nOE) begin
			if (!nCS && stat) begin
				status[5] <= 1;
				status[6] <= 1;
			end
		end
		else begin
			ps_overtime <= 0;
			send_overtime <= 0;
			if ((read_ps_enable) || write_ps_enable) begin	//讀計時||寫計時
				sys_clk_count = sys_clk_count + 5'd1;
				
				//讀取數據超時計時
				if (read_ps_enable) begin	
					if (!befo) begin
						if (sys_clk_count>=ps_comm_overtime) begin
							ps_overtime <= 1;
							status[2] <= 1'b1;
							sys_clk_count <= 5'd0;
						end
						else begin
							if (status[6]) begin
								status[2] <= 0;
								status[6] <= 0;
							end
						end
					end
					else begin
						sys_clk_count <= 0;
						befo <= 0;
					end
				end
				//發送數據超時計時
				else if (write_ps_enable) begin	
					if (befo) begin
						if (sys_clk_count>=ps_send_overtime) begin
							send_overtime <= 1;				//發送超時錯誤
							status[1] <= 1;
							sys_clk_count <= 5'd0;
						end begin
							if (status[5]) begin
								status[1] <= 0;
								status[5] <= 0;
							end
						end
					end
					else begin
						sys_clk_count <= 0;
						befo <= 1;
					end
				end
			end
			else begin
				sys_clk_count <= 0;
				befo <= 0;
			end
		end
	end	

	
//讀取PS_DATA時序進程
	always @(posedge R_clk or posedge clr_read_pulse)		
	begin: CommPs2Data
		reg [3:0] ps_read_clk_count;	//PS2讀取時鐘計數器(狀態時序)
		reg [7:0] in_temp;				//輸入移位寄存器緩存
		
		if (clr_read_pulse) begin
			ps_read_clk_count <= 0;
			read_ps_enable <= 0;
		end
		else begin
			ps_read_clk_count = ps_read_clk_count + 4'd1;
			in_rdy <= 0;
			case (ps_read_clk_count)
				4'd1:		//讀取起始位
				if (ps_data_filter) 			//等待起始位
					ps_read_clk_count <= 4'd0;
				else
					read_ps_enable <= 1;		//通知外部已開始讀取數據
				
				4'd2,4'd3,4'd4,4'd5,4'd6,4'd7,4'd8,4'd9:	
				begin		//讀取數據位8bit
					in_temp[6:0] <= in_temp[7:1];
					in_temp[7] <= ps_data_filter;
				end
				
				4'd10: 
				begin		//讀取奇偶校驗
					if (ps_data_filter != Parity(in_temp)) status[3] <= 1;
					else status[3] <= 0;
				end
				
				4'd11:
				begin		//驗證停止位和奇偶校驗
					ps_read_clk_count <= 0;
					read_ps_enable <= 0;
					if (ps_data_filter && !status[3]) begin
						if (!DataReady) begin
							in_rdy <= 1'b1;
							status[4] <= 0;
							in_buff <= in_temp;
						end
						else status[4] <= 1;
					end
				end
				default: begin
					ps_read_clk_count = 4'd0;
					read_ps_enable <= 0;
				end
			endcase
		end
	end


//發送PS2接口時序進程
	always @(negedge W_clk or posedge clr_write_pulse)			
	begin: SendPs2Data	
		reg [3:0] ps_write_clk_count;	//PS2發送時鐘計數器(狀態時序)
		
		if (clr_write_pulse) begin
			ps_write_clk_count <= 0;
			send_fin_pulse <= 0;
		end
		else begin
			send_fin_pulse <= 0;
			ps_write_clk_count = ps_write_clk_count + 4'b1;
			case (ps_write_clk_count)
			4'd1:		//抑制PS設備通信
			begin
				ps_data_out <= 1'bz;
				ps_clk_out <= 0;
			end
			
			4'd2: 		//請求發送PS/2數據
			begin
				ps_data_out <= 0;
				ps_clk_out <= 1'bz;
			end
			
			4'd3, 4'd4, 4'd5, 4'd6, 4'd7, 4'd8, 4'd9, 4'd10:		//發送PS2數據位
				ps_data_out <= (out_buff[ps_write_clk_count-4'd3])? 1'bz : 1'b0;
				
			4'd11:		//發送PS2奇偶校驗
				ps_data_out <= (Parity(out_buff))? 1'bz : 1'b0;
				
			4'd12:		//發送停止位
				ps_data_out <= 1'bz;

			4'd13:		//接收應答位
			begin
				status[0] <= ps_data_filter;
				send_fin_pulse <= 1'b1;
				ps_write_clk_count <= 0;
			end
			
			default: begin
				ps_write_clk_count <= 0;
			end
			endcase
		end
	end	


//PS/2接口濾波
always @(negedge sys_clk or negedge nReset)
begin: Filter
	reg [1:0] psclk_s;			//采樣計數器
	reg [1:0] psdat_s;			//采樣計數器
	//reg psclk;				//用于檢測PSCLK的跳變

	if (!nReset) begin
		psclk_s <= 0;
		psdat_s <= 0;
		ps_clk_filter <= 0;
		ps_data_filter <= 0;
	end
	else begin
		//ps/2時鐘線濾波
		if (ps_clk_filter != ps_clk) begin		//檢測PS2時鐘跳變
			if (psclk_s == 2'd3) begin			//3次采樣ps_clk
				ps_clk_filter <= ps_clk;
				psclk_s <= 0;
			end 
			else begin
				psclk_s = psclk_s + 2'b1;
			end
		end 
		else
			psclk_s <= 0;
		//ps/2數據線濾波
		if (ps_data_filter != ps_data) begin		//檢測PS2時鐘跳變
			if (psdat_s == 2'd3) begin				//3次采樣ps_data
				ps_data_filter <= ps_data;
				psdat_s <= 0;
			end 
			else begin
				psdat_s = psdat_s + 2'b1;
			end
		end 
		else
			psdat_s <= 0;
	end
end


//讀寫PS/2時鐘生成模塊
	always @(negedge sys_clk or posedge clr_RW)
	begin: RW_PSCLK
		reg [7:0] begin_time;	//讀寫PS/2延時
		reg clk_pulse;			//PS2時鐘下降沿
		reg clk_status;			//用于檢測ps_clk_filter時鐘上升沿
		reg pswen;				//用于檢測write_ps_enable的跳變
		reg wen_pulse;			//write_ps_enable時鐘上升沿
		
		if (clr_RW) begin
			begin_time <= 0;
			R_clk <= 0;
			W_clk <= 0;
			pswen <= 0;
			clk_pulse <= 0;
			wen_pulse <= 0;
			clk_status <= 0;
			if (send_overtime) clr_write_pulse <= 1'b1;
			if (ps_overtime) clr_read_pulse <= 1'b1;
			if (!nReset) begin
				clr_write_pulse <= 1'b1;
				clr_read_pulse <= 1'b1;
			end
		end
		else begin
			R_clk <= 0;
			W_clk <= 0;
			clr_read_pulse <= 0;
			clr_write_pulse <= 0;
			begin_time <= (clk_pulse || wen_pulse)? begin_time + 7'd1 : 7'd0; 
			//out <= begin_time;
			
			if (clk_status != ps_clk_filter) begin	//檢測PS_CLK跳變
				clk_status <= ps_clk_filter;
				if (!ps_clk_filter) begin			//檢測PS_CLK下降沿
					clk_pulse <= 1;
				end
			end
						
			if (pswen != write_ps_enable) begin	//檢測write_ps_enable時鐘跳變
				pswen <= write_ps_enable;
				begin_time <= 7'd0;
				if (write_ps_enable) begin		//檢測write_ps_enable時鐘上升沿
					wen_pulse <= 1;				//第0位起始位發送數據的脈沖
					W_clk <= 1;
					clr_read_pulse <= 1;
				end		
				else
					clr_write_pulse <= 1;
			end

			if (wen_pulse) begin
				clk_pulse <= 0;
				if (begin_time >= ps_begin_time) begin
					wen_pulse <= 0;
					W_clk <= 1;
					begin_time <= 0;
				end
			end
			else if (write_ps_enable) begin	//寫時鐘成生
				if (begin_time >= ps_write_later) begin
					clk_pulse <= 0;
					begin_time <= 0;
					W_clk <= 1;
				end
			end
			else begin						//讀時鐘成生
				if (begin_time >= ps_read_later) begin
					clk_pulse <= 0;
					begin_time <= 0;
					R_clk <= 1;
				end
			end
		end
	end


//奇偶校驗
	function Parity;
		input [7:0] Din;
		integer i;
		reg Par;
		begin 
			Par = 0;
			for (i=0; i<8; i=i+1)
				if (Din[i]) Par = Par + 1'b1;
			Parity = ~Par;		//偶校驗
		end
	endfunction	
	
endmodule

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产不卡在线视频| 开心九九激情九九欧美日韩精美视频电影| 欧美色倩网站大全免费| 99久久99久久综合| 色系网站成人免费| 精品婷婷伊人一区三区三| 欧美视频一区二| 在线播放亚洲一区| 日韩女优电影在线观看| 日韩免费看的电影| 精品免费视频一区二区| 久久久久九九视频| 国产精品毛片无遮挡高清| 国产精品久久久久久福利一牛影视| 中文字幕欧美三区| 亚洲情趣在线观看| 日韩成人伦理电影在线观看| 精品一区二区三区久久| 成人黄色网址在线观看| 欧洲人成人精品| 精品免费日韩av| 中文字幕在线观看不卡| 亚洲一区二区四区蜜桃| 日韩不卡一区二区| 国产精品影视在线观看| 色系网站成人免费| 欧美大尺度电影在线| 日本一二三不卡| 一区二区三区在线影院| 美国十次综合导航| 成人免费视频国产在线观看| 欧美三级韩国三级日本一级| 国产午夜精品久久久久久免费视 | 婷婷开心激情综合| 美女爽到高潮91| 成人av在线网站| 色天天综合久久久久综合片| 欧美成人性战久久| 一区二区三区国产精品| 国内精品写真在线观看| 欧美三级视频在线播放| 欧美国产日韩a欧美在线观看| 午夜精品福利视频网站| 成人高清视频在线| 日韩精品一区国产麻豆| 亚洲国产一区视频| 97久久精品人人做人人爽| 欧美大片在线观看一区二区| 亚洲色图丝袜美腿| 激情综合色丁香一区二区| 色综合激情久久| 国产欧美精品一区二区色综合 | 久久久久久夜精品精品免费| 一区二区三区在线影院| av一二三不卡影片| 精品区一区二区| 日韩电影在线观看电影| 欧美综合视频在线观看| 中文字幕的久久| 国产成人在线观看免费网站| 91精品午夜视频| 亚洲1区2区3区4区| 91黄色免费看| 亚洲精品老司机| 99re热视频精品| 国产精品久久久一本精品| 国内成人精品2018免费看| 精品国产精品网麻豆系列| 日本不卡视频在线| 91精品国产91久久久久久一区二区 | 久久综合九色综合97_久久久| 日韩成人dvd| 日韩精品一区二区三区中文不卡| 亚洲成人免费看| 555www色欧美视频| 日韩精品久久久久久| 欧美一级在线免费| 美女视频一区二区| 亚洲精品在线三区| 国产麻豆91精品| 国产精品伦理在线| 色综合天天性综合| 亚洲综合区在线| 欧美另类变人与禽xxxxx| 视频一区中文字幕| 日韩一区二区高清| 国产麻豆精品在线观看| 国产精品视频你懂的| 99九九99九九九视频精品| 亚洲视频一二三区| 欧美这里有精品| 日韩和欧美的一区| 久久久一区二区| 97久久精品人人做人人爽| 亚洲国产精品久久久久秋霞影院| 欧美乱妇15p| 国产一区二区网址| 国产精品色哟哟| 欧美日韩一区二区在线观看视频 | 中文一区二区在线观看| 99re这里只有精品首页| 亚洲一卡二卡三卡四卡五卡| 91精品在线一区二区| 国产麻豆精品视频| 一区二区三区精品视频在线| 日韩一区二区三| 99视频超级精品| 日韩精品一级中文字幕精品视频免费观看 | 国产成人小视频| 一区二区三区资源| 久久午夜电影网| 欧美中文一区二区三区| 国产精品亚洲视频| 亚洲一区在线播放| 久久精品日产第一区二区三区高清版| 99精品偷自拍| 国产综合久久久久影院| 亚洲在线成人精品| 国产日本亚洲高清| 欧美福利电影网| 91丨porny丨最新| 国产一区二区不卡| 日本不卡一区二区| 亚洲韩国一区二区三区| 国产欧美日韩中文久久| 日韩欧美中文一区二区| 91国在线观看| 99re热这里只有精品免费视频| 久久精品国产亚洲5555| 一区二区免费看| 国产精品欧美久久久久一区二区| 日韩午夜av一区| 欧美二区三区91| 色综合久久综合| jiyouzz国产精品久久| 国产激情一区二区三区四区 | 精品少妇一区二区三区免费观看| 色哟哟一区二区在线观看| 国产成人午夜99999| 极品销魂美女一区二区三区| 午夜天堂影视香蕉久久| 亚洲毛片av在线| 亚洲女人****多毛耸耸8| 欧美国产1区2区| 国产女主播视频一区二区| 2021国产精品久久精品| 精品日韩在线观看| 欧美一区二区在线观看| 欧美三级日韩三级| 欧美日韩国产成人在线免费| 色婷婷综合久久久中文字幕| 成人永久aaa| 免费成人av在线| 久久精品免费看| 日韩毛片在线免费观看| 欧美一级日韩不卡播放免费| 欧美精品久久久久久久久老牛影院| 成人av中文字幕| 成人av在线资源网站| 色综合视频在线观看| 欧洲精品一区二区| 欧美日韩五月天| 91精品国产色综合久久不卡电影 | 99精品欧美一区二区三区小说| 成人黄色av网站在线| 色8久久精品久久久久久蜜| 91福利在线播放| 欧美日韩久久一区| 日韩欧美三级在线| 国产日韩精品一区二区三区在线| 欧美激情一区二区三区全黄 | 91福利社在线观看| 欧美色大人视频| 精品国产一区a| 亚洲国产高清在线观看视频| 亚洲最大的成人av| 久久精品国产成人一区二区三区 | 国产精品小仙女| 99久久er热在这里只有精品66| 色综合天天做天天爱| 欧美一级在线观看| 国产精品久久久久久福利一牛影视| 亚洲日本在线天堂| 肉肉av福利一精品导航| 国产成人亚洲综合a∨婷婷| 日本道精品一区二区三区 | 久久九九久久九九| 亚洲日穴在线视频| 老色鬼精品视频在线观看播放| 国产成人av福利| 欧美日韩黄视频| 欧美激情一区二区三区四区| 亚洲va国产天堂va久久en| 国产91精品一区二区麻豆网站 | 国产精品看片你懂得| 日日夜夜免费精品| 丁香网亚洲国际| 日韩一级免费观看| 伊人夜夜躁av伊人久久| 国产一区二区不卡老阿姨|