//модуль приемника ИК сигналов от пультов телевизоров, DVD и прочих бытовых устройствmodule ir_receiver(inputwire reset, input wire clk,//примерно 5Мгц input wire ir_input,//сигнал с микросхемы ИК приемника ILMS5360 output reg[7:0]ir_cmd,//принятый от ИК приемника байт output reg ir_cmd_ready //сигнал готовности принятого байта
);//разделим входную тактовую частоту 5Мгц на 139//получим последовательность коротких импульсов count_imp //с частотой 36Кгцreg[7:0]cnt;wire count_imp;assign count_imp =(cnt==138);always @(posedge clk or posedge reset) if(reset)
cnt<=0; else if(count_imp)
cnt<=0; else cnt<=cnt+1;//вместе с каждым импульсом count_imp запомним текущее значение//сигнала от ??К приемникаreg ir_input_;always @(posedge clk) if(count_imp)
ir_input_ <= ir_input;//обнаружение спада сигнала ИК приемника//(спад - переход сигнала из "1" в "0")//если сигнал стал нулем, а его предыдущее значение было единицаwire ir_falling_edge;assign ir_falling_edge =(~ir_input)& ir_input_ & count_imp;//счетчик, которым считаем длину положительного импульса//от ИК приемникаreg[6:0]length;//подсчитываем количество импульсов count_imp за время //положительного импульса от ИК применика ir_input, но//не более 127, чтобы избежать переполнения счетчикаalways @(posedge clk) if(ir_falling_edge)
length <=0; else if(ir_input & count_imp &(length<7'h7F))
length <= length+1;//сдвиговый регистр, в котором накапливается принятый кодreg[7:0]shift_reg;//по спаду сигнала ИК приемника ir_input принимаем решение//о том, принят бит или нет.//если длина импулься ir_input меньше 64, то мы приняли бит,//а не префикс ИК пакета//дальше, если длина импульса меньше 32, то принят ноль, а иначе //принята единицаalways @(posedge clk or posedge reset) beginif(reset) shift_reg <=0;elseif(ir_falling_edge) beginif(length<64) //получаем бит в сдвиговый регистр
shift_reg <={shift_reg[6:0],(length>32)};endend
always @* begin//формируем короткий импульс готовности принятого байта
ir_cmd_ready = (~nbit7) & nbit7_;//принятый в сдвиговый регистр байт - это и есть то что нам нужно
ir_cmd = shift_reg;end
Подробнее...