ZynqでVerilogで作ったIPからLEDを光らせる

前回 ZynqでAXI-GPIOとVivado HLSでのIP作成を試す - 今日やったこと の時はHLS及びAXI-GPIOでLEDを光らせていたのでVerilogからLEDを光らせる。

殆どのことは 3. Zynq LEDのIPコアを作り接続する – yuki-sato.com を参考にした。

myIPの雛形でAXIでの各タイミングの記述がある。AXIについて今一度理解をしていないと正確な制御を記述できないなと感じる。

axi_awaddrが0の時にslv_reg0が書かれているようなので、参考にしたページのledはベースアドレスに値を書いてやればいいようだ。

GenerateBitstreamした後、SDKで以前のLEDをxgpioでやっていた部分をXil_Outで置き換えた。

#include "xgpio.h"

int main()
{
	XGpio led,pushsw,slidesw;
	XGpio_Config led_config, pushsw_config, slidesw_config;

	//led_config.DeviceId = XPAR_GPIO_LED_DEVICE_ID;
	//XGpio_CfgInitialize(&led, &led_config, XPAR_GPIO_LED_BASEADDR);
	//XGpio_SetDataDirection(&led, 1,0);
	pushsw_config.DeviceId = XPAR_GPIO_PUSHSW_DEVICE_ID;
	XGpio_CfgInitialize(&pushsw, &pushsw_config, XPAR_GPIO_PUSHSW_BASEADDR);
	XGpio_SetDataDirection(&pushsw, 1, 1);

	slidesw_config.DeviceId = XPAR_GPIO_SLIDESW_DEVICE_ID;
	XGpio_CfgInitialize(&slidesw, &slidesw_config, XPAR_GPIO_SLIDESW_BASEADDR);
	XGpio_SetDataDirection(&slidesw, 1, 1);

	while(1){
		uint8_t pushsw_data = XGpio_DiscreteRead(&pushsw, 1);
		uint8_t slidesw_data = XGpio_DiscreteRead(&slidesw, 1);
		uint8_t led_data = pushsw_data ^ slidesw_data;
		//XGpio_DiscreteWrite(&led, 1, led_data);
		Xil_Out8(XPAR_MYIP_0_0, led_data);

		xil_printf("push:%x, slide:%x, led:%x\r\n", pushsw_data, slidesw_data, led_data);
	}

    return 0;
}

(xgpioもコードを覗いたら実質行っていることは同じだったようだ )

#define XGpio_WriteReg(BaseAddress, RegOffset, Data) \
	XGpio_Out32((BaseAddress) + (RegOffset), (u32)(Data))