首页 | 期刊简介 | 编辑部 | 广告部 | 发行部 | 在线投稿 | 联系我们 | 产品信息索取
2024年12月26日星期四
2011年第01期
 
2010年第12期
 
2010年第11期
2010年第11期
 
2010年第10期
2010年第10期
 
2010年第09期
2010年第09期
 
2010年第09期
2010年第08期
 
2010年第07期
2010年第07期
 
2010年第06期
2010年第06期
 
2010年第05期
2010年第05期
 
2010年第04期
2010年第04期
 
2010年第03期
2010年第03期
 
2010年第02期
2010年第02期
 
2010年第01期
2010年第01期
 
2009年第12期
2009年第12期
 
2009年第11期
2009年第11期
 
2009年第10期
2009年第10期
 
2009年第9期
2009年第9期
 
2009年第8期
2009年第8期
 
2009年第7期
2009年第7期
 
2009年第6期
2009年第6期
 
2009年第5期
2009年第5期
 
2009年第4期
2009年第4期
 
2009年第3期
2009年第3期
 
2009年第2期
2009年第2期
 
2009年第1期
2009年第1期
 
2008年第12期
2008年第12期
 
2008年第11期
2008年第11期
 
2008年第10期
2008年第10期
 
2008年第9期
2008年第9期
 
2008年第8期
2008年第8期
 
2008年第7期
2008年第7期
 
2008年第6期
2008年第6期
 
2008年第5期
2008年第5期
 
2008年第4期
2008年第4期
 
2008年第3期
2008年第3期
 
2008年第2期
2008年第2期
 
2008年第1期
2008年第1期
PCI多轴运动控制卡的VHDL-CPLD接口设计标题
The Design of PCI Interface with VHDL-CPLD in Multiaxle Motor Control

上海豪威IC设计有限公司 怯肇乾

摘 要: 本文从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。

         
版权所有《世界电子元器件》杂志社
地址:北京市海淀区上地东路35号颐泉汇 邮编:100085
电话:010-62985649
E-mail:dongmei@eccn.com