
#ifndef __EMBFPGA_H__
#define	__EMBFPGA_H__

#include "config.h"

//------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------

// 板载FPGA
// 可以控制6路电机信号
// 每路电机信号包括2路高速差分脉冲信号，3个输出信号和1个报警输入信号
// FPGA还控制16路普通输入信号，可以配置为下降沿外部中断
// FPGA还控制8路输出信号,可以配置为PWM输出
// FPGA还可以输出一路主轴位置信号，位置信号可以在12路实轴脉冲，两路编码器的4个脉冲信号或虚轴脉冲中选择1个输出,也可以直接控制输出


//------------------------------------------------------------------------------------------------

#define	FPGA_VER_101	0x0101		// FPGA版本v1.0.1

#define	FPGA_VER_ERR	0xFFFF		// FPGA总线错误
//------------------------------------------------------------------------------------------------

#define	FPGA_CLK		72000000L

//------------------------------------------------------------------------------------------------

#define	VAXIS		(CORE_FPGA_ADDR_BEG+0x0000)			// 虚轴
#define	AXIS(i) 	(CORE_FPGA_ADDR_BEG+((i)<<7)) 		// 实轴

//------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------

// 带√为复位默认状态

// 虚轴
// 写端口地址

//---------------------------------------------------------------
// 虚轴控制端口
#define	VAXIS_CONTROL			(VAXIS+0x00)
	// 向控制端口写入如下命令，实现相应的功能，定义如下：
	#define		VCTR_LOCK				0x0000		// 当前频率/计数锁存

	#define		VCTR_INPUT_ALM_INT		0x0001		// 清除Input接口下降沿中断标志

	#define		VCTR_AXIS_ALM_INT		0x0002		// 清除驱动器报警标志

	#define		VCTR_ZP1_INT			0x0003		// 编码器1:清除ZP1上升沿中断标志
	#define		VCTR_ZP2_INT			0x0004		// 编码器2:清除ZP2上升沿中断标志

	#define		EXOUT_EN_ON				0x0010		// 外部输出使能:开(扩展IO)
	#define		EXOUT_EN_OFF			0x0011		// 外部输出使能:关√

	#define		VCTR_VAXIS1_STOP		0x0100		// 虚轴1:停止√
	#define		VCTR_VAXIS1_RUN			0x0101		// 虚轴1:运行
	#define		VCTR_VAXIS1_DIS_BUF1	0x0110		// 虚轴1:运动缓冲区1失效√
	#define		VCTR_VAXIS1_DIS_BUF2	0x0111		// 虚轴1:运动缓冲区2失效√
	#define		VCTR_VAXIS1_DIS_BUF3	0x0112		// 虚轴1:运动缓冲区3失效√
	#define		VCTR_VAXIS1_CLEAN_OV1	0x0120		// 虚轴1:清除表1完成标志
	#define		VCTR_VAXIS1_CLEAN_OV2	0x0121		// 虚轴1:清除表2完成标志

	#define		VCTR_VAXIS1_DIS_OV1INT	0x0130		// 虚轴1:表完成中断关闭√
	#define		VCTR_VAXIS1_EN_OV1INT	0x0131		// 虚轴1:表完成中断打开(暂未使用)

	#define		VCTR_ECD1_CLEAR			0x0200		// 编码器1:计数器清零
	#define		VCTR_ZP1_DIS_INT		0x0210		// 编码器1:关闭ZP1中断√
	#define		VCTR_ZP1_EN_INT			0x0211		// 编码器1:开启ZP1中断
	#define		VCTR_ECD1_LEVEL_RST		0x0220		// 编码器1:ABZP电平信号复位√
	#define		VCTR_AP1_LEVEL_NEG		0x0221		// 编码器1:AP电平信号取反
	#define		VCTR_AZ1_LEVEL_NEG		0x0222		// 编码器1:APZP电平信号取反
	#define		VCTR_ZP1_LEVEL_NEG		0x0223		// 编码器1:ZP电平信号取反
	#define		VCTR_ZP1_FM_ECDZP		0x0230		// 编码器1:ZP中断通道选择:ZP1√
	#define		VCTR_ZP1_FM_NONE		0x023F		// 编码器1:ZP中断通道选择: 无ZP(编码器不清零)

	#define		VCTR_ZP1_FM_INPUT1		0x0240		// 编码器1:ZP中断通道选择:INPUT1
	#define		VCTR_ZP1_FM_INPUT2		0x0241		// 编码器1:ZP中断通道选择:INPUT2
	#define		VCTR_ZP1_FM_INPUT3		0x0242		// 编码器1:ZP中断通道选择:INPUT3
	#define		VCTR_ZP1_FM_INPUT4		0x0243		// 编码器1:ZP中断通道选择:INPUT4
	#define		VCTR_ZP1_FM_INPUT5		0x0244		// 编码器1:ZP中断通道选择:INPUT5
	#define		VCTR_ZP1_FM_INPUT6		0x0245		// 编码器1:ZP中断通道选择:INPUT6
	#define		VCTR_ZP1_FM_INPUT7		0x0246		// 编码器1:ZP中断通道选择:INPUT7
	#define		VCTR_ZP1_FM_INPUT8		0x0247		// 编码器1:ZP中断通道选择:INPUT8
	#define		VCTR_ZP1_FM_INPUT9		0x0248		// 编码器1:ZP中断通道选择:INPUT9
	#define		VCTR_ZP1_FM_INPUT10		0x0249		// 编码器1:ZP中断通道选择:INPUT10
	#define		VCTR_ZP1_FM_INPUT11		0x024A		// 编码器1:ZP中断通道选择:INPUT11
	#define		VCTR_ZP1_FM_INPUT12		0x024B		// 编码器1:ZP中断通道选择:INPUT12
	#define		VCTR_ZP1_FM_INPUT13		0x024C		// 编码器1:ZP中断通道选择:INPUT13
	#define		VCTR_ZP1_FM_INPUT14		0x024D		// 编码器1:ZP中断通道选择:INPUT14
	#define		VCTR_ZP1_FM_INPUT15		0x024E		// 编码器1:ZP中断通道选择:INPUT15
	#define		VCTR_ZP1_FM_INPUT16		0x024F		// 编码器1:ZP中断通道选择:INPUT16

	#define		VCTR_ECD2_CLEAR			0x0300		// 编码器2:计数器清零
	#define		VCTR_ZP2_DIS_INT		0x0310		// 编码器2:关闭ZP2中断√
	#define		VCTR_ZP2_EN_INT			0x0311		// 编码器2:开启ZP2中断
	#define		VCTR_ECD2_LEVEL_RST		0x0320		// 编码器2:ABZP电平信号复位√
	#define		VCTR_AP2_LEVEL_NEG		0x0321		// 编码器2:AP电平信号取反
	#define		VCTR_AZ2_LEVEL_NEG		0x0322		// 编码器2:APZP电平信号取反
	#define		VCTR_ZP2_LEVEL_NEG		0x0323		// 编码器2:ZP电平信号取反
	#define		VCTR_ZP2_FM_ECDZP		0x0330		// 编码器2:ZP中断通道选择:ZP2√
	#define		VCTR_ZP2_FM_NONE		0x033F		// 编码器2:ZP中断通道选择: 无ZP(编码器不清零)

	#define		VCTR_ZP2_FM_INPUT1		0x0340		// 编码器2:ZP中断通道选择:INPUT1
	#define		VCTR_ZP2_FM_INPUT2		0x0341		// 编码器2:ZP中断通道选择:INPUT2
	#define		VCTR_ZP2_FM_INPUT3		0x0342		// 编码器2:ZP中断通道选择:INPUT3
	#define		VCTR_ZP2_FM_INPUT4		0x0343		// 编码器2:ZP中断通道选择:INPUT4
	#define		VCTR_ZP2_FM_INPUT5		0x0344		// 编码器2:ZP中断通道选择:INPUT5
	#define		VCTR_ZP2_FM_INPUT6		0x0345		// 编码器2:ZP中断通道选择:INPUT6
	#define		VCTR_ZP2_FM_INPUT7		0x0346		// 编码器2:ZP中断通道选择:INPUT7
	#define		VCTR_ZP2_FM_INPUT8		0x0347		// 编码器2:ZP中断通道选择:INPUT8
	#define		VCTR_ZP2_FM_INPUT9		0x0348		// 编码器2:ZP中断通道选择:INPUT9
	#define		VCTR_ZP2_FM_INPUT10		0x0349		// 编码器2:ZP中断通道选择:INPUT10
	#define		VCTR_ZP2_FM_INPUT11		0x034A		// 编码器2:ZP中断通道选择:INPUT11
	#define		VCTR_ZP2_FM_INPUT12		0x034B		// 编码器2:ZP中断通道选择:INPUT12
	#define		VCTR_ZP2_FM_INPUT13		0x034C		// 编码器2:ZP中断通道选择:INPUT13
	#define		VCTR_ZP2_FM_INPUT14		0x034D		// 编码器2:ZP中断通道选择:INPUT14
	#define		VCTR_ZP2_FM_INPUT15		0x034E		// 编码器2:ZP中断通道选择:INPUT15
	#define		VCTR_ZP2_FM_INPUT16		0x034F		// 编码器2:ZP中断通道选择:INPUT16

	#define		VCTR_OPOS_NONE			0x0400		// OP输出:关√
	#define		VCTR_OPOS_ON			0x0401		// OP输出:开

	#define		VCTR_OPOS_VAXIS1		0x0402		// OP输出:虚轴1

	#define		VCTR_OPOS_AXIS1_P		0x0411		// OP输出:实轴1 pulse信号
	#define		VCTR_OPOS_AXIS1_S		0x0412		// OP输出:实轴1 sign信号
	#define		VCTR_OPOS_AXIS2_P		0x0421		// OP输出:实轴2 pulse信号
	#define		VCTR_OPOS_AXIS2_S		0x0422		// OP输出:实轴2 sign信号
	#define		VCTR_OPOS_AXIS3_P		0x0431		// OP输出:实轴3 pulse信号
	#define		VCTR_OPOS_AXIS3_S		0x0432		// OP输出:实轴3 sign信号
	#define		VCTR_OPOS_AXIS4_P		0x0441		// OP输出:实轴4 pulse信号
	#define		VCTR_OPOS_AXIS4_S		0x0442		// OP输出:实轴4 sign信号
	#define		VCTR_OPOS_AXIS5_P		0x0451		// OP输出:实轴5 pulse信号
	#define		VCTR_OPOS_AXIS5_S		0x0452		// OP输出:实轴5 sign信号
	#define		VCTR_OPOS_AXIS6_P		0x0461		// OP输出:实轴6 pulse信号
	#define		VCTR_OPOS_AXIS6_S		0x0462		// OP输出:实轴6 sign信号
	#define		VCTR_OPOS_AP1			0x0471		// OP输出:AP1
	#define		VCTR_OPOS_BP1			0x0472		// OP输出:BP1
	#define		VCTR_OPOS_ZP1			0x0473		// OP输出:ZP1
	#define		VCTR_OPOS_AP2			0x0481		// OP输出:AP2
	#define		VCTR_OPOS_BP2			0x0482		// OP输出:BP2
	#define		VCTR_OPOS_ZP2			0x0483		// OP输出:ZP2

	#define		VCTR_ZPOS_NONE			0x0500		// ZP输出:关√
	#define		VCTR_ZPOS_ON			0x0501		// ZP输出:开
	#define		VCTR_ZPOS_INPUT1		0x0510		// ZP输出:input1
	#define		VCTR_ZPOS_INPUT2		0x0511		// ZP输出:input2
	#define		VCTR_ZPOS_INPUT3		0x0512		// ZP输出:input3
	#define		VCTR_ZPOS_INPUT4		0x0513		// ZP输出:input4
	#define		VCTR_ZPOS_INPUT5		0x0514		// ZP输出:input5
	#define		VCTR_ZPOS_INPUT6		0x0515		// ZP输出:input6
	#define		VCTR_ZPOS_INPUT7		0x0516		// ZP输出:input7
	#define		VCTR_ZPOS_INPUT8		0x0517		// ZP输出:input8
	#define		VCTR_ZPOS_INPUT9		0x0518		// ZP输出:input9
	#define		VCTR_ZPOS_INPUT10		0x0519		// ZP输出:input10
	#define		VCTR_ZPOS_INPUT11		0x051A		// ZP输出:input11
	#define		VCTR_ZPOS_INPUT12		0x051B		// ZP输出:input12
	#define		VCTR_ZPOS_INPUT13		0x051C		// ZP输出:input13
	#define		VCTR_ZPOS_INPUT14		0x051D		// ZP输出:input14
	#define		VCTR_ZPOS_INPUT15		0x051E		// ZP输出:input15
	#define		VCTR_ZPOS_INPUT16		0x051F		// ZP输出:input16
	#define		VCTR_ZPOS_ECD1			0x0520		// ZP输出:编码器1
	#define		VCTR_ZPOS_ECD2			0x0521		// ZP输出:编码器2

	#define		VCTR_AXIS1_ALM_STOP_DIS	0x0610		// 实轴1报警不停车√
	#define		VCTR_AXIS1_ALM_STOP_EN	0x0611		// 实轴1报警停车
	#define		VCTR_AXIS1_ALM_LEV_LOW	0x0612		// 实轴1报警电平为低√
	#define		VCTR_AXIS1_ALM_LEV_HIGH	0x0613		// 实轴1报警电平为高
	#define		VCTR_AXIS2_ALM_STOP_DIS	0x0620		// 实轴2报警不停车√
	#define		VCTR_AXIS2_ALM_STOP_EN	0x0621		// 实轴2报警停车
	#define		VCTR_AXIS2_ALM_LEV_LOW	0x0622		// 实轴2报警电平为低√
	#define		VCTR_AXIS2_ALM_LEV_HIGH	0x0623		// 实轴2报警电平为高
	#define		VCTR_AXIS3_ALM_STOP_DIS	0x0630		// 实轴3报警不停车√
	#define		VCTR_AXIS3_ALM_STOP_EN	0x0631		// 实轴3报警停车
	#define		VCTR_AXIS3_ALM_LEV_LOW	0x0632		// 实轴3报警电平为低√
	#define		VCTR_AXIS3_ALM_LEV_HIGH	0x0633		// 实轴3报警电平为高
	#define		VCTR_AXIS4_ALM_STOP_DIS	0x0640		// 实轴4报警不停车√
	#define		VCTR_AXIS4_ALM_STOP_EN	0x0641		// 实轴4报警停车
	#define		VCTR_AXIS4_ALM_LEV_LOW	0x0642		// 实轴4报警电平为低√
	#define		VCTR_AXIS4_ALM_LEV_HIGH	0x0643		// 实轴4报警电平为高
	#define		VCTR_AXIS5_ALM_STOP_DIS	0x0650		// 实轴5报警不停车√
	#define		VCTR_AXIS5_ALM_STOP_EN	0x0651		// 实轴5报警停车
	#define		VCTR_AXIS5_ALM_LEV_LOW	0x0652		// 实轴5报警电平为低√
	#define		VCTR_AXIS5_ALM_LEV_HIGH	0x0653		// 实轴5报警电平为高
	#define		VCTR_AXIS6_ALM_STOP_DIS	0x0660		// 实轴6报警不停车√
	#define		VCTR_AXIS6_ALM_STOP_EN	0x0661		// 实轴6报警停车
	#define		VCTR_AXIS6_ALM_LEV_LOW	0x0662		// 实轴6报警电平为低√
	#define		VCTR_AXIS6_ALM_LEV_HIGH	0x0663		// 实轴6报警电平为高

		#define	ALM_CONFIG_BASE		0x0600
		#define	ALM_STOP_DIS		0x0000
		#define	ALM_STOP_EN			0x0001
		#define	ALM_LEV_LOW			0x0002
		#define	ALM_LEV_HIGH		0x0003

		#define	MAKE_VCTR_AXIS_ALM_CMD(id, alm)		(ALM_CONFIG_BASE|((id<<4)&0xF0)|((alm)&0x0F))

