基于Nios实时以太网Pofinet RT调试

  实时以太网跟普通以太网还是不一样的,主流的实时以太网有Profinet(Siemens),EtherNet/IP(Rockwell),EtherCAT(Beckhoff),PowerLink(B&R)。各家的东西多多少少有一些区别,http://www.ethernet-powerlink.cn/newsletter/index.asp?DClassID=1&tid=3里面说得更详细。

  项目中的应用是做一个基于Profinet的从站,然后跟西门子的主站通信。这次用的Profinet ASIC是Renesas提供的TPS-1,TPS-1是一个带Cortex-M3的协议处理芯片,内部同时有一个DPRAM跟外部host-CPU通信,以便访问实时传输数据。项目中我们把TPS-1挂在FPGA上,于是就只能用内部软核Nios II来与TPS-1进行互访。

  TPS-1与host-CPU的接口在datasheet中表示如下:

Nios II增加一个avalon slave 访问外设,这是最简单的办法,按照datasheet把信号一一对应起来。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity TPS_Bridge is 
port (
    -- global signals (clock and reset)
    clk                    : IN STD_LOGIC;
    resetn                 : IN STD_LOGIC;
    
    -- Avalon-MM slave generic signals
    -- note that there is no address as this component
    -- only has 1 read and write register
    
    chipselect_n         : IN STD_LOGIC;
    address                : IN STD_LOGIC_VECTOR (15 DOWNTO 0);
    byteenable_n         : IN STD_LOGIC_VECTOR(1 downto 0);
    
    -- Avalon write interface
    avalon_write_n     : IN     STD_LOGIC;
    writedata            : IN     STD_LOGIC_VECTOR (15 downto 0);
    waitrequest_n           : OUT STD_LOGIC;
    
    -- Avalon read interface
    avalon_read_n         : IN STD_LOGIC;
    readdata            : OUT STD_LOGIC_VECTOR (15 downto 0);
    
    --TPS-1 DPRAM interface
    
    TPS_data             : INOUT STD_LOGIC_VECTOR (15 DOWNTO 0);
    TPS_addr             : OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
    -- TPS_CS assert low level
    TPS_CS               : OUT STD_LOGIC;
    -- TPS_RD assert low level
    TPS_RD                 : OUT STD_LOGIC;
    -- TPS_WR assert low level
    TPS_WR                : OUT STD_LOGIC;
    -- TPS_RDY assert low level
    TPS_RDY                 : IN  STD_LOGIC;
    -- TPS_BYTE_SEL_LOW assert low level
    TPS_BYTE_SEL_LOW  : OUT STD_LOGIC;
    -- TPS_BYTE_SEL_HIGH assert low level
    TPS_BYTE_SEL_HIGH : OUT STD_LOGIC
    
);
end entity TPS_Bridge;


architecture InterfaceLogic of TPS_Bridge is

    signal tps_wr_n :std_logic;

begin

    TPS_data <=  "ZZZZZZZZZZZZZZZZ" when tps_wr_n = '1' else writedata;
    readdata <= TPS_data;
    
    TPS_addr(15 downto 1) <= address(15 downto 1);
    TPS_addr(0) <= '0';
    
    TPS_WR <=  avalon_write_n;
    tps_wr_n <= avalon_write_n;
    
    TPS_RD <= avalon_read_n;
    
    TPS_CS <= chipselect_n;
    
    TPS_BYTE_SEL_LOW <= byteenable_n(0)  and avalon_read_n;
    TPS_BYTE_SEL_HIGH <= byteenable_n(1) and avalon_read_n;
    
    waitrequest_n    <= TPS_RDY;
    
end architecture InterfaceLogic;

接下来就是添加到Qsys里面去,其中waitrequest_n应该是选择waitrequest,这跟datasheet说得不太一致。

然后就是在 Nios II IDE中访问TPS-1,它的偏移地址0x8000开始,可以读到ID等等。

int main (VOID)
{
      printf("Hello from Nios II!\n");

      int i;

      unsigned short *buffer ;
      buffer = TPSBRIDGE_BASE + 0x8000;

      for(i = 0; i<50; i++)
      {
            printf("%x\n",*(buffer));
            buffer ++;
      }
}

结果和预期的一致,通信正常。下一步的工作就是测试IO的性能,这个时候就会验证实时以太网的实时性了。

posted @ 2013-09-14 07:40  davidchaning  阅读(946)  评论(0)    收藏  举报