摘 要: 本文从PCI和多轴运动控制器件的时序分析入手,重点阐述了PCI通信的CPLD状态机设计,并说明了VHDL语言的实现和MaxPlusII的验证。
关键词: 时序分析;CPLD器件;状态图;VHDL语言;PCI传输
PCI多轴运动控制卡是精密伺服驱动控制系统中的主要部件,传统设计多采用PCI桥件和运动控制器件构建,这样虽然开发周期短,但成本却非常高。用"CPLD做PCI接口
+ TMS320C2400系列DSP做运动控制器?quot;的设计,构成的系统简洁可靠,成本低廉,开发周期短,是一种行之有效的板卡开发途径。根据PCI总线的传输时序和运动控制器件的读写时序要求,以Altera的CPLD器件和开发工具,使用VHDL语言,进行状态机构造,很快地实现了多轴运动控制卡的PCI接口设计,并进行了功能模拟和定时分析,很好地达到了欲期目的。在系统编程、下载器件、测试,工作效果很好。以下,介绍整个设计思想,供广大同行参考。
接口系统模型简介
用CPLD做多轴运动控制卡的PCI接口,所构成的板卡系统用图1描述。
图1 PCI-CPLD接口系统模型图(略)
这里,CPLD/FPGA完成PCI主/从传输时序的逻辑构成与变换,并直接对专用运动控制器件或TMS320C2400系列DSP进行适当操作。整个系统的设计中,CPLD使用PCI总线的33MHz时钟,以简化PCI传输的逻辑设计。
总线传输时序分析
运动控制器件采用日本NOVA的MCX314专用器件。MCX314是一款能够同时控制4个伺服马达或步进马达的运动控制芯片,它以脉冲串形式输出,能对伺服马达和步进马达进行位置控制、插补驱动、速度控制等实时监控。MCX314单独使用16MHz晶振时钟。通过MCX314进行运动监控,主要是下达命令,进行运动状态参数的读取或运动参数的发送。在MCX314中,这些命令和参数对应不同地址的寄存器,每个寄存器字宽16位,这些寄存器共用16个地址。对MCX314进行写操作后,最大四个CLK周期内不能再连续读写操作,以使MCX314有足够时间处理数据,外部表现为MCX314的BUSY#线在WR#写信号的上升沿后最大二个SCLK周期期间保持低激活,SCLK周期是CLK的两倍。下面图2~4是MCX314的读写时序图。表1是图2~4中标示的时间要求范围。
进行PCI总线传输,至少需要40条信号接口,包括数据/地址线、接口控制线、仲裁、总线命令及系统线等。每次数据传输由一个地址脉冲和一个或几个数据脉冲组成。一次传输一个地址和一个数据称为常规传输;一次传输一个地址和一批数据称为猝发传输。根据MCX314的使用特点和读写时序,进行PCI传输,最适宜采用常规传输。PCI常规传输常用的控制信号是:帧同步信号FRAME#、主设备准备好信号IRDY#、从设备准备好信号TRDY#、从设备选通信号DEVSEL#、命令/字节信号C/BE#等。下面图5~6是PCI常规传输的典型时序图。
图2 16位数据总线的MCX314读操作时序(略)
图3 16位数据总线的MCX314写操作时序(略)
图4 MCX314的BUSY时序(略)
图5 PCI常规读操作时序(略)
图6 PCI常规写操作时序(略)
根据MCX314器件和PCI总线传输的特点,采用16位数据总线使MCX314与PCI低端地址/数据线直接相连,可以有效地简化设计和硬件结构。
⑴每次数据传输,主机通过PCI首先传出地址和命令字,PCI接口逻辑要能从地址中确定是不是对本机的访问,并锁存地址;同时PCI接口逻辑还要能从命令字中识别访问是读操作还是写操作。
表1:MCX314读写的时序时间要求范围(略)
⑵进行读写操作,PCI接口逻辑要向PCI总线产生适当的TRDY#、DEVSEL#信号,只有在IRDY#、TRDY#、DEVSEL#都为低状态时,PCI操作才能完成;同时,PCI接口逻辑还需要向MCX314产生适当的片选CS#、读RD#或写WR#信号。
⑶对MCX314的读操作,RD#信号的低有效时间要大于tRD的最大值29ns。
⑷对MCX314的写操作,要保证WR#信号的低有效脉宽tww不小于50ns,输入数据的设定时间tDW不小于30ns,片选CS#与地址保持时间要不小于5ns。
⑸对MCX314写操作后,在逻辑设计上要保证至少8个PCI时钟周期(33MHz)内主机不再对它进行读写操作,以使MCX314有足够时间处理数据。即要插入适当时间的TRDY#信号,以使主机能够产生等待,不操作MCX314器件。
⑹片选CS#、读RD#、写WR#有效期间,地址信号要始终有效并确定为某一值。
CPLD实现的状态机构设
状态机的构造
根据上述时序图的分析,完成此特定PCI总线传输需要设计七个状态:状态S0标识PCI总线空闲时期;状态S1标识地址与总线命令识别阶段;状态S2、S4、S6、S7完成写操作及其写后的适当等待周期;状态S3、S5完成读操作。
状态功能的确定
设计各状态执行以下功能:
状态S0~S1:对PCI总线,置高信号TRDY#、DEVSEL#;对MCX314,置高片选信号CS#、读信号RD#、写信号WR#,地址呈现三态。在S1态还要完成:依据地址信号确定是不是对本机的选择,并识别是不是读或写操作,锁存访问地址。
状态S3、S5:对MCX314,产生低有效的片选信号CS#、读信号RD#,并确定读写访问的地址。在S5态,对PCI总线,置低信号TRDY#、DEVSEL#,以完成PCI读操作。
状态S2、S4、S6、S7:对MCX314的片选信号CS#在S2态产生,在S4、S6态保持,进入S7态结束;S2、S4态写信号WR#低有效;S6态产生8个PCI周期长的等待时期;S7态置低信号TRDY#以结束PCI写操作;在S2、S4、S7态,产生低有效的DEVSEL#。
状态变化的确定
根据对PCI总线传输时序的分析,影响设想的各个状态相互转化的因素是:帧同步信号FRAME#、主设备准备好信号IRDY#、对从设备的读识别信号read_map、写识别信号write_map及其等待状态计数器acc值。这里,用read_map、write_map标识状态S1产生的中间识别信号。
需要注意,在状态S1要锁存收到的地址,在状态S6变化时要适时进行时钟周期计数。
还要注意,状态机设计时产生的容错问题,使非设计状态能够无条件回到空闲态S0。
状态图的规划
综上所述,设计规划状态图如图7所示。
图7 设计规划状态图(略)
VHDL语言的描述
设计使用四个进程和几个并行语句,实现整个CPLD的功能:一个进程完成从设备及其读写操作的识别;一个进程完成操作地址的获取;一个进程完成写操作后等待态的插入;一个进程完成状态机的相互变化;几个并行语句完成操作信号的产生。需要注意,各状态里完成的功能要用并行语句实现,不能再用进程,否则就会引起逻辑综合的麻烦,甚至根本不能综合。整个程序如下:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
ENTITY pci_itfc IS
PORT(clk, rst, frame, irdy: IN STD_LOGIC;
ad_high : IN STD_LOGIC_VECTOR(7 downto 4);
ad_low : IN STD_LOGIC_VECTOR(3 downto 1);
c_be: INSTD_LOGIC_VECTOR(3 downto 0);
trdy, devsel: OUT STD_LOGIC;
cs, rd, wr: OUT STD_LOGIC;
addr : OUT STD_LOGIC_VECTOR(2 downto 0));
END pci_itfc;
ARCHITECTURE behave OF pci_itfc IS
SIGNAL addr_map : STD_LOGIC_VECTOR(3 downto 1);
SIGNAL acc : STD_LOGIC_VECTOR(3 downto 0);
SIGNAL rd_map, wr_map : STD_LOGIC;
TYPE state_type IS (s0, s1, s2, s3, s4, s5, s6, s7);
SIGNAL state : state_type;
BEGIN
identify : PROCESS (clk) --读、写、设备卡的识别
BEGIN
IF rising_edge(clk) THEN
IF c_be=X"6" AND ad_high=X"f" AND state=s1 THEN
rd_map<= '0';--读
wr_map<= '1';
ELSIF c_be=X"7" AND ad_high=X"f" AND state=s1
THEN
rd_map<= '1';--写
wr_map<= '0';
ELSIF state=s0 THEN
rd_map<= '1';
wr_map <= '1';
END IF;
END IF;
END PROCESS;
addr_capture : PROCESS (clk) --操作地址的获取
BEGIN
IF rising_edge(clk) THEN
IF state=s1 THEN addr_map<=ad_low;
END IF;
END IF;
END PROCESS;
delay_count : PROCESS (clk)--写迟延的增加
BEGIN
IF rising_edge(clk) THEN
IF state=s0 THEN acc <= "0000";
ELSIF state=s6 THEN acc <= acc + 1;
END IF;
END IF;
END PROCESS;
--操作信号的产生
addr <= "ZZZ" WHEN state = s0 OR state = s7 ELSE
addr_map;
trdy <= '0' WHEN state=s5 OR state=s7 ELSE
'1';
devsel<='0' WHEN state=s2 OR state=s4 OR state=s5
OR state = s6 OR state = s7 ELSE '1';
cs <= '1' WHEN state=s0 OR state=s1 OR state=s7 ELSE
'0';
rd <= '0' WHEN state=s3 OR state=s5 ELSE
'1';
wr <= '0' WHEN state=s2 OR state=s4 ELSE
'1';
state_change : PROCESS (clk, rst)--状态机的变化
BEGIN
IF rst='0' THEN state <= s0;
ELSIF falling_edge(clk) THEN
CASE state IS
WHEN s0 =>
IF frame='0' AND irdy='1' THEN state <= s1;
ELSE state <= s0;
END IF;
WHEN s1 =>
IF rd_map ='0' THEN state<=s3;
ELSIF wr_map ='0' THEN state<=s2;
ELSE state <= s0;
END IF;
WHEN s2 =>
IF frame='1' AND irdy='0' THEN state <= s4;
ELSE state <= s0;
END IF;
WHEN s3 =>
IF frame='1' AND irdy='0' THEN state <= s5;
ELSE state <= s0;
END IF;
WHEN s4 =>
IF frame='1' AND irdy='0' THEN state <= s6;
ELSE state <= s0;
END IF;
WHEN s5 => state <= s0;
WHEN s6 =>
IF frame='1' AND irdy='1' THEN state <= s0;
ELSIF acc=X"8" THEN state <= s7;
ELSE state <= s6;
END IF;
WHEN s7 => state <= s0;
WHEN OTHERS => state <= s0;
END CASE;
END IF;
END PROCESS state_change;
END behave;
MaxPlusII的验证
设计CPLD,使用软件MaxPlusII进行逻辑综合、功能模拟与定时分析,选用Altera的Max7000系列的在系统可编程器件EPM7032STC44-10。下面是读写访问的仿真波形图:
图8 写操作的仿真模拟波形图(略)
图9 读操作的仿真模拟波形图(略)
图中,时钟周期为30ns。读操作,RD#信号的低有效时间为60ns,大于tRD的最大值29ns;读信号无效后地址稳定时间为15ns,在此时间内结束读操作。写操作,WR#信号的低有效脉宽60ns,大于要求值50ns,输入数据设定;写信号结束后插入8个PCI时钟周期,相当于4个MCX314时钟周期,此间,主机不能操作MCX314,MCX314有足够时间处理写入数据;片选CS#与地址保持时间都远远大于要求值5ns。
|