#define	IS_VAXIS_CMD(cmd)	(	((cmd) == VCTR_LOCK					) ||\
								((cmd) == VCTR_INPUT_ALM_INT		) ||\
								((cmd) == VCTR_AXIS_ALM_INT			) ||\
								((cmd) == VCTR_ZP1_INT				) ||\
								((cmd) == VCTR_ZP2_INT				) ||\
								((cmd) == EXOUT_EN_ON				) ||\
								((cmd) == EXOUT_EN_OFF				) ||\
								((cmd) == VCTR_VAXIS1_STOP			) ||\
								((cmd) == VCTR_VAXIS1_RUN			) ||\
								((cmd) == VCTR_VAXIS1_DIS_BUF1		) ||\
								((cmd) == VCTR_VAXIS1_DIS_BUF2		) ||\
								((cmd) == VCTR_VAXIS1_DIS_BUF3		) ||\
								((cmd) == VCTR_VAXIS1_CLEAN_OV1		) ||\
								((cmd) == VCTR_VAXIS1_CLEAN_OV2		) ||\
								((cmd) == VCTR_ECD1_CLEAR			) ||\
								((cmd) == VCTR_ZP1_DIS_INT			) ||\
								((cmd) == VCTR_ZP1_EN_INT			) ||\
								((cmd) == VCTR_ECD1_LEVEL_RST		) ||\
								((cmd) == VCTR_AP1_LEVEL_NEG		) ||\
								((cmd) == VCTR_AZ1_LEVEL_NEG		) ||\
								((cmd) == VCTR_ZP1_LEVEL_NEG		) ||\
								((cmd) == VCTR_ZP1_FM_ECDZP			) ||\
								((cmd) == VCTR_ZP1_FM_NONE			) ||\
								((cmd) == VCTR_ZP1_FM_INPUT1		) ||\
								((cmd) == VCTR_ZP1_FM_INPUT2		) ||\
								((cmd) == VCTR_ZP1_FM_INPUT3		) ||\
								((cmd) == VCTR_ZP1_FM_INPUT4		) ||\
								((cmd) == VCTR_ZP1_FM_INPUT5		) ||\
								((cmd) == VCTR_ZP1_FM_INPUT6		) ||\
								((cmd) == VCTR_ZP1_FM_INPUT7		) ||\
								((cmd) == VCTR_ZP1_FM_INPUT8		) ||\
								((cmd) == VCTR_ZP1_FM_INPUT9		) ||\
								((cmd) == VCTR_ZP1_FM_INPUT10		) ||\
								((cmd) == VCTR_ZP1_FM_INPUT11		) ||\
								((cmd) == VCTR_ZP1_FM_INPUT12		) ||\
								((cmd) == VCTR_ZP1_FM_INPUT13		) ||\
								((cmd) == VCTR_ZP1_FM_INPUT14		) ||\
								((cmd) == VCTR_ZP1_FM_INPUT15		) ||\
								((cmd) == VCTR_ZP1_FM_INPUT16		) ||\
								((cmd) == VCTR_ECD2_CLEAR			) ||\
								((cmd) == VCTR_ZP2_DIS_INT			) ||\
								((cmd) == VCTR_ZP2_EN_INT			) ||\
								((cmd) == VCTR_ECD2_LEVEL_RST		) ||\
								((cmd) == VCTR_AP2_LEVEL_NEG		) ||\
								((cmd) == VCTR_AZ2_LEVEL_NEG		) ||\
								((cmd) == VCTR_ZP2_LEVEL_NEG		) ||\
								((cmd) == VCTR_ZP2_FM_ECDZP			) ||\
								((cmd) == VCTR_ZP2_FM_NONE			) ||\
								((cmd) == VCTR_ZP2_FM_INPUT1		) ||\
								((cmd) == VCTR_ZP2_FM_INPUT2		) ||\
								((cmd) == VCTR_ZP2_FM_INPUT3		) ||\
								((cmd) == VCTR_ZP2_FM_INPUT4		) ||\
								((cmd) == VCTR_ZP2_FM_INPUT5		) ||\
								((cmd) == VCTR_ZP2_FM_INPUT6		) ||\
								((cmd) == VCTR_ZP2_FM_INPUT7		) ||\
								((cmd) == VCTR_ZP2_FM_INPUT8		) ||\
								((cmd) == VCTR_ZP2_FM_INPUT9		) ||\
								((cmd) == VCTR_ZP2_FM_INPUT10		) ||\
								((cmd) == VCTR_ZP2_FM_INPUT11		) ||\
								((cmd) == VCTR_ZP2_FM_INPUT12		) ||\
								((cmd) == VCTR_ZP2_FM_INPUT13		) ||\
								((cmd) == VCTR_ZP2_FM_INPUT14		) ||\
								((cmd) == VCTR_ZP2_FM_INPUT15		) ||\
								((cmd) == VCTR_ZP2_FM_INPUT16		) ||\
								((cmd) == VCTR_OPOS_NONE			) ||\
								((cmd) == VCTR_OPOS_ON				) ||\
								((cmd) == VCTR_OPOS_VAXIS1			) ||\
								((cmd) == VCTR_OPOS_AXIS1_P			) ||\
								((cmd) == VCTR_OPOS_AXIS1_S			) ||\
								((cmd) == VCTR_OPOS_AXIS2_P			) ||\
								((cmd) == VCTR_OPOS_AXIS2_S			) ||\
								((cmd) == VCTR_OPOS_AXIS3_P			) ||\
								((cmd) == VCTR_OPOS_AXIS3_S			) ||\
								((cmd) == VCTR_OPOS_AXIS4_P			) ||\
								((cmd) == VCTR_OPOS_AXIS4_S			) ||\
								((cmd) == VCTR_OPOS_AXIS5_P			) ||\
								((cmd) == VCTR_OPOS_AXIS5_S			) ||\
								((cmd) == VCTR_OPOS_AXIS6_P			) ||\
								((cmd) == VCTR_OPOS_AXIS6_S			) ||\
								((cmd) == VCTR_OPOS_AP1				) ||\
								((cmd) == VCTR_OPOS_BP1				) ||\
								((cmd) == VCTR_OPOS_ZP1				) ||\
								((cmd) == VCTR_OPOS_AP2				) ||\
								((cmd) == VCTR_OPOS_BP2				) ||\
								((cmd) == VCTR_OPOS_ZP2				) ||\
								((cmd) == VCTR_ZPOS_NONE			) ||\
								((cmd) == VCTR_ZPOS_ON				) ||\
								((cmd) == VCTR_ZPOS_INPUT1			) ||\
								((cmd) == VCTR_ZPOS_INPUT2			) ||\
								((cmd) == VCTR_ZPOS_INPUT3			) ||\
								((cmd) == VCTR_ZPOS_INPUT4			) ||\
								((cmd) == VCTR_ZPOS_INPUT5			) ||\
								((cmd) == VCTR_ZPOS_INPUT6			) ||\
								((cmd) == VCTR_ZPOS_INPUT7			) ||\
								((cmd) == VCTR_ZPOS_INPUT8			) ||\
								((cmd) == VCTR_ZPOS_INPUT9			) ||\
								((cmd) == VCTR_ZPOS_INPUT10			) ||\
								((cmd) == VCTR_ZPOS_INPUT11			) ||\
								((cmd) == VCTR_ZPOS_INPUT12			) ||\
								((cmd) == VCTR_ZPOS_INPUT13			) ||\
								((cmd) == VCTR_ZPOS_INPUT14			) ||\
								((cmd) == VCTR_ZPOS_INPUT15			) ||\
								((cmd) == VCTR_ZPOS_INPUT16			) ||\
								((cmd) == VCTR_ZPOS_ECD1			) ||\
								((cmd) == VCTR_ZPOS_ECD2			) ||\
								((cmd) == VCTR_AXIS1_ALM_STOP_DIS	) ||\
								((cmd) == VCTR_AXIS1_ALM_STOP_EN	) ||\
								((cmd) == VCTR_AXIS1_ALM_LEV_LOW	) ||\
								((cmd) == VCTR_AXIS1_ALM_LEV_HIGH	) ||\
								((cmd) == VCTR_AXIS2_ALM_STOP_DIS	) ||\
								((cmd) == VCTR_AXIS2_ALM_STOP_EN	) ||\
								((cmd) == VCTR_AXIS2_ALM_LEV_LOW	) ||\
								((cmd) == VCTR_AXIS2_ALM_LEV_HIGH	) ||\
								((cmd) == VCTR_AXIS3_ALM_STOP_DIS	) ||\
								((cmd) == VCTR_AXIS3_ALM_STOP_EN	) ||\
								((cmd) == VCTR_AXIS3_ALM_LEV_LOW	) ||\
								((cmd) == VCTR_AXIS3_ALM_LEV_HIGH	) ||\
								((cmd) == VCTR_AXIS4_ALM_STOP_DIS	) ||\
								((cmd) == VCTR_AXIS4_ALM_STOP_EN	) ||\
								((cmd) == VCTR_AXIS4_ALM_LEV_LOW	) ||\
								((cmd) == VCTR_AXIS4_ALM_LEV_HIGH	) ||\
								((cmd) == VCTR_AXIS5_ALM_STOP_DIS	) ||\
								((cmd) == VCTR_AXIS5_ALM_STOP_EN	) ||\
								((cmd) == VCTR_AXIS5_ALM_LEV_LOW	) ||\
								((cmd) == VCTR_AXIS5_ALM_LEV_HIGH	) ||\
								((cmd) == VCTR_AXIS6_ALM_STOP_DIS	) ||\
								((cmd) == VCTR_AXIS6_ALM_STOP_EN	) ||\
								((cmd) == VCTR_AXIS6_ALM_LEV_LOW	) ||\
								((cmd) == VCTR_AXIS6_ALM_LEV_HIGH	) ||\
								0)

