📄 irrecv.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 + -