基于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的性能,这个时候就会验证实时以太网的实时性了。
技术人生,浅尝不止