//---------------------------------------------------------------
// 虚轴参数

#define	VAXIS1_BUF1_PARA			(VAXIS+0x02)	// 虚轴1:命令缓冲区1写参数端口
#define	VAXIS1_BUF2_PARA			(VAXIS+0x04)	// 虚轴1:命令缓冲区2写参数端口
#define	VAXIS1_BUF3_PARA			(VAXIS+0x06)	// 虚轴1:命令缓冲区3


	// 虚轴命令有两个缓冲区，向一个缓冲区写入运动命令后，再向控制端口写入运行命令，则开始产生脉冲。
	// 缓冲区1执行过程中，可以向缓冲区2写入下一步的运动命令。一个缓冲区执行完成后自动切换到下一个。

	// 虚轴命令缓冲区结构如下
	typedef struct
	{
		u16 vaxisId;	// 虚轴选择 	(VAXIS_ID1 ~ VAXIS_ECD)
		u16 bufSel;		// buf 选择		(BUF_SEL1 ~ BUF_SEL3)

		u32	calcGap;	// 计算时间间隔 (MIN_GAP ~ MAX_GAP)
		u32 startPPS;	// 启动频率 	(MIN_PPS ~ MAX_PPS)
		u32 runPPS;		// 目标频率 	(MIN_PPS ~ MAX_PPS)
		u32 outNum;		// 本次输出脉冲个数  	(MIN_OUTNUM ~ MAX_OUTNUM)
		u32 jumpNum;	// 变速跳过脉冲个数		(0 ~ MAX_OUTNUM)
		// 命令生效
	} VAxisCmdStr;

	// 注意：
	// 1. 频率范围 1Hz ~ 4Mhz
	// 2. 所有数值均为无符号数
	// 3. 最小频率必须大于加速度频率
	// 4.表3优先级高于表1和表2，表3有效时，虚轴速度以表3为准

		// 结构用到的宏定义

		// 虚轴选择
		#define		VAXIS_ID1			0x0001

		#define		VAXIS_ECD 			0x0004
		#define		VAXIS_ID_ALL		0x0005


		#define IS_VAXIS_ID(VAXIS) (((VAXIS) == VAXIS_ID1) || \
									 ((VAXIS) == VAXIS_ECD)	|| \
									 ((VAXIS) == VAXIS_ID_ALL))

		// 表选择
		#define		BUF_SEL1  			0x0001
		#define		BUF_SEL2  			0x0002
		#define		BUF_SEL3  			0x0003

		#define IS_BUF_SEL(BUFF) 	(((BUFF) == BUF_SEL1) || \
									 ((BUFF) == BUF_SEL2) || \
									 ((BUFF) == BUF_SEL3))


		#define	MIN_GAP			36
		#define	MAX_GAP			72000

		#define	MIN_PPS			1
		#define	MAX_PPS			4000000		// 4MHz

		#define	MIN_OUTNUM		1
		#define	MAX_OUTNUM		67108863	// 2^26-1

		#define	VOK_FLAG		0x4F4B		// OK

