文章目录
前言
本文节选自《FPGA之道》。
提高设计的鲁棒性
鲁棒即是英文Robust的音译,而鲁棒性也就是健壮性、强壮性的意思。这个世界充满着意外,充满着不可预料的东西,因此,为了让FPGA设计不至于那么脆弱,不至于一有风吹草动就撂挑子不干,我们必须想办法提高FPGA设计的鲁棒性。
一些影响设计正常工作的原因
导致设计出现问题的隐患有很多,其中主要的两种是非法输入和环境干扰,介绍如下:
非法输入
几乎所有的系统都必须同时具备输入与输出这两大关键要素,而这其中,影响系统的行为、控制系统的走向,是系统的输入环节。那么,如果输入信号或序列不符合系统设计的初衷,就可能造成系统的紊乱。
例1,对于一个命令解析系统,需要解析的命令共有10种,故其输入应该为4bits宽向量,但是由于4bits的向量共可以表示16种情况,那么当输入出现另外6种非预期的命令时,系统该怎么办?
例2,对于一个数据接收系统,事先约定好一个数据包共包含100个采样,可是当输入一个长度大于或小于100个采样的数据包时,系统该如何处理?
等等……
环境干扰
科学实验总是少不了要说明一下实验的环境,任何系统在工作的时候也是一样,环境温度多少?湿度多少?粉尘指数多少?光照如何?噪音如何?辐射如何?等等,这些都是逃避不了的外界因素。为什么仿真永远不能代替硬件实测?这就是因为仿真永远无法真实还原环境因素所带来的干扰。环境总是在不断变化的,有时细微,有时剧烈,但是总的来说,地球上的环境还是适合人类生存的,人类能抵抗零下四、五十度的严寒,也能承受四十三、四度的酷暑,一句话,“适者生存”。对于FPGA系统也是一样,输入、输出及其内部都无时无刻不受到环境因素的干扰,虽说从模拟到数字,我们已经迈出了抗干扰的一大步,但是对于FPGA设计来说,这还不够。
例1,当一个数据接收系统在等待一个数据接收使能时,由于附近一个大功率射频设备突然动作,导致线路上耦合了一个虚假的使能信号,该怎么办?
例2,由于缺少臭氧层的庇护,空间的辐射和射线都很强,因此用于航天系统中的设备都面临一种叫做“单粒子翻转”效应的环境干扰,它会有一定几率直接将寄存器中保存的数字量打翻,即0变成1、1变成0,那么当这种现象发生在FPGA内部,该怎么办?
类似上述例子的情况还有很多,不胜枚举,如果处理不当,将会导致做网站、网站被黑,做软件、软件死机,做硬件、硬件烧毁等等的囧象。因此,必须想办法提高设计的鲁棒性!
应对方法之输入预处理
输入预处理指的是在将输入信号引入相应的模块之前,先对其进行预处理,即在原有系统框图中添加一个输入预处理模块,用于矫正输入信号中存在的干扰、毛刺等不良因素,当然,矫正的方法通常是根据环境的噪声特性及以往的经验积累得出,因此预处理的效果也会随着对环境特性的认知深度及个人经验的积累多寡有着很强相关性。
如下即为没有输入预处理模块系统与添加输入预处理模块系统的框图对比:
以接收异步串口传递的信息为例,由于异步串口的波特率通常不高,一个符号通常占据几到几十微妙的时隙,而接收端为了匹配最佳采样位置,通常需要以三到几十倍以上的采样率来对异步串行信号进行采样。此时,设接收端的采样率为串口波特率的十倍,外界干扰导致异步串行信号上出现毛刺的时间宽度小于3个采样周期,那么可编写该异步串口接收系统的预处理模块HDL代码如下:
-- VHDL example
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity InputPreDealer is
Port (
clk : in std_logic;
uartInOriginal : in std_logic;
uartInCorrection : out std_logic
)