integer i;
if(cs) begin data=0;i=0;miso=1”b’Z; end
else begin
if(sck)
begin
data= data<<1;
data= data+mosi;
miso=(send_data>>(7-i))& 8'h01;
i=i+1;
if(i==8) begin
rev_byte= data;
end end end end
3.2时钟分频的实现
Verilog HDL所描述的所有组合逻辑或时序逻辑电路的功能都是在各自输入时钟的节拍下工作的,而对于不同的功能模块,因其电路精度要求不同对输入时钟的要求也不同,时钟频率越低,对 FPGA综合、布局布线的要求也越低,所设计出的电路也越稳定。在本设计中,系统时钟由外部 100MHz晶振提供,系统内部模块要用到的时钟有 100MHz、1MHz、 1KHz、10Hz和 1Hz五种,由计数器分频实现,限于篇幅不详述。
3.3命令解释与决策的实现 FPGA要完成与 MCU的数据交换,又要指挥各测试模块对指定通道信号的特定参量的测试,还要执行成百上千组时序信号激励和开关量信号激励,任务错综复杂,需要一个对命令的解释和决策执行机制。在具体实现上,首先对 MCU的命令号进行区间划分,决策模块收到从 SPI接口模块的命令后,判断命令的类别,分别针对握手联络命令、复位命令、测试命令(包括通道号、测试指标、时钟输入的选择)、激励发生命令(包括通道号、时序信息)、发送测试结果命令(通过 SPI接口将测试结果发送给MCU)等去触发相应 FPGA内部模块动作。
3.4信号测试的实现
信号测试功能包括对输入信号的脉宽测试、周期测试、特殊类型信号的测试等内容,限于篇幅,下面对比较典型的脉宽测试进行阐述。例如对于负脉冲信号,测试其脉宽即是测量其在某时段低电平的维持时间,可以通过计算时标信号的个数来实现。设时标信号周期为Ts,时标个数为N,则脉宽为W=Ts*N,其主要部分是计数功能,并将得到的数予以锁存。计数模块与锁存模块由控制信号发生模块控制,其逻辑框图如图 3所示。
其中 CLKX为被测脉冲,CLK为时标信号,RST为系统复位信号,WIDTH为脉宽计算结果。图中有三个控制信号:计数允许信号CNT_EN、计数清零信号 CNT_CLR和锁存信号LOAD,分别控制计数模块和锁存模块。
在实际测试中发现,由于外界干扰的影响,在被测信号出现正常脉冲前会出现多个窄带
干扰脉冲,这个脉冲的短暂低电平会让计数模块产生误动作,从而得出错误的计算结果。本文采取前级窄带脉冲过滤的方法,有效地消除了外界的干扰。其具体做法是外加一个计数模块判断输入信号的低电平时间是否超过一定门限,超过则触发其后的控制信号发生模块动作,否则不触发。 值得注意的是在后面的计数模块里要加上前级的门限值。
3.5激励信号的实现
检测系统所要产生的激励信号包括时序信号和开关量信号,时序信号的产生相对复杂,其实现机理如图 4所示。其中,START是启动信号,控制时序产生模块的启动与停止;EX_SYNC是外同步信号,在某些场合下,时序信号的产生需要与外界信号的同步,此信号用于控制信号发生的时基;计数模块负责在 CNT_EN和 CNT_CLR等控制信号下计数,实时触发相应的时序序列输出;LOCK信号用于锁定末态时序序列的状态。