#define	OP_OUT_DIVISION			(VAXIS+0x08)	// OP输出分频设置端口
	#define	OP_OUT_DIRECT	0x0001	// 直接输出√
	// 其他值，支持从 0x0002--0xFFFE 之间的偶数

#define OP_COUNTER_SET_L		(VAXIS+0x0A)	// 设置OP计数值
#define OP_COUNTER_SET_H		(VAXIS+0x0C)

#define ZP_COUNTER_SET_L		(VAXIS+0x0E)	// 设置ZP计数值
#define ZP_COUNTER_SET_H		(VAXIS+0x10)

#define ECD1_COUNTER_SET_L		(VAXIS+0x12)	// 设置编码器1计数值
#define ECD1_COUNTER_SET_H		(VAXIS+0x14)

#define ECD2_COUNTER_SET_L		(VAXIS+0x16)	// 设置编码器2计数值
#define ECD2_COUNTER_SET_H		(VAXIS+0x18)

#define	INPUT_INT_SET			(VAXIS+0x20)	// 输入端口下降沿中断配置

	#define	INPUT_ALL_FINT_DIS		0x0000		// 输入中断全部禁用√

	#define	INPUT1_INT_EN			0x0001		// 输入1中断使能
	#define	INPUT2_INT_EN			0x0002		// 输入2中断使能
	#define	INPUT3_INT_EN			0x0004		// 输入3中断使能
	#define	INPUT4_INT_EN			0x0008		// 输入4中断使能
	#define	INPUT5_INT_EN			0x0010		// 输入5中断使能
	#define	INPUT6_INT_EN			0x0020		// 输入6中断使能
	#define	INPUT7_INT_EN			0x0040		// 输入7中断使能
	#define	INPUT8_INT_EN			0x0080		// 输入8中断使能
	#define	INPUT9_INT_EN			0x0100		// 输入9中断使能
	#define	INPUT10_INT_EN			0x0200		// 输入10中断使能
	#define	INPUT11_INT_EN			0x0400		// 输入11中断使能
	#define	INPUT12_INT_EN			0x0800		// 输入12中断使能
	#define	INPUT13_INT_EN			0x1000		// 输入13中断使能
	#define	INPUT14_INT_EN			0x2000		// 输入14中断使能
	#define	INPUT15_INT_EN			0x4000		// 输入15中断使能
	#define	INPUT16_INT_EN			0x8000		// 输入16中断使能

