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

📄 irrecv.v

📁 FPGA EP2C5Q288C8 IR-LED 原码,测试OK 打开即用.
💻 V
字号:
module irrecv(clk, IrData, Indicator, led, reset_n);
	input clk;
	input IrData;
	input reset_n;
	output Indicator;
	output [15:0]led;
	assign Indicator = IrData;
	reg [15:0]led;
	//--------------------------------------------------------------------
	reg [14:0]ClkDevider;
	reg ClkDevideOut;
	reg [2:0]RecvState;
	reg [6:0]TimerCnt;
	reg [31:0]DataGet;
	reg [4:0]RecvBitCnt;
	//----------------------------------------------------------------------
	parameter STARTDOWN = 3'b000, 
			  STARTUP   = 3'b001,
			  NUMDOWN   = 3'b010, 
              NUMUP     = 3'b011,
              KEYVALUE  = 3'b101,
              BITJUDGE  = 3'b100; 

	always@(posedge clk) begin
	    if (!reset_n) begin
	        ClkDevider <= 15'd0;
	    end
        else begin
			if(ClkDevider >= 15'd3125) //50MHz 3125 =>8KHZ
			begin
				ClkDevideOut <= ~ClkDevideOut;
				ClkDevider <= 15'd0;
			end
			else begin
				ClkDevider <= ClkDevider + 1'b1;
			end
		end
	end


	always @(posedge ClkDevideOut or negedge reset_n) begin
	if (!reset_n) begin
	    RecvState <= STARTDOWN;
	    TimerCnt  <= 7'd0;
	    led   <= 16'h0;
	end
	else begin
		case(RecvState)
			STARTDOWN:
			begin
				if (IrData==0) begin
					TimerCnt<=TimerCnt+1'b1;
				end
				if(IrData==1) begin
					if(TimerCnt>7'd50 && TimerCnt<7'd90) begin
						TimerCnt<=0;
						RecvState<=STARTUP;
					end
					else begin
						TimerCnt<=0;
						RecvState<=STARTDOWN;
					end
				end
			end
			STARTUP:
			begin
				if(IrData==1) begin
					TimerCnt<=TimerCnt+1'b1;
				end
				if(IrData==0) begin
					if(TimerCnt>7'd26 && TimerCnt<7'd46) begin
						TimerCnt<=0;
						RecvState<=NUMDOWN;
					end
					else begin
						TimerCnt<=0;
						RecvState<=STARTDOWN;
					end
				end
			end
			KEYVALUE:
			begin
				RecvState<=NUMDOWN;
				TimerCnt<=0;
				end
			NUMDOWN:
			begin
				if(IrData==0) begin
					TimerCnt<=TimerCnt+1'b1;
				end
				if(IrData==1) begin
					if(TimerCnt<7'd6) begin
						TimerCnt<=0;
						RecvState<=NUMUP;
					end
					else begin
						TimerCnt<=0;
						RecvState<=STARTDOWN;
					end
				end
			end
			NUMUP:
			begin
				if(IrData==1) begin
					TimerCnt <= TimerCnt+1'b1;
				end
				if(IrData==0) begin
					if(TimerCnt < 7'd15) begin
						RecvState <= BITJUDGE;
					end
					else begin
						TimerCnt<=0;
						RecvState<=STARTDOWN;
					end
				end
			end
			BITJUDGE:
			begin
				if(TimerCnt < 7'd6) begin
					DataGet[RecvBitCnt] <= 0;
					TimerCnt <= 0;
					if(RecvBitCnt == 5'd31) begin
						RecvState  <= STARTDOWN;
						RecvBitCnt <= 0;
						led <= DataGet[31:16];
					end
					else begin
						RecvBitCnt <= RecvBitCnt + 1'b1;
						RecvState  <= NUMDOWN;
					end
				end
				else begin
					DataGet[RecvBitCnt] <= 1;
					TimerCnt<=0;
					if(RecvBitCnt == 5'd31) begin
						RecvState <=STARTDOWN;
						RecvBitCnt = 0;
						led <= DataGet[31:16];
					end
					else begin
						RecvBitCnt <= RecvBitCnt + 1'b1;
						RecvState  <= NUMDOWN;
					end
				end
			end
			default:RecvState <= STARTDOWN;
		endcase
	end
	end
endmodule

⌨️ 快捷键说明

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