记于:2020.6.29异步
概述:在FPGA设计中,异步信号是咱们须要重点照顾的,不少不起眼的(缺少咱们仔细思考处理的)信号,每每会给咱们的设计带来挥之不去的隐患。没错,就是那种时不时出现的小问题,你想他出现的时候,它不必定出现。可是,在你想早点下班的时候,它却会不经意出现。在这个笔记里边,我将讲述一个处理一个外部输入异步信号的过程。测试
过程:spa
在咱们的一个产品中,须要用到一个母板以及一个子板,各自有一个FPGA芯片做为信号处理传输的中心。这两个FPGA之间,使用同一个状态机(3个状态,使用2bit),分别是idle状态(00),load状态(01),rtx状态(10)。从母板到子板使用的是2个普通的信号线链接,使用的是3.3v信号线,子板跟母板使用的时钟信号都是100MHz。该信号在子板中使用,做为重要的状态机信号,离职的工程师是直接的将该信号直接使用,甚至都没有将这个输入信号buffer一下。设计
那么,现象是什么样子的呢?那就是在产品作高低温的时候,常常会采集的信号抖动(消失)。其实,如今回过头来,能够考虑获得,确定是采集这个时间段的信号出现了异常。可是,因为整个信号链路比较长,咱们也怀疑过是否其余模块的输出或者开关引发的干扰问题引发的。事实上,我接手后,在处理高低温的问题上,开始也是焦头烂额,这个工程的可维护性实在太差了。顶层使用的是quartus的图像界面,像硬件同样的连线的,那么能够想象的是,他确定没有对这个设计作仿真的。而后,代码的整洁、规范、注释,确定是没有的,想都不要想。上一个离职的工程师接手过来,两年了都不敢改动一点,就算是改动了,也过不了高低温测试,也就是没法转产。好吧,离题了。总之,在验证高低温的过程当中,出现问题的缘由可能不少。调试
在我检查外部输入信号的时候,我发现这些信号都没有作输入输出的io_buffer,那不用多说了,先加上,稳妥一些。事实上,为这两根信号I_fsm_state加上输入输出buffer以后,高低温出现问题的几率(特别是低温)的状况明显减小了。原来在10台仪器中,通常会有8台高低温问题,如今可能变成了3/10台有问题。固然出现高低温问题的缘由还有其余的,好比ADC的数据采样同步问题,这个是另一个话题。当我处理完其余问题以后,也试过一次测试10台高低温,所有经过的状况。当我自觉得是没有问题以后,在接下来的一年里边,大概是两三个月,质检人员会拿一台两台仪器过来给我说是低温问题,在-10度的左右的时候出现系统信号混乱不正常的状况,等到问题升高几度,又会恢复正常。这种状况,由于自己机器从-10度的冰箱里边拿出来,开机十几分钟后,机器自己会发热,温度天然会上去,所以这不算是严重问题,也不会影响使用,加上出现的状况极少,所以我也就敷衍过去了,总的来讲,我是没有更多的头绪,以及充足的时间来解决这个问题,毕竟出现问题的时间仍是很短的。资源
根本因素出现了:同步
然而,我在调试另外另一个新板子的时候,意外的发现,这个I_fsm_state[1:0]信号,跳转竟然出现这种状况: 01 01 01 01 01 00 10 10 10 10 10;实际上,这个状态机的跳转,应该是01 01 01 01 01 10 10 10 10.也就是说,只有从01->10的状况,没有从01->00的这个设计的。当我检查是否有buffer,以及将I_fsm_state打两拍以后再使用,状况仍是同样。这时候,我就考虑,这两个信号从不一样的IO出来,通过排插走线,在100MHz的时钟下,是否可以彻底的同步呢,也便是I_fsm_state[0]须要从1->0, 以及I_fsm_state[1]须要从 0->1 ,这两个信号可否彻底同步的跳转呢。在理想状况下,是能够的,可是实际上,这两个FPGA的时钟是同频异步的,这个两个信号通过不一样的物理走线,不免会出现延时不一致的状况。所以,出现不一样步反而是必然的状况。产品
那么,既然问题的可能缘由找到了,那么问题很好解决了。方法也是多种多样的,我想到的方法一,使用时钟进行跟FIFO作跨时域处理,这个是经常使用的方法,可是须要添加时钟信号又要浪费信号线,使用FIFO,总以为仍是浪费了一些资源。方法二,增长一些同步状态机逻辑,至关于去抖电路,例如当信号从01->10的时候,若是出现00,则不进行处理,保证状态机的顺序是正常的,不会中间出现01 01 00 10 10的这种状况,毕竟两个板子出现一个周期的跳动对系统没有影响。所以,我选择了方法二,可是,这种方法不是必然合适,当须要处理的bit数位宽比较多的时候,这种方法就不适用了。方法3、若是使用格雷码的状态机,应该能够避免这个问题的,可是因为该状态机牵涉到的东西比较多,因此仍是做罢。it
这样,因为这两个信号的异步处理而引发的问题消失了。io
感想:如何处理异步信号,方法上,咱们确定听过不少,也知道出现这些状况应该怎么处理。可是,当咱们设计的时候,很容易忽略这些处理方法,或者说,咱们没有挨过板子,就不会把这些设计原则记在内心。在咱们能够进行代码设计的时候,须要尽量的按照前人总结的原则,不要走没必要要的弯路。