// 输出端口控制
#define OUTPUT_SET				(VAXIS+0x22)

	#define OUTPUT1_BIT		0x0001		// 输出1
	#define OUTPUT2_BIT		0x0002		// 输出2
	#define OUTPUT3_BIT		0x0004		// 输出3
	#define OUTPUT4_BIT		0x0008		// 输出4
	#define OUTPUT5_BIT		0x0010		// 输出5
	#define OUTPUT6_BIT		0x0020		// 输出6
	#define OUTPUT7_BIT		0x0040		// 输出7
	#define OUTPUT8_BIT		0x0080		// 输出8

// 外部IO刷新频率
#define EXIO_REFRE_FREQ			(VAXIS+0x24)		// 外部IO刷新频率配置

	#define	REF_FREQ_35K		0x0001
	#define	REF_FREQ_22K		0x0002
	#define	REF_FREQ_16K		0x0003
	#define	REF_FREQ_14K		0x0004
	#define	REF_FREQ_12K		0x0005
	#define	REF_FREQ_10K		0x0006	// √
	#define	REF_FREQ_9K			0x0007
	#define	REF_FREQ_8K			0x0008
	#define	REF_FREQ_7K			0x0009
	#define	REF_FREQ_6K			0x000A
	#define	REF_FREQ_5K			0x000B
	#define	REF_FREQ_4K			0x000C
	#define	REF_FREQ_3K			0x000D
	#define	REF_FREQ_2K			0x000E
	#define	REF_FREQ_1K			0x000F
	#define	REF_FREQ_500		0x001F


// 串行IO扩展板卡读写
#define EXIO_PORT_BASE			(VAXIS+0x60)		// 串行IO扩展板卡基地址
#define EXIO_PORT_ADDR(addr)	(EXIO_PORT_BASE+((addr)>>4)*2)
#define EXIO_ADDR_MOD(addr)		(0x0001 << ((addr)&0x0F))

#define	MAX_EXIO_ADDR			256
#define	EXIO_PER_PORT			16
#define	EXIO_PORT_NUM			(MAX_EXIO_ADDR/EXIO_PER_PORT)

//------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------

// 实轴偏移地址

//------------------------------------------------------

// 写端口地址
// 实轴输出配置端口
#define	AXIS_CONFIG(axisAddr)	(axisAddr+0x00)

	#define	POUT_CWCCW			0x0000		// 双脉冲方式输出√
	#define	POUT_PLSDIR			0x0001		// 脉冲+方向方式输出
	#define	POUT_NORMAL			0x0002		// 脉冲信号正常输出模式√
	#define	POUT_XCHANGE		0x0003		// 脉冲信号对调输出模式

	#define	POUT_DISABLE		0x0100		// 脉冲输出禁止√
	#define	POUT_ENABLE_VAXIS1	0x0101		// 脉冲输出允许:输入时钟为虚轴1

	#define	POUT_ENABLE_ECD		0x0102		// 脉冲输出允许:输入为编码器接口
	#define	POUT_ENABLE_PWM		0x0102		// 脉冲输出允许:输入为PWM模式
	#define	POUT_ENABLE_BUSIO	0x0102		// 脉冲输出允许:输入为内部总线直接控制模式

		#define	MAKE_POUT_CMD(vaxis)	(POUT_DISABLE|((vaxis)&0x0F))

	#define	DATI_INTERPOLATION	0x0200		// 硬件直线(正弦)插补√
	#define	DATI_ECD1_FLOW		0x0201		// 编码器1随动方式输出(CW/CCW或P/S信号)
	#define	DATI_ECD2_FLOW		0x0202		// 编码器2随动方式输出(CW/CCW或P/S信号)
	#define	DATI_ECD1_MAPPING	0x0203		// 编码器1信号映射输出(信号直连, 正交信号或CW/CCW或P/S信号)
	#define	DATI_ECD2_MAPPING	0x0204		// 编码器2信号映射输出(信号直连, 正交信号或CW/CCW或P/S信号)
	#define	DATI_PWM			0x0205		// PWM模式
	#define	DATI_BUS_IO			0x0206		// 内部总线直接控制模式

	#define	MOUT_EN_LOW			0x0300		// 驱动器EN信号输出低
	#define	MOUT_EN_HIGH		0x0301		// 驱动器EN信号输出高√
	#define	MOUT_SON_LOW		0x0310		// 驱动器SON信号输出低
	#define	MOUT_SON_HIGH		0x0311		// 驱动器SON信号输出高√
	#define	MOUT_SEL_LOW		0x0320		// 驱动器SEL信号输出低
	#define	MOUT_SEL_HIGH		0x0321		// 驱动器SEL信号输出高√

	#define	COUNTER_DIR_POS		0x0400		// 计数器计数方向为正√
	#define	COUNTER_DIR_NEG		0x0401		// 计数器计数方向为反

	#define	DIS_INTER_BUF1		0x0500		// 表1失效,表1清空,数据指针归零√
	#define	DIS_INTER_BUF2		0x0501		// 表2失效,表2清空,数据指针归零√

	#define	MOUT_PLUS_OFF		0x0600		// 内部脉冲信号:无√
	#define	MOUT_PLUS_ON		0x0601		// 内部脉冲信号:有
	#define	MOUT_SIGN_CW		0x0610		// 内部方向信号:正转√
	#define	MOUT_SIGN_CCW		0x0611		// 内部方向信号:反转

