郑凡凡,周天熠,王 昕,丛 伟,罗兴科
(北京宇航系统工程研究所,北京,100076)
测量系统数字量变换器用于接收控制系统发送的三路异步RS422协议信号[1],并将数据形成一定码流送给后级中心程序器。数字量变换器由数据综合板和数据采集板组成。数据综合板和数据采集板的模块功能分别如图1和图2所示。
图1 数据采集模块功能Fig.1 Functional block of a data acquisition board
数据采集板用于接收控制系统的RS422 协议信号,将串行数据转换成并行数据并存入外置FIFO 芯片,在与数据综合模块进行数据交互时,在读使能信号和片选地址信号的作用下,将并行数据送至数据综合模块。总线驱动芯片用于控制数据方向。
数据综合板用于接收中心程序器的帧同步信号和移位脉冲信号,从外置FLASH 中读取已提前写入的波道表信息,生成读使能信号和地址信号送至数据采集模块,同时获取数据采集模块的并行数据,并形成串行码流送至中心程序器。
随着技术的发展,电子电路变得越来越复杂,利用软件进行电路仿真设计开始发挥越来越重要的作用。但是在过去十余年中,在数字量变换器的研制过程中,未能针对整机及模块中的关键元器件(如先进先出存储器(First-in First-out Memory,FIFO)、闪存(FLASH))进行全面、系统的仿真,软件开发方测试或者软件第三方测评只针对两种模块的可编程逻辑器件(Complex Programmable Logic Device,CPLD)的Verilog 程序[2],未包含CPLD 与外置FIFO 芯片、与外置FLASH 芯片的数据交互过程,更未体现两个模块间的数据交互过程。究其原因在于这些关键元器件功能复杂,模型建立非常困难,市面上没有能够直接使用的模型。元器件的模型无法建立,模块或整机的仿真就无法进行,只能在产品研制出来后,靠设计经验和万用表、示波器进行调试,模块间、产品间联试一旦出现问题,故障机理不清,排查、定位困难重重,产品归零工作负担巨大。
从元器件级功能性能特性入手开展建模,进而开展模块级和整机级仿真,就能够在设计阶段提早发现和解决绝大多数设计问题,并在产品发生故障时进行快速定位和验证,有效提高设计能力和试验效率。
综上所述,本文使用ISE14.7 和Modelsim SE-64 10.4,使用Xilinx 公司的FPGA XC4VSX35-10ff668,针对数字量变换器整机建模问题,深入研究对关键元器件进行建模,对元器件模型进行互连建立单个模块的模型,对模块模型互连从而得到整机的模型,同时针对模块间接口信号进行仿真并分析其时序关系,将该关键设计要素直接显示在仿真软件中,增强软件的可靠性。
基于图2,欲建立数据综合模块模型,须先建立其中关键元器件FLASH模型。
外置FLASH 具体型号为AT49F512,对FLASH既可进行读取操作,也可进行写入操作,并且断电时不会丢失数据。在数据综合模块中,提前将波道表文件(.dat文件)下载到FLASH中,在产品上电后逻辑器件CPLD 从FLASH 中读取其中存储的波道数据,进而生成用于板间交互的片选地址信号。
Xilinx 公司的FPGA 提供了大量的存储器资源,包含内嵌块存储器、分布式存储器以及移位寄存器,利用这些资源可以生成深度、位宽可配置的只读存储器(Read-Only Memory,ROM)、FIFO以及移位寄存器等存储逻辑[3]。ROM 存储的数据稳定,断电后所存数据不会改变,并且结构简单使用方便。结合数据综合板对FLASH 的使用方式,使用FPGA 的ROM IP核对其进行建模。
在ISE14.7 建立工程后,在存储器IP 核配置界面设置其为“Single Port ROM”,位宽设置为8 位,深度根据波道表中存储数据量而定(此处设置为256)。另外根据波道表形成存储器初始化文件(.coe 文件)对ROM核进行初始化[4],生成的ROM核完全具备外置FLASH的功能。
编写测试文件对ROM 核进行数据读取,可读出其中存储的波道表,具体如图3 所示。从图3 可以看出,输出信号在1、2、3 之间变化,可用于代表第1路RS422 信 号、第2 路RS422 信号、第3 路RS422 信号。在空余波道处读出了预先写入的FF。
图3 对ROM核读取其存储波道表Fig.3 Read the data of the ROM IP core
基于图2,对FLASH 建立模型后,针对原有的CPLD+FLASH架构,使用FPGA进行替代。即CPLD中Verilog代码经过适应性修改移植到FPGA中,同时使用FPGA的ROM核对FLASH进行建模。最终,数据综合模块可抽象为ISE中的一个工程。图4为数据综合模块的ISE工程,该模块的输入输出信号如图5所示。
图4 数据综合模块开发工程Fig.4 The development project of the data fusion board
图5 数据综合模块输入输出信号Fig.5 Input and output signals of the data fusion board
顶层文件XPC.v调用rom核后,接收中心程序器的帧同步信号frame 和码同步信号shift,接收数据采集板的并行数据q,接收本地时钟clk,向数据采集板输出读使能信号read和波道地址信号addr,向中心程序器输出串行码流data信号。
基于图1,欲建立数据采集模块模型,须先建立其中关键元器件FIFO模型。
外置FIFO 具体型号为IDT7205,FIFO 存储器是双口缓冲器,其中一个是存储器的输入口,另一个是存储器的输出口,常用于数据的缓存或者高速异步数据的交互。此外,FIFO具有满指示信号full和空指示信号empty。当full 信号有效时,就不再往FIFO 中写入数据,当empty信号有效时,就不能再从FIFO中读取数据[5]。
在数据采集模块中,异步串口数据接收模块(uart.v)将外部的异步串行数据转化为8 位位宽的字节数据,完成串转并操作,同时生成控制FIFO 写使能信号,并行数据在写使能信号作用下被写入FIFO中。结合数据采集模块对外置FIFO 的使用方式,使用FPGA自带的FIFO IP核对其进行建模[6]。
在ISE14.7 建立工程后,在存储器IP 核配置界面设置FIFO 类型为“Independent Clocks(RDCLK,WRCLK)Block RAM”。写入位宽设置为8位,读出位宽设置为8 位,FIFO 深度设置为8 192 字节,和外置芯片大小一致。生成的FIFO 核完全具备外置FIFO的功能。
编写测试文件对FIFO 核进行测试,首先对FIFO进行写操作,然后对FIFO 进行读操作。写入时判断是否写满,读出时判断是否读空。图6为对FIFO核写入测试数据,从图6中可以看出,在写使能信号wrreq高电平有效后,在写时钟上升沿,将data 写入到fifo中,fifo 中逐渐写入了1、2、…、16,并且计数器wrdatacount滞后于写入数据一个周期,即本时钟上升沿写入数据1,下一个时钟上升沿wrdatacount变为1。fifo处于不满状态。
图6 对FIFO核写入测试数据Fig.6 Write test data to FIFO IP core
图7为对FIFO核读出已存数据。从图7中可以看到,在读使能信号rdreq高电平有效后,在读时钟上升沿,从FIFO中依次读出之前写入的1、2、…、16,且先写入1先读出1,后写入16后读出16。当数据全部读出后,rdempty变为高,表明FIFO处于读空状态。同时计数器rd_data_count 由16 变为0,且rd_data_count滞后于读出数据一个周期,即本时钟上升沿读出一个数据,下一个时钟上升沿计数器自减一。
图7 对FIFO核读出已存数据Fig.7 Read the stored data from the FIFO IP core
基于图1,对FIFO 建立模型后,针对原有的CPLD+FIFO 架构,使用FPGA 进行替代。即采集板CPLD中Verilog代码经过适应性修改移植到FPGA中,同时使用FPGA 的FIFO 核对外置FIFO 进行建模。总线驱动芯片控制数据的流向,可使用Verilog程序进行建模。最终,将各个元器件模型进行互连后,数据采集模块可抽象为ISE中一个工程。图8为数据采集模块的ISE工程,该模块的输入输出信号如图9所示。
图8 数据采集模块开发工程Fig.8 The development project of the data acquisition board
图9 数据采集模块程序输入输出信号Fig.9 Input and output signals of the data acquisition board
数据采集模块需接收控制系统三路异步RS422协议信号,故调用3次异步串口数据接收模块uart.v和3次FIFO 核。顶层模块XDP.v 接收三路异步RS422 协议信号,在调用uart.v 后将外部串行数据转化为并行数据并写入3个FIFO核中,在收到来自数据综合板的读使能信号read和地址信号addr后,在采集板时钟作用下向数据综合模块输出并行数据q。
基于数据综合模块模型和数据采集模块模型,建立数字量变换器单机的整机电学模型,即对两个模块进行联合仿真。
在ISE中建立一个更顶层的工程,该工程应包含原数据采集板和数据综合板的工程,即原每个工程的顶层文件(XPC.v 和XDP.v)作为一个子模块,在一个最顶层文件中被调用,以实现数据综合模块和数据采集模块的联合仿真。该设计思想不局限于数字量变换器单机内的两个模块,可推广至不同单机间多个模块的联合仿真。
基于图4 和图8 两个模块的联合建模,即整机电学模型,是一个更顶层的工程,见图10。XDP.v调用3 次FIFO 核 和3 次uart.v 文件,XPC.v 调用ROM 核,两者和图4、图8 中的两个工程相一致。基于这两个子工程以及XDP.v 和XPC.v,建立最顶层文件XPC_XDP_unity.v,在该文件中调用XPC.v 和XDP.v并进行例化。须从两个子模块各自的输入输出信号中识别出联合模型的输入输出信号。两个子模块之间的接口信号可设置为连线型变量wire,既非联合模型的外部输入信号,亦非联合模型的对外输出信号。之后,针对最顶层文件XPC_XDP_unity.v编写测试文件XPC_XDP_unity_test.v对整个工程进行仿真。
图10 数据综合模块与数据采集模块联合仿真工程Fig.10 The co-simulation project of the data fusion board and the data acquisition board
通过以上流程可建立数字量变换器的RS422数据采集模块和数据综合模块的联合仿真模型。建立顶层工程和顶层工程的测试文件是一个非常繁琐的过程。应准确识别联合模型中所有外部信号和模块间互连信号,将所有对外信号分为输入信号和输出信号,将所有输入信号的波形准确地写入测试文件中作为激励源,观察模型输出是否和实际输出一致。
在本联合模型中,输入信号包含两个模块各自的时钟信号,来自控制系统三路异步RS422 协议信号[1,7],来自中心程序器的帧同步信号和移位脉冲信号。输出信号包含输出给中心程序器的串行码流data信号。而读使能信号read、波道地址信号addr、并行数据q属于模块间互连信号。具体如图11所示。将输入信号写入测试文件中施加于联合模型作为激励源[8],得到联合模型的输出,见图12。
图11 联合模型的输入输出信号和模块间信号Fig.11 Input and output signals and internal signals of the combined model
其中,第1路RS422串行信号rxd1对应的有效字节 为“11、12、13、14、15、16、17、18、19、1A”,第2 路RS422 串行信号rxd2 对应的有效字节为“21、22、23、24、25、26、27、28、29、2A”,第3路RS422 串行信号rxd3 对应的有效字节为“31、32、33、34、35、36、37、38、39、3A”。从fifo_d 和fifo_we 可看出这些并行数据分别被写入对应的FIFO中。ef 信号是空指示信号,是由表征FIFO 空指示信号fifo_empty生成的信号,用于在从FIFO中读数据而FIFO 为空时在码流中插入连续3 个CC。图中最开始ef信号处于连续3个低电平状态,因为第1次从FIFO中读数时FIFO 处于空状态。当FIFO 不空时,即从FIFO中读取正常数据。结合fifo_out信号和ef信号有助于观察bufferA 和bufferB,bufferA 和bufferB 是数据综合板用于进行乒乓操作的两个寄存器,首字节为约定的FF,之后第1路异步信号被选中但此时第1路FIFO处于空状态故连续出3个CC,然后FIFO处于非空状态从其中读出数据“11、12、13、14、15、16、17”,出够7个后切换到第2路信号。第2路FIFO处于非空状态,从其中读出10 个字节“21、22、23、24、25、26、27、28、29、2A”,之后切换到第3路信号。第3 路FIFO 处于非空状态,从其中读出10 个字节“31、32、33、34、35、36、37、38、39、3A”。3 路数据的切换由地址信号addr确定,addr存储波道信息,先读10个字节第1路数据,再读10个字节第2路数据,再读10 个字节第3 路数据。data 是数据综合板把bufferA 和bufferB 的并行数据转换为串行数据后向后级设备输出的码流信号。结合data 信号和shift 信号,可以看出,整机模型输出端获得了正确的串行码流信号,和bufferA和bufferB中存储的字节一一对应。
数据采集板将外部异步串口信号转换成并行数据并将其存入FIFO中,数据综合板从数据采集板读取8位位宽的并行数据q。当数据综合板发送读信号向FIFO 中读数时,FIFO 可能处于空状态,为了方便后级设备进行数据处理,特在数据采集板中引入连续出3 个CC 的操作,即如果FIFO 为空,数据采集板向数据综合板连续送3 个CC,直到FIFO 不空为止。因此冗余字节CC的个数一定为3的整数倍。与之相对应,后级设备如果检测到连续3个CC,将直接去除之。
基于以上机制,在图12中,在第1个读信号低电平使能首字节送固定字节FF之后,地址为addr为0代表取第1路数据,此时fifo1尚未写入数据,处于空状态,所以在连续3 次读信号read 取数时,ef 信号均处于低电平状态,q 为连续3 个CC,送至bufferA 和bufferB 为连续3 个CC。当第5 次读信号低电平使能时,fifo1处于非空状态,故fifo1_out读出已经写入的第1个字节11,送至bufferB。
当地址为1 取第2 路数据时,由于fifo2 已经写入了足够多的字节处于非空状态,故ef信号均处于高电平状态,fifo2_out顺序读出已经写入的所有数据。当地址为2取第3路数据时,亦然。
乒乓操作是一种常用的用于数据流控制的设计思想[9],典型的乒乓操作方法如图13所示。
图13 乒乓操作流程Fig.13 Flow chart of ping-pong operation
乒乓操作的流程为:输入数据流通过“输入数据选择单元”将数据流等时分配到两个数据缓冲模块中,此处为两个8位位宽的寄存器bufferA和bufferB,运算处理模块主要用于完成并串转换。乒乓操作仿真结果见图14。第1 个缓冲周期即读信号低电平期间,将输入数据CC缓存到bufferA。第2个缓冲周期,flag信号由高变为低,通过flag信号的切换,将输入的数据11缓存到bufferB,同时将bufferA缓存的上个周期数据CC 进行并串转换为“11001100”。第3 个缓冲周期通过flag 信号的再次切换,将输入数据12 缓存到bufferA 中,同时将bufferB 中缓存的上个周期数据11进行并串转换为“00010001”。依次循环下去,以上流程可以从图14中得以验证。
图14 乒乓操作时序图Fig.14 Timing sequence diagram of ping-pong operation
接口信号时序设计适用于各不同模块间接口信号的数据交互过程。接口信号时序设计是否正确直接影响产品功能和性能是否足够正确和稳定。
基于前文,数据综合模块与数据采集模块间的接口信号包含3种:数据综合模块向数据采集模块传递地址信号addr,读使能信号read,数据采集模块向数据综合模块传输并行数据q。在综合板通过read 信号向采集板采集数据的时刻,采集板对综合板提供的并行数据需稳定、无跳变[10-11]。
在图10的ISE工程中,针对数据综合模块与数据采集模块的接口信号时序进行仿真。将所有输入信号的波形准确地写入测试文件中作为激励源,即可观察到两模块间的接口信号时序仿真结果。其中,clk1为数据综合板时钟信号,shift为数据综合板的移位脉冲信号,clk2为数据采集板时钟信号,rd为数据综合板read经clk2同步化后的读使能信号。数据综合板时钟clk1和数据采集板时钟clk2属于非相干时钟,标称频率相同,考虑数据采集板同步化rd信号相对于数据综合板read信号延迟的最大值和最小值,分别取两时钟相位差为0°和180°的情况进行仿真,具体见图15 和图16。
图15 两个模块接口信号时序仿真结果(时钟同相)Fig.15 Simulation results of interface signal timing between the two boards(same phase)
图16 两个模块接口信号时序仿真结果(时钟反相)Fig.16 Simulation results of interface signal timing between the two boards(opposite phase)
从图15 中可以看到,读使能信号read 低电平持续时间为两个移位脉冲周期(30 个clk1 周期),bufferA 和bufferB 用于实现乒乓缓存,在读信号低电平的中间时刻采集板q 被赋值给bufferA 和bufferB,此图中被赋值给bufferB。另外,q 稳定时刻距离read信号下降沿约为6个时钟周期,考虑到数据采集板和数据综合板间信号经过屉间连接器、信号驱动芯片等的固有延迟时间大约为1个时钟周期,故在综合板通过read信号向采集板采集数据的时刻,采集板提供的并行数据是稳定的。
同理,从图16中可以看到,q稳定时刻距离read信号下降沿约为5.5个时钟周期,同样考虑数据采集板和数据综合板间信号经过屉间连接器、信号驱动芯片等的固有延迟时间,可得在综合板通过read信号向采集板采集数据的时刻,采集板提供的并行数据是稳定的。
综上所述,在数据综合板和数据采集板时钟存在随机相位差的情况下,采集板对综合板提供的并行数据稳定、无跳变。
过去十余年,测量系统数字量变换器只针对数据采集模块或数据综合模块中可编程逻辑器件CPLD中的Verilog程序进行仿真,未能对模块中其他关键元器件建立模型,未能建立模块模型和整机模型。
数字量变换器的联合仿真研究首次攻克了该难题,建立其中关键元器件的电学模型,进而对元器件模型互连建立每个模块电学模型,最后对模块模型互连建立整机电学模型,对于每个器件、每个模块、整机的工程实现进行了充分的验证、迭代、优化,对于不同模块间协同工作实现整机功能进行了充分、直观、深入的演示。针对模块间接口信号的仿真工作,直接揭露了接口信号的时序关系,将该设计要素通过仿真软件得以直接显示,并检查、验证接口信号的时序关系是否能够满足模块间的数据交互需求,显著增强了软件的健壮性。
综上所述,通过本文的仿真研究工作,设计师在实物调试之前即可在仿真软件中对模块、整机功能和性能进行仿真、验证,从根本上提升了产品的可靠性。
以上思路和方法目前已总结形成标准,用于指导同类产品和测量系统其他类似产品的建模与仿真工作。相信在未来,建模与仿真将在产品设计、验证、优化等工作中发挥更大的作用。