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芷谑荂LK的两倍。下面图2~4是MCX314的读写时序图。表1是图2~4中标示的时间要求范围。 进行PCI总线传输,至少需要40条信号接口,包括数据/地址线、接口控制线、仲裁、总线命令及系统线等。每次数据传输由一个地址脉冲和一个或几个数据脉冲组成。一次传输一个地址和一个数据称为常规传输;一次传输一个地址和一批数据称为猝发传输。根据MCX314的使用特点和读写时序,进行PCI传输,最适宜采用常规传输。PCI常规传输常用的控制信号是:帧同步信号FRAME#、主设备准备好信号IRDY#、从设备准备好信号TRDY#、从设备选通信号DEVSEL#、命令/字节信号C/BE#等。下面图5~6是PCI常规传输的典型时序图。 根据MCX314器件和PCI总线传输的特点,采用16位数据总线使MCX314与PCI低端地址/数据线直接相连,可以有效地简化设计和硬件结构。 ⑴每次数据传输,主机通过PCI首先传出地址和命令字,PCI接口逻辑要能从地址中确定是不是对本机的访问,并锁存地址;同时PCI接口逻辑还要能从命令字中识别访问是读操作还是写操作。 ⑵进行读写操作,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所示。 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。下面是读写访问的仿真波形图: 图中,时钟周期为30ns。读操作,RD#信号的低有效时间为60ns,大于tRD的最大值29ns;读信号无效后地址稳定时间为15ns,在此时间内结束读操作。写操作,WR#信号的低有效脉宽60ns,大于要求值50ns,输入数据设定;写信号结束后插入8个PCI时钟周期,相当于4个MCX314时钟周期,此间,主机不能操作MCX314,MCX314有足够时间处理写入数据;片选CS#与地址保持时间都远远大于要求值5ns。
|