#define	IS_AXIS_CMD(cmd)	(	((cmd) == POUT_CWCCW			) ||\
								((cmd) == POUT_PLSDIR			) ||\
								((cmd) == POUT_NORMAL			) ||\
								((cmd) == POUT_XCHANGE			) ||\
								((cmd) == POUT_DISABLE			) ||\
								((cmd) == POUT_ENABLE_VAXIS1	) ||\
								((cmd) == POUT_ENABLE_ECD		) ||\
								((cmd) == POUT_ENABLE_PWM		) ||\
								((cmd) == POUT_ENABLE_BUSIO		) ||\
								((cmd) == DATI_INTERPOLATION	) ||\
								((cmd) == DATI_ECD1_FLOW		) ||\
								((cmd) == DATI_ECD2_FLOW		) ||\
								((cmd) == DATI_ECD1_MAPPING		) ||\
								((cmd) == DATI_ECD2_MAPPING		) ||\
								((cmd) == DATI_PWM				) ||\
								((cmd) == DATI_BUS_IO   		) ||\
								((cmd) == MOUT_EN_LOW			) ||\
								((cmd) == MOUT_EN_HIGH			) ||\
								((cmd) == MOUT_SON_LOW			) ||\
								((cmd) == MOUT_SON_HIGH			) ||\
								((cmd) == MOUT_SEL_LOW			) ||\
								((cmd) == MOUT_SEL_HIGH			) ||\
								((cmd) == COUNTER_DIR_POS		) ||\
								((cmd) == COUNTER_DIR_NEG		) ||\
								((cmd) == DIS_INTER_BUF1		) ||\
								((cmd) == DIS_INTER_BUF2		) ||\
								((cmd) == MOUT_PLUS_OFF 		) ||\
								((cmd) == MOUT_PLUS_ON  		) ||\
								((cmd) == MOUT_SIGN_CW  		) ||\
								((cmd) == MOUT_SIGN_CCW 		) ||\
								0 )
// 插补1参数
#define	INTER_BUF1_PARA(axisAddr)		(axisAddr+0x02)

// 插补2参数
#define	INTER_BUF2_PARA(axisAddr)		(axisAddr+0x04)

// 插补数据缓冲区1
#define	INTER_BUF1_DATA(axisAddr)		(axisAddr+0x06)

// 插补数据缓冲区2
#define	INTER_BUF2_DATA(axisAddr)		(axisAddr+0x08)

	#define	MAX_SEGMENT_PER_BUF			16		// 每个缓冲区的最大段数

	#define	MAX_PULSE_PER_SEGMENT		32767	// 每段最大脉冲数


	// 整个表方向控制
	// 0x00000000(默认值): 一直正转
	// R.31 R.30 00(正向|正向)，01(正向|反向)，10(反向|正向)，11(反向|反向)
	// R.25--R.0: 方向变化点位图地址，按照位来编址
	// 当为0xffffffff 时,按分段内方向标识执行
	#define	DIR_POSPOS				0x00000000
	#define	DIR_POSNEG				0x40000000
	#define	DIR_NEGPOS				0x80000000
	#define	DIR_NEGNEG				0xC0000000
	#define	AXIS_DIR_CHG_VAL(n)		((n)&0x3FFFFFFF)
	#define	AXIS_DIR_USEBUF			0xFFFFFFFF			// 使用每段内方向标志

	// 每段方向&发送脉冲个数控制
	// R.15	0(正向)，1(反向)
	// R.14--R.0: 输出脉冲数（0--32767）
	#define	DATA_DIR_POS			0x0000
	#define	DATA_DIR_NEG			0x8000
	#define	DATA_DIR_CHG_VAL(n)		((n)&0x7FFF)

	typedef struct
	{
		u16 axisId;							// 实轴选择		(AXIS_ID1 ~ AXIS_ID6)
		u16 vaxisId;						// 虚轴选择 		(VAXIS_ID1 ~ VAXIS_ECD)
		u16 bufSel;							// 缓冲区选择	(BUF_SEL1 ~ BUF_SEL3)
		u32 startEscNum;					// 起始跳过的虚轴脉冲数		(0 ~ MAX_OUTNUM)
		u32 partVxNum;						// 每段对应的虚轴脉冲数 	(MIN_OUTNUM ~ MAX_OUTNUM)
		u32 dirAttr;						// 实轴脉冲输出方向和方向变化
		u16 datBufLen;						// 缓冲区有效数据个数	(1 ~ MAX_PULSE_PER_SEGMENT)
		u16 datBuff[MAX_SEGMENT_PER_BUF];	// 缓冲区		(15.段执行方向;  .14~0脉冲数)
		u16 sineOut;						// 正弦输出标志. 0, 非正弦输出, 1, 正弦输出
	} InterData;

#define	SINE_MUTI	(1.42f)		// 正弦输出脉冲变换系数

		// 实轴选择
		#define		AXIS_ID1 			0x0001
		#define		AXIS_ID2 			0x0002
		#define		AXIS_ID3 			0x0003
		#define		AXIS_ID4 			0x0004
		#define		AXIS_ID5 			0x0005
		#define		AXIS_ID6 			0x0006

		#define IS_AXIS_ID(AXIS) 	(((AXIS) == AXIS_ID1) || \
									 ((AXIS) == AXIS_ID2) || \
									 ((AXIS) == AXIS_ID3) || \
									 ((AXIS) == AXIS_ID4) || \
									 ((AXIS) == AXIS_ID5) || \
									 ((AXIS) == AXIS_ID6))

// 设置计数器(L)
#define	AXIS_COUNTER_L(axisAddr)		(axisAddr+0x0A)
// 设置计数器(H)
#define	AXIS_COUNTER_H(axisAddr)		(axisAddr+0x0C)


#define	FPGA_PWM_MAX_VAL			(0x3FF)


		#define IS_AXIS_PWM_ID(AXIS) 	(((AXIS) == AXIS_ID3) || \
										((AXIS) == AXIS_ID4))

		#define IS_AXIS_PWM_FREQ(FREQ)	(((FREQ) >= 0x01) && \
									 ((FREQ) <= 0xFF))
									 
		#define IS_AXIS_PWM_VAL(VAL)	(((VAL) >= 0x0000)&& \
									 ((VAL) <= 0x03FF))
									 
#define	AXIS_PWM_FREQ(axisAddr)			(axisAddr+0x0E)		// PWM分频系数（对62.5K分频）(0x01~0xFF)
#define	AXIS_PULSE_PWM(axisAddr)		(axisAddr+0x10)		// pulse PWM 值 10bit(0~0x3FF)
#define	AXIS_SIGN_PWM(axisAddr)			(axisAddr+0x12)		// sign PWM 值 10bit(0~0x3FF)


/* 正弦输出模式
0,数据为0时表示此功能不起作用
1,如使用该输出模式,需配置直线插补参数
2,实轴直线插补输出脉冲数需不小于 此值 x 根号2
*/

		#define IS_AXIS_SINE_ID(AXIS) 	(((AXIS) == AXIS_ID1) || \
									 ((AXIS) == AXIS_ID2) || \
									 ((AXIS) == AXIS_ID3) || \
									 ((AXIS) == AXIS_ID4) || \
									 ((AXIS) == AXIS_ID5) || \
									 ((AXIS) == AXIS_ID6))
									
#define	AXIS_BUF1_SINE_OUT(axisAddr)	(axisAddr+0x14)		// BUF1输出脉冲数
#define	AXIS_BUF2_SINE_OUT(axisAddr)	(axisAddr+0x16)		// BUF2输出脉冲数

#define	AXIS_BUF1_SINE_OUT_H(axisAddr)	(axisAddr+0x1A)
#define	AXIS_BUF2_SINE_OUT_H(axisAddr)	(axisAddr+0x1C)


// 编码器选择
#define		ECD_SEL1  			0x0001
#define		ECD_SEL2  			0x0002

#define IS_ECD_SEL(ECD) 	(((ECD) == ECD_SEL1) || \
							 ((ECD) == ECD_SEL2))





