搜索
bottom↓
回复: 11

红外遥控解码实现

[复制链接]

出0入0汤圆

发表于 2019-11-1 17:19:58 | 显示全部楼层 |阅读模式
实现
  1. class IrNec(irMargin: Int) extends Component {
  2.   val io = new Bundle {
  3.     val sampleClk = in Bool()
  4.     val ir = in Bool()
  5.     val req = out Bool()
  6.     val userCode = out Bits (8 bit)
  7.     val dataCode = out Bits (8 bit)
  8.   }

  9.   val irBoundary = new Bundle {
  10.     val bdyMs9 = 9000
  11.     val bdyMs4_5 = 4500
  12.     val bdyMs2_25 = 2250
  13.     val bdyMs0_56 = 560
  14.     val bdyMs1_69 = 1690
  15.     val bdyMs42_02 = 42020
  16.     val bdyMs98_19 = 98190
  17.   }

  18.   def maxBoundary(m: Int) = {
  19.     (m * (100 + irMargin) / 100).toInt
  20.   }

  21.   def minBoundary(m: Int) = {
  22.     (m * (100 - irMargin) / 100).toInt
  23.   }

  24.   val ir = RegNext(io.ir).init(True)
  25.   val samples = History(ir, 3, True)
  26.   val irFilted = RegNext(MajorityVote(samples))

  27.   val data = Reg(Bits(32 bit))

  28.   val irFsm = new StateMachine {
  29.     val cnt = Reg(UInt(log2Up(maxBoundary(110000)) bit))
  30.     val bitCnt = Reg(UInt(6 bit))
  31.     val stateIdle: State = new State with EntryPoint {
  32.       whenIsActive {
  33.         when(!irFilted) {
  34.           goto(stateHeadL)
  35.         }
  36.       }
  37.     }
  38.     val stateHeadL: State = new State {
  39.       onEntry {
  40.         cnt.clearAll()
  41.       }
  42.       whenIsActive {
  43.         when(irFilted) {
  44.           goto(stateIdle)
  45.         }.elsewhen(cnt === minBoundary(irBoundary.bdyMs9)) {
  46.           goto(stateHeadL_1)
  47.         }.otherwise {
  48.           cnt := cnt + 1
  49.         }
  50.       }
  51.     }
  52.     val stateHeadL_1: State = new State {
  53.       whenIsActive {
  54.         when(irFilted) {
  55.           goto(stateHeadH)
  56.         }.elsewhen(cnt === maxBoundary(irBoundary.bdyMs9)) {
  57.           goto(stateIdle)
  58.         }.otherwise {
  59.           cnt := cnt + 1
  60.         }
  61.       }
  62.     }
  63.     val stateHeadH: State = new State {
  64.       onEntry {
  65.         cnt.clearAll()
  66.       }
  67.       whenIsActive {
  68.         when(!irFilted) {
  69.           goto(stateIdle)
  70.         }.elsewhen(cnt === minBoundary(irBoundary.bdyMs4_5)) {
  71.           goto(stateHeadH_1)
  72.         }.otherwise {
  73.           cnt := cnt + 1
  74.         }
  75.       }
  76.     }
  77.     val stateHeadH_1: State = new State {
  78.       whenIsActive {
  79.         when(!irFilted) {
  80.           goto(stateDataL)
  81.           bitCnt.clearAll()
  82.           data.clearAll()
  83.         }.elsewhen(cnt === maxBoundary(irBoundary.bdyMs4_5)) {
  84.           goto(stateIdle)
  85.         }.otherwise {
  86.           cnt := cnt + 1
  87.         }
  88.       }
  89.     }
  90.     val stateDataL: State = new State {
  91.       onEntry {
  92.         cnt.clearAll()
  93.       }
  94.       whenIsActive {
  95.         when(irFilted) {
  96.           goto(stateIdle)
  97.         }.elsewhen(cnt === minBoundary((irBoundary.bdyMs0_56))) {
  98.           goto(stateDataL_1)
  99.         }.otherwise {
  100.           cnt := cnt + 1
  101.         }
  102.       }
  103.     }
  104.     val stateDataL_1: State = new State {
  105.       whenIsActive {
  106.         when(irFilted) {
  107.           when(bitCnt === 0x20) {
  108.             goto(stateDataEnd)
  109.           }.otherwise {
  110.             goto(stateDataH)
  111.           }
  112.         }.elsewhen(cnt === maxBoundary(irBoundary.bdyMs0_56)) {
  113.           goto(stateIdle)
  114.         }.otherwise {
  115.           cnt := cnt + 1
  116.         }
  117.       }
  118.     }
  119.     val stateDataH: State = new State {
  120.       onEntry {
  121.         cnt.clearAll()
  122.       }
  123.       whenIsActive {
  124.         when(!irFilted) {
  125.           goto(stateIdle)
  126.         }.elsewhen(cnt === minBoundary(irBoundary.bdyMs0_56)) {
  127.           goto(stateDataH_1)
  128.         }.otherwise {
  129.           cnt := cnt + 1
  130.         }
  131.       }
  132.     }
  133.     val stateDataH_1: State = new State {
  134.       whenIsActive {
  135.         when(!irFilted) {
  136.           goto(stateDataL)
  137.           bitCnt := bitCnt + 1
  138.           //data(bitCnt) := False
  139.         }.elsewhen(cnt === maxBoundary(irBoundary.bdyMs0_56)) {
  140.           goto(stateDataH_2)
  141.         }.otherwise {
  142.           cnt := cnt + 1
  143.         }
  144.       }
  145.     }
  146.     val stateDataH_2: State = new State {
  147.       whenIsActive {
  148.         when(!irFilted) {
  149.           goto(stateIdle)
  150.         }.elsewhen(cnt === minBoundary(irBoundary.bdyMs1_69)) {
  151.           goto(stateDataH_3)
  152.         }.otherwise {
  153.           cnt := cnt + 1
  154.         }
  155.       }
  156.     }
  157.     val stateDataH_3: State = new State {
  158.       whenIsActive {
  159.         when(!irFilted) {
  160.           goto(stateDataL)
  161.           bitCnt := bitCnt + 1
  162.           data(bitCnt(4 downto 0)) := True
  163.         }.elsewhen(cnt === maxBoundary(irBoundary.bdyMs1_69)) {
  164.           goto(stateIdle)
  165.         }.otherwise {
  166.           cnt := cnt + 1
  167.         }
  168.       }
  169.     }
  170.     val stateDataEnd: State = new State {
  171.       onEntry {
  172.         cnt.clearAll()
  173.       }
  174.       whenIsActive {
  175.         when(!irFilted) {
  176.           goto(stateRepeatHeadL)
  177.         }.elsewhen(cnt === minBoundary(irBoundary.bdyMs42_02)) {
  178.           goto(stateIdle)
  179.         }.otherwise {
  180.           cnt := cnt + 1
  181.         }
  182.       }
  183.     }
  184.     val stateRepeatHeadL: State = new State {
  185.       onEntry {
  186.         cnt.clearAll()
  187.       }
  188.       whenIsActive {
  189.         when(irFilted) {
  190.           goto(stateIdle)
  191.         }.elsewhen(cnt === minBoundary(irBoundary.bdyMs9)) {
  192.           goto(stateRepeatHeadL_1)
  193.         }.otherwise {
  194.           cnt := cnt + 1
  195.         }
  196.       }
  197.     }
  198.     val stateRepeatHeadL_1: State = new State {
  199.       whenIsActive {
  200.         when(irFilted) {
  201.           goto(stateRepeatHeadH)
  202.         }.elsewhen(cnt === maxBoundary(irBoundary.bdyMs9)) {
  203.           goto(stateIdle)
  204.         }.otherwise {
  205.           cnt := cnt + 1
  206.         }
  207.       }
  208.     }
  209.     val stateRepeatHeadH: State = new State {
  210.       onEntry {
  211.         cnt.clearAll()
  212.       }
  213.       whenIsActive {
  214.         when(!irFilted) {
  215.           goto(stateIdle)
  216.         }.elsewhen(cnt === minBoundary(irBoundary.bdyMs2_25)) {
  217.           goto(stateRepeatHeadH_1)
  218.         }.otherwise {
  219.           cnt := cnt + 1
  220.         }
  221.       }
  222.     }
  223.     val stateRepeatHeadH_1: State = new State {
  224.       whenIsActive {
  225.         when(!irFilted) {
  226.           goto(stateRepeatEndL)
  227.         }.elsewhen(cnt === maxBoundary(irBoundary.bdyMs2_25)) {
  228.           goto(stateIdle)
  229.         }.otherwise {
  230.           cnt := cnt + 1
  231.         }
  232.       }
  233.     }
  234.     val stateRepeatEndL: State = new State {
  235.       onEntry {
  236.         cnt.clearAll()
  237.       }
  238.       whenIsActive {
  239.         when(irFilted) {
  240.           goto(stateIdle)
  241.         }.elsewhen(cnt === minBoundary((irBoundary.bdyMs0_56))) {
  242.           goto(stateDataL_1)
  243.         }.otherwise {
  244.           cnt := cnt + 1
  245.         }
  246.       }
  247.     }
  248.     val stateRepeatEndL_1: State = new State {
  249.       whenIsActive {
  250.         when(irFilted) {
  251.           goto(stateRepeatEndH)
  252.         }.elsewhen(cnt === maxBoundary(irBoundary.bdyMs0_56)) {
  253.           goto(stateIdle)
  254.         }.otherwise {
  255.           cnt := cnt + 1
  256.         }
  257.       }
  258.     }
  259.     val stateRepeatEndH: State = new State {
  260.       whenIsActive {
  261.         when(!irFilted) {
  262.           goto(stateIdle)
  263.         }.elsewhen(cnt === minBoundary(irBoundary.bdyMs98_19)) {
  264.           goto(stateRepeatEndH_1)
  265.         }.otherwise {
  266.           cnt := cnt + 1
  267.         }
  268.       }
  269.     }
  270.     val stateRepeatEndH_1: State = new State {
  271.       whenIsActive {
  272.         when(!irFilted) {
  273.           goto(stateRepeatHeadL)
  274.         }.elsewhen(cnt === maxBoundary(irBoundary.bdyMs98_19)) {
  275.           goto(stateIdle)
  276.         }.otherwise {
  277.           cnt := cnt + 1
  278.         }
  279.       }
  280.     }
  281.   }

  282.   val irReq = RegInit(False)
  283.   when(irFsm.isEntering(irFsm.stateDataEnd)) {
  284.     when((data(31 downto 24) ^ data(23 downto 16)).andR
  285.       & (data(15 downto 8) ^ data(7 downto 0)).andR) {
  286.       irReq.set()
  287.     }
  288.   } otherwise {
  289.     irReq.clear()
  290.   }

  291.   io.req := irReq
  292.   io.userCode := data(7 downto 0)
  293.   io.dataCode := data(23 downto 16)
  294. }
