用FPGA实现1553B总线接口中的曼码编解码器
①同步字头检测。当检测到数据跳变沿(下跳沿为命令字,上跳沿为数据字)时,用16MHz时钟对数据进行采集;当采集到大于一个位时的低电平或高电平时,认为同步字头有效,启动第二状态,进行处理。启动位产生的时间要注意选择,这对于消除数据中的毛刺和减少数据的延时都很重要。
②码型转换。检测到有效同步字后,启动锁相环开始分离时钟。此设计采用超前-滞后锁相环,锁相环如图5所示。
图5中边沿检测器的输出e是在u2(t)的跳变沿时产生的窄脉冲,d是c的反相,c、d、e经过与门后在f和g形式滞后和超前脉冲。h和g分别用来控制和扣除门和添加门,通过扣除门和除脉冲和通过添加门添加脉冲,它们的和输出经过分频器2得到c,也即u2(t)就能跟随u1(t)的相位了。
javascript:window.open(this.src);" style="cursor:pointer;"/>
③奇偶校验和串行并转换。用移位寄存器可实现数据的串/并转换。在设计移位寄存器时,要注意奇偶位的分离,因此在设计寄存器时需设置一定的标志位,其源代码如下:
if reset='0'then
rsr<=(others=>'0');
--全为零可确保在移位过程中idle为低电平;
rxparity<='1';
--确保在移位过程中idle=0,而在移位结束时,idle=1;
tag<='0';
--移位标志位设置,当tag=1时,移位完成;
paritygen<=paritymode;
--为奇校验时paritymode赋值为1,若为偶校验则设置为0;
elsif rxclk'event and rxclk='1'then
if idle='1'then
rsr<=(others=>'0');
rxparity<='1';
tag<='0';
paritygen<=paritymode;
elsif hunt='1'then
tag<=rsr(15);
rsr(15 downto 1)<=rsr(14 downto 0);
rsr(0)<=rxparity;
rxparity<=data1;
--进行移位,为右移寄存器;
paritypen<=parityegen xor rxparity;
--进行奇偶校验;
end if;
end if;
至此曼彻斯特的解码就完成了,其时序仿真波形如图6所示。
javascript:window.open(this.src);" style="cursor:pointer;"/>
2.2 编码
编码的过程也可分为三部分:①检测编码周期是否开始,产生同步字头;②进行串行转换,产生奇偶校验位;③对16位有效数据及奇偶位进行编码,编码周期结束。与解码同理,编码也由状态机来实现。
由此状态机可划分为四个状态进行实现,其状态机状态转换如图7所示。
编码器的输入时钟(mclk)为16MHz。当写信号(wr)为低电平时,同步头选择位(cmnd)为高是怦,开始产生命令字同步字头;反之,为同步字头。由于同步字头的高低电平各占1.5个位时,所以选取它的发送时钟为2MHz,该时钟由mclk八分频得到。同步字头产生完成,则发出控制信号开始移位。移位时钟(1MHz)由同步头生成时用的时钟两分频产生。在数据移位完成时自动添加厅偶位。曼码形成器对数据、奇偶位、同步头进行处理形成符合1553B标准的双极性字tx和ntx,完成后txrdy为高电平,等待下一个数据的写入开始再一次的编码过程,逻辑框图如图8所示。
编码其实是解码的逆过程,其工作原理非常相似,这里就不详细介绍了。编码的时序仿真波形如图9所示。
图9中tx为经过编码后的串行数据。采用此种方法进行编码,产生的数据完全正确,并且也不存在毛剌。
3 设计中存在的问题及解决办法
信号在FPGA器件内部通过连线和逻辑单元时,都有一定的延时。延时的大小与连线的长短和逻辑单元的数目有关。由于这两方面的因素,多路信号的电平值发生变化时,在信号变化的瞬间,组合逻辑的输出有先后顺序。它们并不是同时变化,而且往往会出现一些不正确的类峰信号,这些类峰信号称为“毛刺”。另外,FPGA器件与分立元件不同,其内部不存在寄生电容电感,这些毛刺将被完整的保留并向下一级传递,因此毛刺现象在PLD、FPGA设计中尤为突出。消除数据中的毛剌是设计中的一个重要问题。如果毛刺处理不好,就会影响系统性能甚至引起逻辑错误。
本设计中消除毛剌采用的方法有:①在有毛剌的输出端加D触发器;②计数器采用格雷码计数器。采用D触发器是因为D触发器的D输入端对毛剌不敏感,只要毛刺不存时钟上跳沿时出现在D输入端,就不会对输出产生影响,这样就可以消除毛刺了。采用格雷码计数器代替普通的二进制计数器,是因为格雷码计数器的输出每次只有一位数据产生变化,这就消除了竞争冒险产生的条件,避免了毛刺的产生。例如在解码器的设计中,进行码型变换时,要将接收时钟与接收的串行数据进行模2加。因为时钟滞后于数据,为了消除毛刺要将数据进行延时再进行模2加;同时还要考虑到1553B对时间的要求(两个数据之间的间隔最小只有1.5μs),因此在时钟分离时就考虑提前进行他高。在检测同步头时,一旦其高(或低)电平大于1个位时的宽度就认为同步头有效,开始进行时钟分离,这样就减小了数据延时,可有效节省时间。进行模2加后,加一D触发器可确保完全将毛刺消除。在编码器设计中在串行数据输出端加一D触发器,数据的毛刺 也被了。另外,在电路的设计中尽可能地消除毛刺产生的条件,例如分频计数器采用格雷码计数器。
图9
4 仿真及FPGA实现
为了确保设计的可行性,必须对设计进行时序仿真;为了提高芯片的性能及资源利用率,要采用专门的综合软件对设计进行优化、综合。由此采用Synplify7.1进行综合,采用MAX+PLUS II进行时序仿真。在Synplify中使用有效的代码,优化组合逻辑、减少逻辑延时等措施来提高整体性能,还进行了多个文件的分块设计,然后将这些文件映射到顶层文件进行综合,并运用VHDL对单个文件进行编写、仿真和优化。在用到组合逻辑时,Synplify会尽量避免锁存器的出现,节省逻辑单元。Synplify和其它综合软件一样,编译后生成的电子设计交换格式文件(EDIF)可以在MAX+PLUS II或Quartus II 3.0中进行编译、仿真、分配引脚和其它优化处理。因此,采用MAX+PLUS II和Synplify 7.1相结合对FPGA进行设计、优化、综合,可提高系统性能和芯片资源的利用率。
最后本设计在Altara公司ACEX1K系列的FPGA(EP1K100Q208-3)芯片上进行了实现。对于ACEX系列的芯片,它还支持寄存器配平技术、流水线操作、复制逻辑模块、使用LPM函数等技术来提高其整性性能,并针对其特点对设计进行了最后的优化。该编解码顺共占用了218个逻辑单元,占总逻辑资源的4%,这有利于今后对其进行完善和功能的添加。其输入时钟为16MHz,数据速率为1MHz,编码和解码时序波形分别如图6所示。
5 总结及设计通用性
该编码解码器采用自顶向下和自向上相结合的方法进行设计,用VHDL语言输入,用MAX+PLUS II和Synplify分别进行仿真、综合。在设计最后,针对器件进行了再一次的优化,缩短了设计周期,提高了系统性能,并且大大提高了芯片资源的利用率。
本设计具有一定的通用性,它的逻辑大部分只涉及到编、解码器本身;而它与外部的接口十分简单,只要对其读、写及同步字头选择信号进行有效控制,就能使其正常工作。它的设计是十分独立的。另外,由于选择器件资源比较丰富,故对其进行功能添加也十分方便,只需添加电路设计而不必对原有电路进行修改。