//------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------

// 读端口地址
// FPGA硬件版本(分为高8位机器类型,低8位版本)
#define	FPGA_HARD_VERSION			(VAXIS+0x00)

	#define FPGA_PLOTTER_VER			0x01	// 喷墨绘图仪
	#define FPGA_EMB_VER				0x02	// 绣花机/布线机

// FPGA软件版本(分为高8位,低8位)
#define FPGA_SOFT_VERSION			(VAXIS+0x02)

// 虚轴状态端口
// 从虚轴状态端口中读取数据，通过下面的位判断相应的状态。状态位 .15 .14 .13 .12 .11 .10 .7 .6 .3 .2 为1时会产生中断，需要软件清除
// *中断源
#define	VAXIS_STATUS			(VAXIS+0x04)
	#define	VAXIS1_BUF1_RUNNING		0x0001		// 虚轴1缓冲区1正在执行标志
	#define	VAXIS1_BUF2_RUNNING		0x0002		// 虚轴1缓冲区2正在执行标志
	#define	VAXIS1_BUF1_FINISH		0x0004		// 虚轴1缓冲区1完成标志*
	#define	VAXIS1_BUF2_FINISH		0x0008		// 虚轴1缓冲区2完成标志*

	#define	AXIS_ALARM_FLAG			0x2000		// 实轴驱动器报警停车标志* 		(AXIS_ALM_STATUS)
	#define	ENCODER_ALARM_FLAG		0x4000		// 编码器上升沿中断标志*		(ECD_INT_FLAGS)
	#define	INPUT_ALARM_FLAG		0x8000		// Input下降沿中断标志*		(INPUT_INT_FLAGS)

// 虚轴表状态
#define	VAXIS_STATUS1			(VAXIS+0x0006)

	#define	VAXIS1_BUF1_ENABLE		0x0001		// 虚轴1缓冲区1有效标志
	#define	VAXIS1_BUF2_ENABLE		0x0002		// 虚轴1缓冲区2有效标志
	#define	VAXIS1_BUF3_ENABLE		0x0004		// 虚轴1缓冲区3有效标志

// 编码器中断标志
#define ECD_INT_FLAGS			(VAXIS+0x0008)
	#define	ECD1ZP_INT_FLAG			0x0001		// 编码器1 ZP上升沿中断
	#define	ECD2ZP_INT_FLAG			0x0002		// 编码器2 ZP上升沿中断

	#define ECD_INT_MASK			0x0003

// 输入信号中断标志
#define	INPUT_INT_FLAGS			(VAXIS+0x0A)
	#define	INPUT01_INT_FLAG		0x0001		// 输入1下降沿中断
	#define	INPUT02_INT_FLAG		0x0002		// 输入2下降沿中断
	#define	INPUT03_INT_FLAG		0x0004		// 输入3下降沿中断
	#define	INPUT04_INT_FLAG		0x0008		// 输入4下降沿中断
	#define	INPUT05_INT_FLAG		0x0010		// 输入5下降沿中断
	#define	INPUT06_INT_FLAG		0x0020		// 输入6下降沿中断
	#define	INPUT07_INT_FLAG		0x0040		// 输入7下降沿中断
	#define	INPUT08_INT_FLAG		0x0080		// 输入8下降沿中断
	#define	INPUT09_INT_FLAG		0x0100		// 输入9下降沿中断
	#define	INPUT10_INT_FLAG		0x0200		// 输入10下降沿中断
	#define	INPUT11_INT_FLAG		0x0400		// 输入11下降沿中断
	#define	INPUT12_INT_FLAG		0x0800		// 输入12下降沿中断
	#define	INPUT13_INT_FLAG		0x1000		// 输入13下降沿中断
	#define	INPUT14_INT_FLAG		0x2000		// 输入14下降沿中断
	#define	INPUT15_INT_FLAG		0x4000		// 输入15下降沿中断
	#define	INPUT16_INT_FLAG		0x8000		// 输入16下降沿中断

	#define	INPUT_INT_MASK			0xFFFF

// 虚轴1当前频率，单位PPS，先锁存后读取 (0～4M)
#define	CUR_VAXIS1_PPS_L		(VAXIS+0x0C)
#define	CUR_VAXIS1_PPS_H		(VAXIS+0x0E)

// 上一个表结束时的虚轴频率
#define	VAXIS1_END_FREQUENCY_L		(VAXIS+0x10)
#define	VAXIS1_END_FREQUENCY_H		(VAXIS+0x12)

// 虚轴1当前脉冲计数，单位:个，先锁存后读取 (0 ～ 2^26-1)
#define	CUR_VAXIS1_COUNTER_L	(VAXIS+0x14)
#define	CUR_VAXIS1_COUNTER_H	(VAXIS+0x16)

// 实轴1计数器计数值，有符号数，单位:个，先锁存后读取 (-2^31-1 ～ 2^31-1)
#define	CUR_AXIS1_COUNTER_L		(VAXIS+0x20)
#define	CUR_AXIS1_COUNTER_H		(VAXIS+0x22)

// 实轴2计数器计数值，有符号数，单位:个，先锁存后读取 (-2^31-1 ～ 2^31-1)
#define	CUR_AXIS2_COUNTER_L		(VAXIS+0x24)
#define	CUR_AXIS2_COUNTER_H		(VAXIS+0x26)

// 实轴3计数器计数值，有符号数，单位:个，先锁存后读取 (-2^31-1 ～ 2^31-1)
#define	CUR_AXIS3_COUNTER_L		(VAXIS+0x28)
#define	CUR_AXIS3_COUNTER_H		(VAXIS+0x2A)

// 实轴4计数器计数值，有符号数，单位:个，先锁存后读取 (-2^31-1 ～ 2^31-1)
#define	CUR_AXIS4_COUNTER_L		(VAXIS+0x2C)
#define	CUR_AXIS4_COUNTER_H		(VAXIS+0x2E)

// 实轴5计数器计数值，有符号数，单位:个，先锁存后读取 (-2^31-1 ～ 2^31-1)
#define	CUR_AXIS5_COUNTER_L		(VAXIS+0x30)
#define	CUR_AXIS5_COUNTER_H		(VAXIS+0x32)

// 实轴6计数器计数值，有符号数，单位:个，先锁存后读取 (-2^31-1 ～ 2^31-1)
#define	CUR_AXIS6_COUNTER_L		(VAXIS+0x34)
#define	CUR_AXIS6_COUNTER_H		(VAXIS+0x36)

// 编码器1计数值，有符号数，单位:个，先锁存后读取 (-2^31-1 ～ 2^31-1)
#define	CUR_ECD1_COUNTER_L		(VAXIS+0x40)
#define	CUR_ECD1_COUNTER_H		(VAXIS+0x42)

// 编码器2计数值，有符号数，单位:个，先锁存后读取 (-2^31-1 ～ 2^31-1)
#define	CUR_ECD2_COUNTER_L		(VAXIS+0x44)
#define	CUR_ECD2_COUNTER_H		(VAXIS+0x46)

// OP计数值，单位:个，先锁存后读取 (0 ～ 2^32-1)
#define	CUR_OP_COUNTER_L		(VAXIS+0x48)
#define	CUR_OP_COUNTER_H		(VAXIS+0x4A)

// ZP计数值，单位:个，先锁存后读取 (0 ～ 2^32-1)
#define	CUR_ZP_COUNTER_L		(VAXIS+0x4C)
#define	CUR_ZP_COUNTER_H		(VAXIS+0x4E)