复制代码


仿真
  1. doSim { dut =>
  2.       dut.clockDomain.forkStimulus(period = 1000)

  3.       val us = 1000
  4.       val ms = 1000*1000

  5.       def irSendHead():Unit ={
  6.         dut.io.ir #= false
  7.         sleep(9*ms)
  8.         dut.io.ir #= true
  9.         sleep(45*ms/10)
  10.       }

  11.       def irSendBit(b:Int):Unit = {
  12.         dut.io.ir #= false
  13.         sleep(560*us)
  14.         dut.io.ir #= true
  15.         if(b!=0){
  16.           sleep(1685*us)
  17.         }else{
  18.           sleep(560*us)
  19.         }
  20.       }

  21.       def irSendByte(d:Int):Unit={
  22.         irSendBit(d & (0x01 << 0))
  23.         irSendBit(d & (0x01 << 1))
  24.         irSendBit(d & (0x01 << 2))
  25.         irSendBit(d & (0x01 << 3))
  26.         irSendBit(d & (0x01 << 4))
  27.         irSendBit(d & (0x01 << 5))
  28.         irSendBit(d & (0x01 << 6))
  29.         irSendBit(d & (0x01 << 7))
  30.       }

  31.       def irSendTail():Unit ={
  32.         dut.io.ir #= false
  33.         sleep(560*us)
  34.         dut.io.ir #= true
  35.         sleep(500*us)
  36.         sleep(40*ms)
  37.       }

  38.       def irSendRepeat():Unit={
  39.         dut.io.ir #= false
  40.         sleep(9*ms)
  41.         dut.io.ir #= true
  42.         sleep(225*ms/100)
  43.         dut.io.ir #= false
  44.         sleep(560*us)
  45.         dut.io.ir #= true
  46.         sleep(102*ms)
  47.       }

  48.       def irSend(userCode: Int,dataCode:Int): Unit ={
  49.         irSendHead()
  50.         irSendByte(userCode)
  51.         irSendByte(~userCode)
  52.         irSendByte(dataCode)
  53.         irSendByte(~dataCode)
  54.         irSendTail()
  55.       }

  56.       val irThread = fork{
  57.         dut.io.ir #= true
  58.         sleep(20*ms)
  59.         irSend(0x80,0x04)
  60.         irSendRepeat()
  61.         irSendRepeat()
  62.         irSend(0x80,0x06)
  63.       }
复制代码


Verilog
  1. module IrNec (
  2.       input   io_sampleClk,
  3.       input   io_ir,
  4.       output  io_req,
  5.       output [7:0] io_userCode,
  6.       output [7:0] io_dataCode,
  7.       input   clk,
  8.       input   reset);
  9.   wire  _zz_1_;
  10.   wire  _zz_2_;
  11.   wire  _zz_3_;
  12.   wire  _zz_4_;
  13.   wire  _zz_5_;
  14.   wire  _zz_6_;
  15.   wire  _zz_7_;
  16.   wire  _zz_8_;
  17.   wire  _zz_9_;
  18.   wire  _zz_10_;
  19.   wire  _zz_11_;
  20.   wire  _zz_12_;
  21.   wire  _zz_13_;
  22.   wire  _zz_14_;
  23.   wire  _zz_15_;
  24.   wire  _zz_16_;
  25.   wire  _zz_17_;
  26.   wire  _zz_18_;
  27.   wire  _zz_19_;
  28.   wire  _zz_20_;
  29.   wire  _zz_21_;
  30.   wire  _zz_22_;
  31.   wire  _zz_23_;
  32.   wire  _zz_24_;
  33.   wire  _zz_25_;
  34.   wire  _zz_26_;
  35.   wire  _zz_27_;
  36.   wire  _zz_28_;
  37.   wire  _zz_29_;
  38.   wire  _zz_30_;
  39.   reg  ir;
  40.   wire  samples_0;
  41.   reg  samples_1;
  42.   reg  samples_2;
  43.   reg  irFilted;
  44.   reg [31:0] data;
  45.   wire  irFsm_wantExit;
  46.   reg [17:0] irFsm_cnt;
  47.   reg [5:0] irFsm_bitCnt;
  48.   reg  irReq;
  49.   reg `irFsm_enumDefinition_binary_sequential_type irFsm_stateReg;
  50.   reg `irFsm_enumDefinition_binary_sequential_type irFsm_stateNext;
  51.   `ifndef SYNTHESIS
  52.   reg [191:0] irFsm_stateReg_string;
  53.   reg [191:0] irFsm_stateNext_string;
  54.   `endif

  55.   assign _zz_1_ = (irFsm_cnt == (18'b000001110000100000));
  56.   assign _zz_2_ = (irFsm_cnt == (18'b000010101000110000));
  57.   assign _zz_3_ = (! irFilted);
  58.   assign _zz_4_ = (irFsm_cnt == (18'b000000111000010000));
  59.   assign _zz_5_ = (! irFilted);
  60.   assign _zz_6_ = (irFsm_cnt == (18'b000001010100011000));
  61.   assign _zz_7_ = (irFsm_cnt == (18'b000000000111000000));
  62.   assign _zz_8_ = (irFsm_cnt == (18'b000000001010100000));
  63.   assign _zz_9_ = (! irFilted);
  64.   assign _zz_10_ = (irFsm_cnt == (18'b000000000111000000));
  65.   assign _zz_11_ = (! irFilted);
  66.   assign _zz_12_ = (irFsm_cnt == (18'b000000001010100000));
  67.   assign _zz_13_ = (! irFilted);
  68.   assign _zz_14_ = (irFsm_cnt == (18'b000000010101001000));
  69.   assign _zz_15_ = (! irFilted);
  70.   assign _zz_16_ = (irFsm_cnt == (18'b000000011111101100));
  71.   assign _zz_17_ = (! irFilted);
  72.   assign _zz_18_ = (irFsm_cnt == (18'b001000001101010000));
  73.   assign _zz_19_ = (irFsm_cnt == (18'b000001110000100000));
  74.   assign _zz_20_ = (irFsm_cnt == (18'b000010101000110000));
  75.   assign _zz_21_ = (! irFilted);
  76.   assign _zz_22_ = (irFsm_cnt == (18'b000000011100001000));
  77.   assign _zz_23_ = (! irFilted);
  78.   assign _zz_24_ = (irFsm_cnt == (18'b000000101010001100));
  79.   assign _zz_25_ = (irFsm_cnt == (18'b000000000111000000));
  80.   assign _zz_26_ = (irFsm_cnt == (18'b000000001010100000));
  81.   assign _zz_27_ = (! irFilted);
  82.   assign _zz_28_ = (irFsm_cnt == (18'b010011001011011000));
  83.   assign _zz_29_ = (! irFilted);
  84.   assign _zz_30_ = (irFsm_cnt == (18'b011100110001000100));
  85.   `ifndef SYNTHESIS
  86.   always @(*) begin
  87.     case(irFsm_stateReg)
  88.       `irFsm_enumDefinition_binary_sequential_boot : irFsm_stateReg_string = "boot                    ";
  89.       `irFsm_enumDefinition_binary_sequential_irFsm_stateIdle : irFsm_stateReg_string = "irFsm_stateIdle         ";
  90.       `irFsm_enumDefinition_binary_sequential_irFsm_stateHeadL : irFsm_stateReg_string = "irFsm_stateHeadL        ";
  91.       `irFsm_enumDefinition_binary_sequential_irFsm_stateHeadL_1 : irFsm_stateReg_string = "irFsm_stateHeadL_1      ";
  92.       `irFsm_enumDefinition_binary_sequential_irFsm_stateHeadH : irFsm_stateReg_string = "irFsm_stateHeadH        ";
  93.       `irFsm_enumDefinition_binary_sequential_irFsm_stateHeadH_1 : irFsm_stateReg_string = "irFsm_stateHeadH_1      ";
  94.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataL : irFsm_stateReg_string = "irFsm_stateDataL        ";
  95.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataL_1 : irFsm_stateReg_string = "irFsm_stateDataL_1      ";
  96.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataH : irFsm_stateReg_string = "irFsm_stateDataH        ";
  97.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataH_1 : irFsm_stateReg_string = "irFsm_stateDataH_1      ";
  98.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataH_2 : irFsm_stateReg_string = "irFsm_stateDataH_2      ";
  99.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataH_3 : irFsm_stateReg_string = "irFsm_stateDataH_3      ";
  100.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataEnd : irFsm_stateReg_string = "irFsm_stateDataEnd      ";
  101.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadL : irFsm_stateReg_string = "irFsm_stateRepeatHeadL  ";
  102.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadL_1 : irFsm_stateReg_string = "irFsm_stateRepeatHeadL_1";
  103.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadH : irFsm_stateReg_string = "irFsm_stateRepeatHeadH  ";
  104.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadH_1 : irFsm_stateReg_string = "irFsm_stateRepeatHeadH_1";
  105.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatEndL : irFsm_stateReg_string = "irFsm_stateRepeatEndL   ";
  106.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatEndL_1 : irFsm_stateReg_string = "irFsm_stateRepeatEndL_1 ";
  107.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatEndH : irFsm_stateReg_string = "irFsm_stateRepeatEndH   ";
  108.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatEndH_1 : irFsm_stateReg_string = "irFsm_stateRepeatEndH_1 ";
  109.       default : irFsm_stateReg_string = "????????????????????????";
  110.     endcase
  111.   end
  112.   always @(*) begin
  113.     case(irFsm_stateNext)
  114.       `irFsm_enumDefinition_binary_sequential_boot : irFsm_stateNext_string = "boot                    ";
  115.       `irFsm_enumDefinition_binary_sequential_irFsm_stateIdle : irFsm_stateNext_string = "irFsm_stateIdle         ";
  116.       `irFsm_enumDefinition_binary_sequential_irFsm_stateHeadL : irFsm_stateNext_string = "irFsm_stateHeadL        ";
  117.       `irFsm_enumDefinition_binary_sequential_irFsm_stateHeadL_1 : irFsm_stateNext_string = "irFsm_stateHeadL_1      ";
  118.       `irFsm_enumDefinition_binary_sequential_irFsm_stateHeadH : irFsm_stateNext_string = "irFsm_stateHeadH        ";
  119.       `irFsm_enumDefinition_binary_sequential_irFsm_stateHeadH_1 : irFsm_stateNext_string = "irFsm_stateHeadH_1      ";
  120.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataL : irFsm_stateNext_string = "irFsm_stateDataL        ";
  121.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataL_1 : irFsm_stateNext_string = "irFsm_stateDataL_1      ";
  122.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataH : irFsm_stateNext_string = "irFsm_stateDataH        ";
  123.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataH_1 : irFsm_stateNext_string = "irFsm_stateDataH_1      ";
  124.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataH_2 : irFsm_stateNext_string = "irFsm_stateDataH_2      ";
  125.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataH_3 : irFsm_stateNext_string = "irFsm_stateDataH_3      ";
  126.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataEnd : irFsm_stateNext_string = "irFsm_stateDataEnd      ";
  127.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadL : irFsm_stateNext_string = "irFsm_stateRepeatHeadL  ";
  128.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadL_1 : irFsm_stateNext_string = "irFsm_stateRepeatHeadL_1";
  129.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadH : irFsm_stateNext_string = "irFsm_stateRepeatHeadH  ";
  130.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadH_1 : irFsm_stateNext_string = "irFsm_stateRepeatHeadH_1";
  131.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatEndL : irFsm_stateNext_string = "irFsm_stateRepeatEndL   ";
  132.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatEndL_1 : irFsm_stateNext_string = "irFsm_stateRepeatEndL_1 ";
  133.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatEndH : irFsm_stateNext_string = "irFsm_stateRepeatEndH   ";
  134.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatEndH_1 : irFsm_stateNext_string = "irFsm_stateRepeatEndH_1 ";
  135.       default : irFsm_stateNext_string = "????????????????????????";
  136.     endcase
  137.   end
  138.   `endif

  139.   assign samples_0 = ir;
  140.   assign irFsm_wantExit = 1'b0;
  141.   assign io_req = irReq;
  142.   assign io_userCode = data[7 : 0];
  143.   assign io_dataCode = data[23 : 16];
  144.   always @ (*) begin
  145.     irFsm_stateNext = irFsm_stateReg;
  146.     case(irFsm_stateReg)
  147.       `irFsm_enumDefinition_binary_sequential_irFsm_stateIdle : begin
  148.         if((! irFilted))begin
  149.           irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateHeadL;
  150.         end
  151.       end
  152.       `irFsm_enumDefinition_binary_sequential_irFsm_stateHeadL : begin
  153.         if(irFilted)begin
  154.           irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateIdle;
  155.         end else begin
  156.           if(_zz_1_)begin
  157.             irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateHeadL_1;
  158.           end
  159.         end
  160.       end
  161.       `irFsm_enumDefinition_binary_sequential_irFsm_stateHeadL_1 : begin
  162.         if(irFilted)begin
  163.           irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateHeadH;
  164.         end else begin
  165.           if(_zz_2_)begin
  166.             irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateIdle;
  167.           end
  168.         end
  169.       end
  170.       `irFsm_enumDefinition_binary_sequential_irFsm_stateHeadH : begin
  171.         if(_zz_3_)begin
  172.           irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateIdle;
  173.         end else begin
  174.           if(_zz_4_)begin
  175.             irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateHeadH_1;
  176.           end
  177.         end
  178.       end
  179.       `irFsm_enumDefinition_binary_sequential_irFsm_stateHeadH_1 : begin
  180.         if(_zz_5_)begin
  181.           irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateDataL;
  182.         end else begin
  183.           if(_zz_6_)begin
  184.             irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateIdle;
  185.           end
  186.         end
  187.       end
  188.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataL : begin
  189.         if(irFilted)begin
  190.           irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateIdle;
  191.         end else begin
  192.           if(_zz_7_)begin
  193.             irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateDataL_1;
  194.           end
  195.         end
  196.       end
  197.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataL_1 : begin
  198.         if(irFilted)begin
  199.           if((irFsm_bitCnt == (6'b100000)))begin
  200.             irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateDataEnd;
  201.           end else begin
  202.             irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateDataH;
  203.           end
  204.         end else begin
  205.           if(_zz_8_)begin
  206.             irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateIdle;
  207.           end
  208.         end
  209.       end
  210.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataH : begin
  211.         if(_zz_9_)begin
  212.           irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateIdle;
  213.         end else begin
  214.           if(_zz_10_)begin
  215.             irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateDataH_1;
  216.           end
  217.         end
  218.       end
  219.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataH_1 : begin
  220.         if(_zz_11_)begin
  221.           irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateDataL;
  222.         end else begin
  223.           if(_zz_12_)begin
  224.             irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateDataH_2;
  225.           end
  226.         end
  227.       end
  228.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataH_2 : begin
  229.         if(_zz_13_)begin
  230.           irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateIdle;
  231.         end else begin
  232.           if(_zz_14_)begin
  233.             irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateDataH_3;
  234.           end
  235.         end
  236.       end
  237.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataH_3 : begin
  238.         if(_zz_15_)begin
  239.           irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateDataL;
  240.         end else begin
  241.           if(_zz_16_)begin
  242.             irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateIdle;
  243.           end
  244.         end
  245.       end
  246.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataEnd : begin
  247.         if(_zz_17_)begin
  248.           irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadL;
  249.         end else begin
  250.           if(_zz_18_)begin
  251.             irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateIdle;
  252.           end
  253.         end
  254.       end
  255.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadL : begin
  256.         if(irFilted)begin
  257.           irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateIdle;
  258.         end else begin
  259.           if(_zz_19_)begin
  260.             irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadL_1;
  261.           end
  262.         end
  263.       end
  264.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadL_1 : begin
  265.         if(irFilted)begin
  266.           irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadH;
  267.         end else begin
  268.           if(_zz_20_)begin
  269.             irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateIdle;
  270.           end
  271.         end
  272.       end
  273.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadH : begin
  274.         if(_zz_21_)begin
  275.           irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateIdle;
  276.         end else begin
  277.           if(_zz_22_)begin
  278.             irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadH_1;
  279.           end
  280.         end
  281.       end
  282.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadH_1 : begin
  283.         if(_zz_23_)begin
  284.           irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatEndL;
  285.         end else begin
  286.           if(_zz_24_)begin
  287.             irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateIdle;
  288.           end
  289.         end
  290.       end
  291.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatEndL : begin
  292.         if(irFilted)begin
  293.           irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateIdle;
  294.         end else begin
  295.           if(_zz_25_)begin
  296.             irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateDataL_1;
  297.           end
  298.         end
  299.       end
  300.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatEndL_1 : begin
  301.         if(irFilted)begin
  302.           irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatEndH;
  303.         end else begin
  304.           if(_zz_26_)begin
  305.             irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateIdle;
  306.           end
  307.         end
  308.       end
  309.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatEndH : begin
  310.         if(_zz_27_)begin
  311.           irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateIdle;
  312.         end else begin
  313.           if(_zz_28_)begin
  314.             irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatEndH_1;
  315.           end
  316.         end
  317.       end
  318.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatEndH_1 : begin
  319.         if(_zz_29_)begin
  320.           irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadL;
  321.         end else begin
  322.           if(_zz_30_)begin
  323.             irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateIdle;
  324.           end
  325.         end
  326.       end
  327.       default : begin
  328.         irFsm_stateNext = `irFsm_enumDefinition_binary_sequential_irFsm_stateIdle;
  329.       end
  330.     endcase
  331.   end

  332.   always @ (posedge clk or posedge reset) begin
  333.     if (reset) begin
  334.       ir <= 1'b1;
  335.       irReq <= 1'b0;
  336.       irFsm_stateReg <= `irFsm_enumDefinition_binary_sequential_boot;
  337.     end else begin
  338.       ir <= io_ir;
  339.       if(((irFsm_stateNext == `irFsm_enumDefinition_binary_sequential_irFsm_stateDataEnd) && (irFsm_stateReg != `irFsm_enumDefinition_binary_sequential_irFsm_stateDataEnd)))begin
  340.         if((((data[31 : 24] ^ data[23 : 16]) == (8'b11111111)) && ((data[15 : 8] ^ data[7 : 0]) == (8'b11111111))))begin
  341.           irReq <= 1'b1;
  342.         end
  343.       end else begin
  344.         irReq <= 1'b0;
  345.       end
  346.       irFsm_stateReg <= irFsm_stateNext;
  347.     end
  348.   end

  349.   always @ (posedge clk) begin
  350.     if(1'b1)begin
  351.       samples_1 <= samples_0;
  352.     end
  353.     if(1'b1)begin
  354.       samples_2 <= samples_1;
  355.     end
  356.     irFilted <= (((1'b0 || ((1'b1 && samples_0) && samples_1)) || ((1'b1 && samples_0) && samples_2)) || ((1'b1 && samples_1) && samples_2));
  357.     case(irFsm_stateReg)
  358.       `irFsm_enumDefinition_binary_sequential_irFsm_stateIdle : begin
  359.       end
  360.       `irFsm_enumDefinition_binary_sequential_irFsm_stateHeadL : begin
  361.         if(! irFilted) begin
  362.           if(! _zz_1_) begin
  363.             irFsm_cnt <= (irFsm_cnt + (18'b000000000000000001));
  364.           end
  365.         end
  366.       end
  367.       `irFsm_enumDefinition_binary_sequential_irFsm_stateHeadL_1 : begin
  368.         if(! irFilted) begin
  369.           if(! _zz_2_) begin
  370.             irFsm_cnt <= (irFsm_cnt + (18'b000000000000000001));
  371.           end
  372.         end
  373.       end
  374.       `irFsm_enumDefinition_binary_sequential_irFsm_stateHeadH : begin
  375.         if(! _zz_3_) begin
  376.           if(! _zz_4_) begin
  377.             irFsm_cnt <= (irFsm_cnt + (18'b000000000000000001));
  378.           end
  379.         end
  380.       end
  381.       `irFsm_enumDefinition_binary_sequential_irFsm_stateHeadH_1 : begin
  382.         if(_zz_5_)begin
  383.           irFsm_bitCnt <= (6'b000000);
  384.           data <= (32'b00000000000000000000000000000000);
  385.         end else begin
  386.           if(! _zz_6_) begin
  387.             irFsm_cnt <= (irFsm_cnt + (18'b000000000000000001));
  388.           end
  389.         end
  390.       end
  391.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataL : begin
  392.         if(! irFilted) begin
  393.           if(! _zz_7_) begin
  394.             irFsm_cnt <= (irFsm_cnt + (18'b000000000000000001));
  395.           end
  396.         end
  397.       end
  398.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataL_1 : begin
  399.         if(! irFilted) begin
  400.           if(! _zz_8_) begin
  401.             irFsm_cnt <= (irFsm_cnt + (18'b000000000000000001));
  402.           end
  403.         end
  404.       end
  405.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataH : begin
  406.         if(! _zz_9_) begin
  407.           if(! _zz_10_) begin
  408.             irFsm_cnt <= (irFsm_cnt + (18'b000000000000000001));
  409.           end
  410.         end
  411.       end
  412.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataH_1 : begin
  413.         if(_zz_11_)begin
  414.           irFsm_bitCnt <= (irFsm_bitCnt + (6'b000001));
  415.         end else begin
  416.           if(! _zz_12_) begin
  417.             irFsm_cnt <= (irFsm_cnt + (18'b000000000000000001));
  418.           end
  419.         end
  420.       end
  421.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataH_2 : begin
  422.         if(! _zz_13_) begin
  423.           if(! _zz_14_) begin
  424.             irFsm_cnt <= (irFsm_cnt + (18'b000000000000000001));
  425.           end
  426.         end
  427.       end
  428.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataH_3 : begin
  429.         if(_zz_15_)begin
  430.           irFsm_bitCnt <= (irFsm_bitCnt + (6'b000001));
  431.           data[irFsm_bitCnt[4 : 0]] <= 1'b1;
  432.         end else begin
  433.           if(! _zz_16_) begin
  434.             irFsm_cnt <= (irFsm_cnt + (18'b000000000000000001));
  435.           end
  436.         end
  437.       end
  438.       `irFsm_enumDefinition_binary_sequential_irFsm_stateDataEnd : begin
  439.         if(! _zz_17_) begin
  440.           if(! _zz_18_) begin
  441.             irFsm_cnt <= (irFsm_cnt + (18'b000000000000000001));
  442.           end
  443.         end
  444.       end
  445.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadL : begin
  446.         if(! irFilted) begin
  447.           if(! _zz_19_) begin
  448.             irFsm_cnt <= (irFsm_cnt + (18'b000000000000000001));
  449.           end
  450.         end
  451.       end
  452.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadL_1 : begin
  453.         if(! irFilted) begin
  454.           if(! _zz_20_) begin
  455.             irFsm_cnt <= (irFsm_cnt + (18'b000000000000000001));
  456.           end
  457.         end
  458.       end
  459.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadH : begin
  460.         if(! _zz_21_) begin
  461.           if(! _zz_22_) begin
  462.             irFsm_cnt <= (irFsm_cnt + (18'b000000000000000001));
  463.           end
  464.         end
  465.       end
  466.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadH_1 : begin
  467.         if(! _zz_23_) begin
  468.           if(! _zz_24_) begin
  469.             irFsm_cnt <= (irFsm_cnt + (18'b000000000000000001));
  470.           end
  471.         end
  472.       end
  473.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatEndL : begin
  474.         if(! irFilted) begin
  475.           if(! _zz_25_) begin
  476.             irFsm_cnt <= (irFsm_cnt + (18'b000000000000000001));
  477.           end
  478.         end
  479.       end
  480.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatEndL_1 : begin
  481.         if(! irFilted) begin
  482.           if(! _zz_26_) begin
  483.             irFsm_cnt <= (irFsm_cnt + (18'b000000000000000001));
  484.           end
  485.         end
  486.       end
  487.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatEndH : begin
  488.         if(! _zz_27_) begin
  489.           if(! _zz_28_) begin
  490.             irFsm_cnt <= (irFsm_cnt + (18'b000000000000000001));
  491.           end
  492.         end
  493.       end
  494.       `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatEndH_1 : begin
  495.         if(! _zz_29_) begin
  496.           if(! _zz_30_) begin
  497.             irFsm_cnt <= (irFsm_cnt + (18'b000000000000000001));
  498.           end
  499.         end
  500.       end
  501.       default : begin
  502.       end
  503.     endcase
  504.     if(((! (irFsm_stateReg == `irFsm_enumDefinition_binary_sequential_irFsm_stateHeadL)) && (irFsm_stateNext == `irFsm_enumDefinition_binary_sequential_irFsm_stateHeadL)))begin
  505.       irFsm_cnt <= (18'b000000000000000000);
  506.     end
  507.     if(((! (irFsm_stateReg == `irFsm_enumDefinition_binary_sequential_irFsm_stateHeadH)) && (irFsm_stateNext == `irFsm_enumDefinition_binary_sequential_irFsm_stateHeadH)))begin
  508.       irFsm_cnt <= (18'b000000000000000000);
  509.     end
  510.     if(((! (irFsm_stateReg == `irFsm_enumDefinition_binary_sequential_irFsm_stateDataL)) && (irFsm_stateNext == `irFsm_enumDefinition_binary_sequential_irFsm_stateDataL)))begin
  511.       irFsm_cnt <= (18'b000000000000000000);
  512.     end
  513.     if(((! (irFsm_stateReg == `irFsm_enumDefinition_binary_sequential_irFsm_stateDataH)) && (irFsm_stateNext == `irFsm_enumDefinition_binary_sequential_irFsm_stateDataH)))begin
  514.       irFsm_cnt <= (18'b000000000000000000);
  515.     end
  516.     if(((! (irFsm_stateReg == `irFsm_enumDefinition_binary_sequential_irFsm_stateDataEnd)) && (irFsm_stateNext == `irFsm_enumDefinition_binary_sequential_irFsm_stateDataEnd)))begin
  517.       irFsm_cnt <= (18'b000000000000000000);
  518.     end
  519.     if(((! (irFsm_stateReg == `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadL)) && (irFsm_stateNext == `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadL)))begin
  520.       irFsm_cnt <= (18'b000000000000000000);
  521.     end
  522.     if(((! (irFsm_stateReg == `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadH)) && (irFsm_stateNext == `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatHeadH)))begin
  523.       irFsm_cnt <= (18'b000000000000000000);
  524.     end
  525.     if(((! (irFsm_stateReg == `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatEndL)) && (irFsm_stateNext == `irFsm_enumDefinition_binary_sequential_irFsm_stateRepeatEndL)))begin
  526.       irFsm_cnt <= (18'b000000000000000000);
  527.     end
  528.   end

  529. endmodule
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2019-11-1 17:25:09 | 显示全部楼层
这是C++啊?

出0入0汤圆

发表于 2019-11-1 17:36:49 | 显示全部楼层
解码+自学习就有意思了

出0入8汤圆

发表于 2019-11-1 17:53:30 来自手机 | 显示全部楼层
发上来干嘛?无厘头?

出0入12汤圆

发表于 2019-11-1 18:55:54 | 显示全部楼层
spinalHDL,不错,就是 style B 的 FSM 应该更好读一些,然后用 StateDelay 应该能简化一些代码。

出0入0汤圆

 楼主| 发表于 2019-11-1 18:59:57 | 显示全部楼层
abutter 发表于 2019-11-1 18:55
spinalHDL,不错,就是 style B 的 FSM 应该更好读一些,然后用 StateDelay 应该能简化一些代码。 ...

好主意,下一个练习就这么办

出0入12汤圆

发表于 2019-11-1 19:46:20 | 显示全部楼层
本帖最后由 abutter 于 2019-11-1 19:47 编辑

还有就是 irBoundary 可以试试 SpinalEnum,用 SpinalEnumEncoding 构造。而且这个应该是跟时钟周期有关的,case class 的参数里面没有带配置参数。

出0入0汤圆

发表于 2019-11-2 18:09:09 来自手机 | 显示全部楼层
begin...end,像D

出0入0汤圆

 楼主| 发表于 2019-11-3 01:01:29 | 显示全部楼层
abutter 发表于 2019-11-1 19:46
还有就是 irBoundary 可以试试 SpinalEnum,用 SpinalEnumEncoding 构造。而且这个应该是跟时钟周期有关的 ...

这个之前没用过,需要学习下

出0入0汤圆

发表于 2019-11-4 10:48:21 | 显示全部楼层
好无意义!一行注释没有,完全不知道什么逻辑,跟乱码没区别

出0入12汤圆

发表于 2019-11-4 20:47:29 | 显示全部楼层
Eworm001 发表于 2019-11-3 01:01
这个之前没用过,需要学习下

我看了一下网络上小梅哥 IR 的实现思路,准备空闲了写一下看看。互相学习一下。

出0入0汤圆

发表于 2019-12-4 17:32:48 | 显示全部楼层
Thank you !!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 08:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表