// 实轴报警状态端口
#define	AXIS_ALM_STATUS			(VAXIS+0x50)
	#define	AXIS1_ALM				0x0001		// 轴1报警
	#define	AXIS2_ALM				0x0002		// 轴2报警
	#define	AXIS3_ALM				0x0004		// 轴3报警
	#define	AXIS4_ALM				0x0008		// 轴4报警
	#define	AXIS5_ALM				0x0010		// 轴5报警
	#define	AXIS6_ALM				0x0020		// 轴6报警

	#define	AXIS_ALM_MASK			0x003F

// 编码器状态端口
#define ECD_SIGNAL_STATUS		(VAXIS+0x52)
	#define BP1_STA					0x0001		// 编码器1BP
	#define AP1_STA					0x0802		// 编码器1AP
	#define ZP1_STA					0x0004		// 编码器1ZP
	#define BP2_STA					0x0008		// 编码器2BP
	#define AP2_STA					0x0010		// 编码器2AP
	#define ZP2_STA					0x0020		// 编码器2ZP

	#define ECD_STA_MASK			0x003F

// 标准输入状态端口
#define	INPUT_STATUS			(VAXIS+0x54)
	#define	INPUT1_STA				0x0001		// 输入1
	#define	INPUT2_STA				0x0002		// 输入2
	#define	INPUT3_STA				0x0004		// 输入3
	#define	INPUT4_STA				0x0008		// 输入4
	#define	INPUT5_STA				0x0010		// 输入5
	#define	INPUT6_STA				0x0020		// 输入6
	#define	INPUT7_STA				0x0040		// 输入7
	#define	INPUT8_STA				0x0080		// 输入8
	#define	INPUT9_STA				0x0100		// 输入9
	#define	INPUT10_STA				0x0200		// 输入10
	#define	INPUT11_STA				0x0400		// 输入11
	#define	INPUT12_STA				0x0800		// 输入12
	#define	INPUT13_STA				0x1000		// 输入13
	#define	INPUT14_STA				0x2000		// 输入14
	#define	INPUT15_STA				0x4000		// 输入15
	#define	INPUT16_STA				0x8000		// 输入16

//--------------------------------------------------------------------------------------------------------------


//--------------------------------------------------------------------------------------------------------------

// 初始化FPGA
void InitEmbFpga(void);

//--------------------------------------------------------------------------------------------------------------
// 读端口
// 读取版本
u16 GetFpgaHardVersion(void);
u16 GetFpgaSoftVersion(void);

// 得到虚轴运行状态
u16 GetRunStatus(void);

// 读取虚轴表状态
u16 GetRunStatus1(void);

// 得到输入端口中断信息
u16 GetInputIntFlags(void);

// 得到编码器中断信息
u16 GetEcdIntFlags(void);

// 得到虚轴的运行频率
u32 GetVAxisPPS(u16 vaxisId);

// 读取上一个表结束时虚轴的运行速度
u32 GetLastVAxisFrequency(u16 vaxisId);

// 得到虚轴的计数值
u32 GetVAxisCounter(u16 vaxisId);

// 读取实轴计数器值
s32 GetAxisCounter(u16 axisId);

// 得到编码器的数值
s32 GetEcdCounter(u16 ecdId);

// 读取OP计数器值
u32 GetOPCounter(void);

// 读取ZP计数器值
u32 GetZPCounter(void);

// 得到实轴报警信息
u16 GetAlarmValue(void);

// 得到编码器信号状态
u16 GetEcdStatus(void);

// 得到输入信号状态
u16 GetInputStatus(void);

//--------------------------------------------------------------------------------------------------------------
// 写端口
// 设置虚轴配置
void SetVAxisConfig(u16 cfg);

// 清除全部中断标志
void CleanAllIntFlag(void);

// 启动运动
int StartVAxisRun(VAxisCmdStr * pCmd);

// 停止当前运动
int StopVAxisRun(u16 vaxisId);

// 速度解除速度临时控制
void StopSpdCtrl(u16 vaxisId);

// 编码器的数值清零
void ClearEcdCounter(u16 ecdId);

void ReetEcdABZLevel(u16 ecdId);		// ABZ电平信号复位

void SetEcdAPLevelNegative(u16 ecdId);	// 编码器AP取反

void SetEcdAZLevelNegative(u16 ecdId);	// AP ZP 取反

void SetEcdZPLevelNegative(u16 ecdId);	// ZP取反

void SetOpOutOn(void);					// OP输出控制
void SetOpOutOff(void);

void SetZpOutOn(void);					// ZP输出控制
void SetZpOutOff(void);

// 设置报警命令
void SetAxisAlarmConfig(u16 axisId, u16 alm);

//--------------------------------------------------------------------------------------------------------------

// 设置OP输出的分频系数
void SetOpDivision(u16 div);

// 设置OP计数值
void SetOpCounter(s32 cnt);

// 设置ZP计数值
void SetZpCounter(s32 cnt);

// 设置编码器计数值
void SetEcdCounter(u16 ecdId, s32 cnt);

// 设置输入端口中断配置
void SetInputInt(u16 cfg);

// 输出信号控制
void Output1On(void);
void Output1Off(void);
void Output2On(void);
void Output2Off(void);
void Output3On(void);
void Output3Off(void);
void Output4On(void);
void Output4Off(void);
void Output5On(void);
void Output5Off(void);
void Output6On(void);
void Output6Off(void);
void Output7On(void);
void Output7Off(void);
void Output8On(void);
void Output8Off(void);

u8 GetOutputVal(int num);

//--------------------------------------------------------------------------------------------------------------
// 设置实轴输出配置
void SetAxisConfig(u16 axisId, u16 cfg);

// 写插补数据
int WriteInterData(InterData * pCmd);

// 清空表
void CleanAxisBuff(u16 axisId, u16 bufSel);

// 设置实轴计数器值
void SetAxisCounter(u16 axisId, s32 cnt);

// 设置轴PWM分频系数
void SetAxisPwmFreq(u16 axisId, u16 freq);

// 设置轴PULSE的PWM值
void SetAxisPulsePwm(u16 axisId, u16 val);

// 设置轴SIGN的PWM值
void SetAxisSignPwm(u16 axisId, u16 val);

//--------------------------------------------------------------------------------------------------------------

void RegInputIntProc(u16 intcfg, void(*inputProc)(void));
void RegEcdInputProc(u16 ecdId, void(*ecdProc)(void));

// 外部中断响应函数
void FpgaIntProc(void);

//--------------------------------------------------------------------------------------------------------------


//--------------------------------------------------------------------------------------------------------------


//--------------------------------------------------------------------------------------------------------------
void SetExoutEnOn(void);
void SetExoutEnOff(void);
void SetExOutValue(u16 addr, u8 value);
u8 GetExOutValue(u16 addr);
void FlushExOutputs(void);

// 设置扩展IO输出状态
// addr: 1--MAX_EXIO_ADDR
// value: SENSOR_ON（Bit_RESET） 或 SENSOR_OFF（Bit_SET）
void SetExOutput(u16 addr, u8 value);

// 读取IO扩展板输入状态
// addr: 1--MAX_EXIO_ADDR
// 返回: SENSOR_ON（Bit_RESET） 或 SENSOR_OFF（Bit_SET）
u8 GetExInput(u16 addr);
void GetExInputs(u16 * pBuf);
//--------------------------------------------------------------------------------------------------------------


#endif
