diff --git a/minitests/z7_blinky_emio/README.md b/minitests/z7_blinky_emio/README.md new file mode 100644 index 00000000..bb65b9ae --- /dev/null +++ b/minitests/z7_blinky_emio/README.md @@ -0,0 +1,18 @@ +# Zynq7 EMIO minitest + +This is a simple test of PS -> PL interface for Zynq7. Works on the ZYBO Z7 board with xc7z020 but should also work for xc7z010. + +The PS firmware is bare metal. Upon start it enables MIO7 as output as well as PS <-> PL level shifters. Next it implements a blinking led on MIO7 and counter on GPIO bank 2. The bank 2 is connected to EMIOGPIOO[31:0] signals of the PS7 instance in the PL logic design. + +The PL design "instantiates" the PS7 and connects EMIOGPIOO[3:0] to LEDs LD0-LD3 but through XOR gates controlled by push buttons BTN0-BTN3. + +# Building & loading + +## PS + +Run `make firmware` to compile the firmware. Then run `make run` to upload it to Zybo. You must have Xilinx XSCT installed and pointed to in the environment. You can also just run `make` to execute those two above steps. Upon loading the LED LD4 should start blinking. + +## PL + +Run `make top.bit` to generate the bitstream. Upload it to the Zybo AFTER uploading and running PS firmware. You can use eg. xc3sprog with the following command `xc3sprog -c jtaghs1 -p 1 top.bit`. Once done LEDs LD0-LD3 should begin dusplaying 4 LSBs of the counter. + diff --git a/minitests/z7_blinky_emio/pl/Makefile b/minitests/z7_blinky_emio/pl/Makefile new file mode 100644 index 00000000..25b6699e --- /dev/null +++ b/minitests/z7_blinky_emio/pl/Makefile @@ -0,0 +1,22 @@ +PART?=xc7z020clg400-1 +VIVADO_PART?=$(PART) +BIT2FASM_ARGS= --part "$(XRAY_DIR)/database/$(XRAY_DATABASE)/$(PART)" --verbose + +.PHONY: clean +.PRECIOUS: *.bit + +clean: + rm -rf *.fasm + rm -rf *.bit + rm -rf *.dcp + rm -rf *.log + rm -rf build-* + +%.bit: %.v + mkdir -p build-$(basename $@) + cd build-$(basename $@) && env PROJECT_NAME=$(basename $@) VIVADO_PART=${VIVADO_PART} $(XRAY_VIVADO) -mode batch -source ../syn+par.tcl -nojournal -log ../$@.log + rm -rf *.backup.log + +%.fasm: %.bit + $(XRAY_BIT2FASM) $(BIT2FASM_ARGS) $< > $@ || rm -rf $@ + @sort -u -o $@ $@ diff --git a/minitests/z7_blinky_emio/pl/syn+par.tcl b/minitests/z7_blinky_emio/pl/syn+par.tcl new file mode 100644 index 00000000..4c62eeb8 --- /dev/null +++ b/minitests/z7_blinky_emio/pl/syn+par.tcl @@ -0,0 +1,12 @@ +create_project -force -name $env(PROJECT_NAME) -part $env(VIVADO_PART) + +read_verilog ../$env(PROJECT_NAME).v +synth_design -top top + +source ../zybo.xdc + +place_design +route_design + +write_checkpoint -force ../$env(PROJECT_NAME).dcp +write_bitstream -force ../$env(PROJECT_NAME).bit diff --git a/minitests/z7_blinky_emio/pl/top.v b/minitests/z7_blinky_emio/pl/top.v new file mode 100644 index 00000000..044796a4 --- /dev/null +++ b/minitests/z7_blinky_emio/pl/top.v @@ -0,0 +1,639 @@ +module top( + input wire [3:0] btn, + output wire [3:0] led +); + + wire [63:0] emio_gpio_o; + wire [63:0] emio_gpio_t; + wire [63:0] emio_gpio_i; + + assign led = emio_gpio_o[3:0] ^ btn[3:0]; + assign emio_gpio_i = 'd0; + + // The PS7 + (* KEEP, DONT_TOUCH *) + PS7 the_PS ( + .DMA0DATYPE (), + .DMA0DAVALID (), + .DMA0DRREADY (), + .DMA0RSTN (), + .DMA1DATYPE (), + .DMA1DAVALID (), + .DMA1DRREADY (), + .DMA1RSTN (), + .DMA2DATYPE (), + .DMA2DAVALID (), + .DMA2DRREADY (), + .DMA2RSTN (), + .DMA3DATYPE (), + .DMA3DAVALID (), + .DMA3DRREADY (), + .DMA3RSTN (), + .EMIOCAN0PHYTX (), + .EMIOCAN1PHYTX (), + .EMIOENET0GMIITXD (), + .EMIOENET0GMIITXEN (), + .EMIOENET0GMIITXER (), + .EMIOENET0MDIOMDC (), + .EMIOENET0MDIOO (), + .EMIOENET0MDIOTN (), + .EMIOENET0PTPDELAYREQRX (), + .EMIOENET0PTPDELAYREQTX (), + .EMIOENET0PTPPDELAYREQRX (), + .EMIOENET0PTPPDELAYREQTX (), + .EMIOENET0PTPPDELAYRESPRX (), + .EMIOENET0PTPPDELAYRESPTX (), + .EMIOENET0PTPSYNCFRAMERX (), + .EMIOENET0PTPSYNCFRAMETX (), + .EMIOENET0SOFRX (), + .EMIOENET0SOFTX (), + .EMIOENET1GMIITXD (), + .EMIOENET1GMIITXEN (), + .EMIOENET1GMIITXER (), + .EMIOENET1MDIOMDC (), + .EMIOENET1MDIOO (), + .EMIOENET1MDIOTN (), + .EMIOENET1PTPDELAYREQRX (), + .EMIOENET1PTPDELAYREQTX (), + .EMIOENET1PTPPDELAYREQRX (), + .EMIOENET1PTPPDELAYREQTX (), + .EMIOENET1PTPPDELAYRESPRX (), + .EMIOENET1PTPPDELAYRESPTX (), + .EMIOENET1PTPSYNCFRAMERX (), + .EMIOENET1PTPSYNCFRAMETX (), + .EMIOENET1SOFRX (), + .EMIOENET1SOFTX (), + .EMIOGPIOO (emio_gpio_o), + .EMIOGPIOTN (emio_gpio_t), + .EMIOI2C0SCLO (), + .EMIOI2C0SCLTN (), + .EMIOI2C0SDAO (), + .EMIOI2C0SDATN (), + .EMIOI2C1SCLO (), + .EMIOI2C1SCLTN (), + .EMIOI2C1SDAO (), + .EMIOI2C1SDATN (), + .EMIOPJTAGTDO (), + .EMIOPJTAGTDTN (), + .EMIOSDIO0BUSPOW (), + .EMIOSDIO0BUSVOLT (), + .EMIOSDIO0CLK (), + .EMIOSDIO0CMDO (), + .EMIOSDIO0CMDTN (), + .EMIOSDIO0DATAO (), + .EMIOSDIO0DATATN (), + .EMIOSDIO0LED (), + .EMIOSDIO1BUSPOW (), + .EMIOSDIO1BUSVOLT (), + .EMIOSDIO1CLK (), + .EMIOSDIO1CMDO (), + .EMIOSDIO1CMDTN (), + .EMIOSDIO1DATAO (), + .EMIOSDIO1DATATN (), + .EMIOSDIO1LED (), + .EMIOSPI0MO (), + .EMIOSPI0MOTN (), + .EMIOSPI0SCLKO (), + .EMIOSPI0SCLKTN (), + .EMIOSPI0SO (), + .EMIOSPI0SSNTN (), + .EMIOSPI0SSON (), + .EMIOSPI0STN (), + .EMIOSPI1MO (), + .EMIOSPI1MOTN (), + .EMIOSPI1SCLKO (), + .EMIOSPI1SCLKTN (), + .EMIOSPI1SO (), + .EMIOSPI1SSNTN (), + .EMIOSPI1SSON (), + .EMIOSPI1STN (), + .EMIOTRACECTL (), + .EMIOTRACEDATA (), + .EMIOTTC0WAVEO (), + .EMIOTTC1WAVEO (), + .EMIOUART0DTRN (), + .EMIOUART0RTSN (), + .EMIOUART0TX (), + .EMIOUART1DTRN (), + .EMIOUART1RTSN (), + .EMIOUART1TX (), + .EMIOUSB0PORTINDCTL (), + .EMIOUSB0VBUSPWRSELECT (), + .EMIOUSB1PORTINDCTL (), + .EMIOUSB1VBUSPWRSELECT (), + .EMIOWDTRSTO (), + .EVENTEVENTO (), + .EVENTSTANDBYWFE (), + .EVENTSTANDBYWFI (), + .FCLKCLK (), + .FCLKRESETN (), + .FTMTF2PTRIGACK (), + .FTMTP2FDEBUG (), + .FTMTP2FTRIG (), + .IRQP2F (), + .MAXIGP0ARADDR (), + .MAXIGP0ARBURST (), + .MAXIGP0ARCACHE (), + .MAXIGP0ARESETN (), + .MAXIGP0ARID (), + .MAXIGP0ARLEN (), + .MAXIGP0ARLOCK (), + .MAXIGP0ARPROT (), + .MAXIGP0ARQOS (), + .MAXIGP0ARSIZE (), + .MAXIGP0ARVALID (), + .MAXIGP0AWADDR (), + .MAXIGP0AWBURST (), + .MAXIGP0AWCACHE (), + .MAXIGP0AWID (), + .MAXIGP0AWLEN (), + .MAXIGP0AWLOCK (), + .MAXIGP0AWPROT (), + .MAXIGP0AWQOS (), + .MAXIGP0AWSIZE (), + .MAXIGP0AWVALID (), + .MAXIGP0BREADY (), + .MAXIGP0RREADY (), + .MAXIGP0WDATA (), + .MAXIGP0WID (), + .MAXIGP0WLAST (), + .MAXIGP0WSTRB (), + .MAXIGP0WVALID (), + .MAXIGP1ARADDR (), + .MAXIGP1ARBURST (), + .MAXIGP1ARCACHE (), + .MAXIGP1ARESETN (), + .MAXIGP1ARID (), + .MAXIGP1ARLEN (), + .MAXIGP1ARLOCK (), + .MAXIGP1ARPROT (), + .MAXIGP1ARQOS (), + .MAXIGP1ARSIZE (), + .MAXIGP1ARVALID (), + .MAXIGP1AWADDR (), + .MAXIGP1AWBURST (), + .MAXIGP1AWCACHE (), + .MAXIGP1AWID (), + .MAXIGP1AWLEN (), + .MAXIGP1AWLOCK (), + .MAXIGP1AWPROT (), + .MAXIGP1AWQOS (), + .MAXIGP1AWSIZE (), + .MAXIGP1AWVALID (), + .MAXIGP1BREADY (), + .MAXIGP1RREADY (), + .MAXIGP1WDATA (), + .MAXIGP1WID (), + .MAXIGP1WLAST (), + .MAXIGP1WSTRB (), + .MAXIGP1WVALID (), + .SAXIACPARESETN (), + .SAXIACPARREADY (), + .SAXIACPAWREADY (), + .SAXIACPBID (), + .SAXIACPBRESP (), + .SAXIACPBVALID (), + .SAXIACPRDATA (), + .SAXIACPRID (), + .SAXIACPRLAST (), + .SAXIACPRRESP (), + .SAXIACPRVALID (), + .SAXIACPWREADY (), + .SAXIGP0ARESETN (), + .SAXIGP0ARREADY (), + .SAXIGP0AWREADY (), + .SAXIGP0BID (), + .SAXIGP0BRESP (), + .SAXIGP0BVALID (), + .SAXIGP0RDATA (), + .SAXIGP0RID (), + .SAXIGP0RLAST (), + .SAXIGP0RRESP (), + .SAXIGP0RVALID (), + .SAXIGP0WREADY (), + .SAXIGP1ARESETN (), + .SAXIGP1ARREADY (), + .SAXIGP1AWREADY (), + .SAXIGP1BID (), + .SAXIGP1BRESP (), + .SAXIGP1BVALID (), + .SAXIGP1RDATA (), + .SAXIGP1RID (), + .SAXIGP1RLAST (), + .SAXIGP1RRESP (), + .SAXIGP1RVALID (), + .SAXIGP1WREADY (), + .SAXIHP0ARESETN (), + .SAXIHP0ARREADY (), + .SAXIHP0AWREADY (), + .SAXIHP0BID (), + .SAXIHP0BRESP (), + .SAXIHP0BVALID (), + .SAXIHP0RACOUNT (), + .SAXIHP0RCOUNT (), + .SAXIHP0RDATA (), + .SAXIHP0RID (), + .SAXIHP0RLAST (), + .SAXIHP0RRESP (), + .SAXIHP0RVALID (), + .SAXIHP0WACOUNT (), + .SAXIHP0WCOUNT (), + .SAXIHP0WREADY (), + .SAXIHP1ARESETN (), + .SAXIHP1ARREADY (), + .SAXIHP1AWREADY (), + .SAXIHP1BID (), + .SAXIHP1BRESP (), + .SAXIHP1BVALID (), + .SAXIHP1RACOUNT (), + .SAXIHP1RCOUNT (), + .SAXIHP1RDATA (), + .SAXIHP1RID (), + .SAXIHP1RLAST (), + .SAXIHP1RRESP (), + .SAXIHP1RVALID (), + .SAXIHP1WACOUNT (), + .SAXIHP1WCOUNT (), + .SAXIHP1WREADY (), + .SAXIHP2ARESETN (), + .SAXIHP2ARREADY (), + .SAXIHP2AWREADY (), + .SAXIHP2BID (), + .SAXIHP2BRESP (), + .SAXIHP2BVALID (), + .SAXIHP2RACOUNT (), + .SAXIHP2RCOUNT (), + .SAXIHP2RDATA (), + .SAXIHP2RID (), + .SAXIHP2RLAST (), + .SAXIHP2RRESP (), + .SAXIHP2RVALID (), + .SAXIHP2WACOUNT (), + .SAXIHP2WCOUNT (), + .SAXIHP2WREADY (), + .SAXIHP3ARESETN (), + .SAXIHP3ARREADY (), + .SAXIHP3AWREADY (), + .SAXIHP3BID (), + .SAXIHP3BRESP (), + .SAXIHP3BVALID (), + .SAXIHP3RACOUNT (), + .SAXIHP3RCOUNT (), + .SAXIHP3RDATA (), + .SAXIHP3RID (), + .SAXIHP3RLAST (), + .SAXIHP3RRESP (), + .SAXIHP3RVALID (), + .SAXIHP3WACOUNT (), + .SAXIHP3WCOUNT (), + .SAXIHP3WREADY (), + .DDRA (), + .DDRBA (), + .DDRCASB (), + .DDRCKE (), + .DDRCKN (), + .DDRCKP (), + .DDRCSB (), + .DDRDM (), + .DDRDQ (), + .DDRDQSN (), + .DDRDQSP (), + .DDRDRSTB (), + .DDRODT (), + .DDRRASB (), + .DDRVRN (), + .DDRVRP (), + .DDRWEB (), + .MIO (), + .PSCLK (), + .PSPORB (), + .PSSRSTB (), + .DDRARB (), + .DMA0ACLK (), + .DMA0DAREADY (), + .DMA0DRLAST (), + .DMA0DRTYPE (), + .DMA0DRVALID (), + .DMA1ACLK (), + .DMA1DAREADY (), + .DMA1DRLAST (), + .DMA1DRTYPE (), + .DMA1DRVALID (), + .DMA2ACLK (), + .DMA2DAREADY (), + .DMA2DRLAST (), + .DMA2DRTYPE (), + .DMA2DRVALID (), + .DMA3ACLK (), + .DMA3DAREADY (), + .DMA3DRLAST (), + .DMA3DRTYPE (), + .DMA3DRVALID (), + .EMIOCAN0PHYRX (), + .EMIOCAN1PHYRX (), + .EMIOENET0EXTINTIN (), + .EMIOENET0GMIICOL (), + .EMIOENET0GMIICRS (), + .EMIOENET0GMIIRXCLK (), + .EMIOENET0GMIIRXD (), + .EMIOENET0GMIIRXDV (), + .EMIOENET0GMIIRXER (), + .EMIOENET0GMIITXCLK (), + .EMIOENET0MDIOI (), + .EMIOENET1EXTINTIN (), + .EMIOENET1GMIICOL (), + .EMIOENET1GMIICRS (), + .EMIOENET1GMIIRXCLK (), + .EMIOENET1GMIIRXD (), + .EMIOENET1GMIIRXDV (), + .EMIOENET1GMIIRXER (), + .EMIOENET1GMIITXCLK (), + .EMIOENET1MDIOI (), + .EMIOGPIOI (emio_gpio_i), + .EMIOI2C0SCLI (), + .EMIOI2C0SDAI (), + .EMIOI2C1SCLI (), + .EMIOI2C1SDAI (), + .EMIOPJTAGTCK (), + .EMIOPJTAGTDI (), + .EMIOPJTAGTMS (), + .EMIOSDIO0CDN (), + .EMIOSDIO0CLKFB (), + .EMIOSDIO0CMDI (), + .EMIOSDIO0DATAI (), + .EMIOSDIO0WP (), + .EMIOSDIO1CDN (), + .EMIOSDIO1CLKFB (), + .EMIOSDIO1CMDI (), + .EMIOSDIO1DATAI (), + .EMIOSDIO1WP (), + .EMIOSPI0MI (), + .EMIOSPI0SCLKI (), + .EMIOSPI0SI (), + .EMIOSPI0SSIN (), + .EMIOSPI1MI (), + .EMIOSPI1SCLKI (), + .EMIOSPI1SI (), + .EMIOSPI1SSIN (), + .EMIOSRAMINTIN (), + .EMIOTRACECLK (), + .EMIOTTC0CLKI (), + .EMIOTTC1CLKI (), + .EMIOUART0CTSN (), + .EMIOUART0DCDN (), + .EMIOUART0DSRN (), + .EMIOUART0RIN (), + .EMIOUART0RX (), + .EMIOUART1CTSN (), + .EMIOUART1DCDN (), + .EMIOUART1DSRN (), + .EMIOUART1RIN (), + .EMIOUART1RX (), + .EMIOUSB0VBUSPWRFAULT (), + .EMIOUSB1VBUSPWRFAULT (), + .EMIOWDTCLKI (), + .EVENTEVENTI (), + .FCLKCLKTRIGN (), + .FPGAIDLEN (), + .FTMDTRACEINATID (), + .FTMDTRACEINCLOCK (), + .FTMDTRACEINDATA (), + .FTMDTRACEINVALID (), + .FTMTF2PDEBUG (), + .FTMTF2PTRIG (), + .FTMTP2FTRIGACK (), + .IRQF2P (), + .MAXIGP0ACLK (), + .MAXIGP0ARREADY (), + .MAXIGP0AWREADY (), + .MAXIGP0BID (), + .MAXIGP0BRESP (), + .MAXIGP0BVALID (), + .MAXIGP0RDATA (), + .MAXIGP0RID (), + .MAXIGP0RLAST (), + .MAXIGP0RRESP (), + .MAXIGP0RVALID (), + .MAXIGP0WREADY (), + .MAXIGP1ACLK (), + .MAXIGP1ARREADY (), + .MAXIGP1AWREADY (), + .MAXIGP1BID (), + .MAXIGP1BRESP (), + .MAXIGP1BVALID (), + .MAXIGP1RDATA (), + .MAXIGP1RID (), + .MAXIGP1RLAST (), + .MAXIGP1RRESP (), + .MAXIGP1RVALID (), + .MAXIGP1WREADY (), + .SAXIACPACLK (), + .SAXIACPARADDR (), + .SAXIACPARBURST (), + .SAXIACPARCACHE (), + .SAXIACPARID (), + .SAXIACPARLEN (), + .SAXIACPARLOCK (), + .SAXIACPARPROT (), + .SAXIACPARQOS (), + .SAXIACPARSIZE (), + .SAXIACPARUSER (), + .SAXIACPARVALID (), + .SAXIACPAWADDR (), + .SAXIACPAWBURST (), + .SAXIACPAWCACHE (), + .SAXIACPAWID (), + .SAXIACPAWLEN (), + .SAXIACPAWLOCK (), + .SAXIACPAWPROT (), + .SAXIACPAWQOS (), + .SAXIACPAWSIZE (), + .SAXIACPAWUSER (), + .SAXIACPAWVALID (), + .SAXIACPBREADY (), + .SAXIACPRREADY (), + .SAXIACPWDATA (), + .SAXIACPWID (), + .SAXIACPWLAST (), + .SAXIACPWSTRB (), + .SAXIACPWVALID (), + .SAXIGP0ACLK (), + .SAXIGP0ARADDR (), + .SAXIGP0ARBURST (), + .SAXIGP0ARCACHE (), + .SAXIGP0ARID (), + .SAXIGP0ARLEN (), + .SAXIGP0ARLOCK (), + .SAXIGP0ARPROT (), + .SAXIGP0ARQOS (), + .SAXIGP0ARSIZE (), + .SAXIGP0ARVALID (), + .SAXIGP0AWADDR (), + .SAXIGP0AWBURST (), + .SAXIGP0AWCACHE (), + .SAXIGP0AWID (), + .SAXIGP0AWLEN (), + .SAXIGP0AWLOCK (), + .SAXIGP0AWPROT (), + .SAXIGP0AWQOS (), + .SAXIGP0AWSIZE (), + .SAXIGP0AWVALID (), + .SAXIGP0BREADY (), + .SAXIGP0RREADY (), + .SAXIGP0WDATA (), + .SAXIGP0WID (), + .SAXIGP0WLAST (), + .SAXIGP0WSTRB (), + .SAXIGP0WVALID (), + .SAXIGP1ACLK (), + .SAXIGP1ARADDR (), + .SAXIGP1ARBURST (), + .SAXIGP1ARCACHE (), + .SAXIGP1ARID (), + .SAXIGP1ARLEN (), + .SAXIGP1ARLOCK (), + .SAXIGP1ARPROT (), + .SAXIGP1ARQOS (), + .SAXIGP1ARSIZE (), + .SAXIGP1ARVALID (), + .SAXIGP1AWADDR (), + .SAXIGP1AWBURST (), + .SAXIGP1AWCACHE (), + .SAXIGP1AWID (), + .SAXIGP1AWLEN (), + .SAXIGP1AWLOCK (), + .SAXIGP1AWPROT (), + .SAXIGP1AWQOS (), + .SAXIGP1AWSIZE (), + .SAXIGP1AWVALID (), + .SAXIGP1BREADY (), + .SAXIGP1RREADY (), + .SAXIGP1WDATA (), + .SAXIGP1WID (), + .SAXIGP1WLAST (), + .SAXIGP1WSTRB (), + .SAXIGP1WVALID (), + .SAXIHP0ACLK (), + .SAXIHP0ARADDR (), + .SAXIHP0ARBURST (), + .SAXIHP0ARCACHE (), + .SAXIHP0ARID (), + .SAXIHP0ARLEN (), + .SAXIHP0ARLOCK (), + .SAXIHP0ARPROT (), + .SAXIHP0ARQOS (), + .SAXIHP0ARSIZE (), + .SAXIHP0ARVALID (), + .SAXIHP0AWADDR (), + .SAXIHP0AWBURST (), + .SAXIHP0AWCACHE (), + .SAXIHP0AWID (), + .SAXIHP0AWLEN (), + .SAXIHP0AWLOCK (), + .SAXIHP0AWPROT (), + .SAXIHP0AWQOS (), + .SAXIHP0AWSIZE (), + .SAXIHP0AWVALID (), + .SAXIHP0BREADY (), + .SAXIHP0RDISSUECAP1EN (), + .SAXIHP0RREADY (), + .SAXIHP0WDATA (), + .SAXIHP0WID (), + .SAXIHP0WLAST (), + .SAXIHP0WRISSUECAP1EN (), + .SAXIHP0WSTRB (), + .SAXIHP0WVALID (), + .SAXIHP1ACLK (), + .SAXIHP1ARADDR (), + .SAXIHP1ARBURST (), + .SAXIHP1ARCACHE (), + .SAXIHP1ARID (), + .SAXIHP1ARLEN (), + .SAXIHP1ARLOCK (), + .SAXIHP1ARPROT (), + .SAXIHP1ARQOS (), + .SAXIHP1ARSIZE (), + .SAXIHP1ARVALID (), + .SAXIHP1AWADDR (), + .SAXIHP1AWBURST (), + .SAXIHP1AWCACHE (), + .SAXIHP1AWID (), + .SAXIHP1AWLEN (), + .SAXIHP1AWLOCK (), + .SAXIHP1AWPROT (), + .SAXIHP1AWQOS (), + .SAXIHP1AWSIZE (), + .SAXIHP1AWVALID (), + .SAXIHP1BREADY (), + .SAXIHP1RDISSUECAP1EN (), + .SAXIHP1RREADY (), + .SAXIHP1WDATA (), + .SAXIHP1WID (), + .SAXIHP1WLAST (), + .SAXIHP1WRISSUECAP1EN (), + .SAXIHP1WSTRB (), + .SAXIHP1WVALID (), + .SAXIHP2ACLK (), + .SAXIHP2ARADDR (), + .SAXIHP2ARBURST (), + .SAXIHP2ARCACHE (), + .SAXIHP2ARID (), + .SAXIHP2ARLEN (), + .SAXIHP2ARLOCK (), + .SAXIHP2ARPROT (), + .SAXIHP2ARQOS (), + .SAXIHP2ARSIZE (), + .SAXIHP2ARVALID (), + .SAXIHP2AWADDR (), + .SAXIHP2AWBURST (), + .SAXIHP2AWCACHE (), + .SAXIHP2AWID (), + .SAXIHP2AWLEN (), + .SAXIHP2AWLOCK (), + .SAXIHP2AWPROT (), + .SAXIHP2AWQOS (), + .SAXIHP2AWSIZE (), + .SAXIHP2AWVALID (), + .SAXIHP2BREADY (), + .SAXIHP2RDISSUECAP1EN (), + .SAXIHP2RREADY (), + .SAXIHP2WDATA (), + .SAXIHP2WID (), + .SAXIHP2WLAST (), + .SAXIHP2WRISSUECAP1EN (), + .SAXIHP2WSTRB (), + .SAXIHP2WVALID (), + .SAXIHP3ACLK (), + .SAXIHP3ARADDR (), + .SAXIHP3ARBURST (), + .SAXIHP3ARCACHE (), + .SAXIHP3ARID (), + .SAXIHP3ARLEN (), + .SAXIHP3ARLOCK (), + .SAXIHP3ARPROT (), + .SAXIHP3ARQOS (), + .SAXIHP3ARSIZE (), + .SAXIHP3ARVALID (), + .SAXIHP3AWADDR (), + .SAXIHP3AWBURST (), + .SAXIHP3AWCACHE (), + .SAXIHP3AWID (), + .SAXIHP3AWLEN (), + .SAXIHP3AWLOCK (), + .SAXIHP3AWPROT (), + .SAXIHP3AWQOS (), + .SAXIHP3AWSIZE (), + .SAXIHP3AWVALID (), + .SAXIHP3BREADY (), + .SAXIHP3RDISSUECAP1EN (), + .SAXIHP3RREADY (), + .SAXIHP3WDATA (), + .SAXIHP3WID (), + .SAXIHP3WLAST (), + .SAXIHP3WRISSUECAP1EN (), + .SAXIHP3WSTRB (), + .SAXIHP3WVALID () + ); + + +endmodule diff --git a/minitests/z7_blinky_emio/pl/zybo.xdc b/minitests/z7_blinky_emio/pl/zybo.xdc new file mode 100644 index 00000000..981aab59 --- /dev/null +++ b/minitests/z7_blinky_emio/pl/zybo.xdc @@ -0,0 +1,17 @@ +# LEDs +set_property PACKAGE_PIN M14 [get_ports led[0]] +set_property PACKAGE_PIN M15 [get_ports led[1]] +set_property PACKAGE_PIN G14 [get_ports led[2]] +set_property PACKAGE_PIN D18 [get_ports led[3]] + +# Pushbuttons +set_property PACKAGE_PIN K18 [get_ports btn[0]] +set_property PACKAGE_PIN P16 [get_ports btn[1]] +set_property PACKAGE_PIN K19 [get_ports btn[2]] +set_property PACKAGE_PIN Y16 [get_ports btn[3]] + +foreach port [get_ports] { + set_property IOSTANDARD LVCMOS33 $port + set_property SLEW SLOW $port +} + diff --git a/minitests/z7_blinky_emio/ps/Makefile b/minitests/z7_blinky_emio/ps/Makefile new file mode 100644 index 00000000..9f8896cf --- /dev/null +++ b/minitests/z7_blinky_emio/ps/Makefile @@ -0,0 +1,14 @@ +.PHONY: all clean + +all: firmware run + +clean: + rm -rf *.elf + rm -rf *.o + +firmware: + arm-linux-gnueabihf-as -o blink.o blink.s + arm-linux-gnueabihf-ld -o blink.elf -T blink.ld blink.o + +run: blink.elf + xsct blink.tcl diff --git a/minitests/z7_blinky_emio/ps/blink.ld b/minitests/z7_blinky_emio/ps/blink.ld new file mode 100644 index 00000000..f14a6053 --- /dev/null +++ b/minitests/z7_blinky_emio/ps/blink.ld @@ -0,0 +1,4 @@ +SECTIONS { + . = 0x0; + .text : { *(.text) } +} diff --git a/minitests/z7_blinky_emio/ps/blink.s b/minitests/z7_blinky_emio/ps/blink.s new file mode 100644 index 00000000..66cde3c7 --- /dev/null +++ b/minitests/z7_blinky_emio/ps/blink.s @@ -0,0 +1,108 @@ +@ https://craigjb.com/2019/03/04/zynq-baremetal-blinky/ + +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ Constants + +.equ C_GPIO_BASE, 0xE000A000 +.equ C_GPIO_DIRM_0, 0x00000204 +.equ C_GPIO_OEN_0, 0x00000208 +.equ C_GPIO_DATA_0, 0x00000040 +.equ C_GPIO_DIRM_2, 0x00000284 +.equ C_GPIO_OEN_2, 0x00000288 +.equ C_GPIO_DATA_2, 0x00000048 + +.equ C_SLCR_BASE, 0xF8000000 +.equ C_SLCR_UNLOCK, 0x00000008 +.equ C_SLCR_LOCK, 0x00000004 +.equ C_SLCR_MIO_PIN_07, 0x0000071C +.equ C_SLCR_LVL_SHFTR_EN, 0x00000900 +.equ C_SLCR_LOCK_KEY, 0x767B +.equ C_SLCR_UNLOCK_KEY, 0xDF0D + +.equ C_DELAY, 0x00200000 + + +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ Vector table + +.section .text +.code 32 +.globl vectors +vectors: + b entry @ reset + b . @ undefined instruction + b . @ software interrupt + b . @ prefetch abort + b . @ data abort + b . @ hypervisor entry + b . @ interrupt + b . @ fast interrupt + +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ The code + +entry: + @ unlock SLCR + ldr r0, SLCR_BASE + ldr r1, SLCR_UNLOCK_KEY + str r1, [r0, #C_SLCR_UNLOCK] + + @ setup MIO pin, LVCMO33 and no tri-state + mov r1, #0x600 + str r1, [r0, #C_SLCR_MIO_PIN_07] + + @ enable level shifters on PS-PL interface + mov r1, #0xF + str r1, [r0, #C_SLCR_LVL_SHFTR_EN] + + @ lock SLCR + ldr r1, SLCR_LOCK_KEY + str r1, [r0, #C_SLCR_LOCK] + + @ setup GPIO0 dir, output en, and data + ldr r0, GPIO_BASE + mov r1, #0x80 + str r1, [r0, #C_GPIO_DIRM_0] + str r1, [r0, #C_GPIO_OEN_0] + str r1, [r0, #C_GPIO_DATA_0] + mov r1, #0x0F + str r1, [r0, #C_GPIO_DIRM_2] + str r1, [r0, #C_GPIO_OEN_2] + mov r1, #0x00 + str r1, [r0, #C_GPIO_DATA_2] + + mov r4, #0x00 + +loop_outer: + mov r3, #C_DELAY + +loop0: + subs r3, r3, #1 + bne loop0 + + mov r1, #0x80 + str r1, [r0, #C_GPIO_DATA_0] + + mov r3, #C_DELAY +loop1: + subs r3, r3, #1 + bne loop1 + + mov r1, #0x00 + str r1, [r0, #C_GPIO_DATA_0] + + add r4, r4, #1 + str r4, [r0, #C_GPIO_DATA_2] + + b loop_outer + + + b . @ just in case + +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ Literal table + +GPIO_BASE: .word C_GPIO_BASE +SLCR_BASE: .word C_SLCR_BASE +SLCR_LOCK_KEY: .word C_SLCR_LOCK_KEY +SLCR_UNLOCK_KEY: .word C_SLCR_UNLOCK_KEY diff --git a/minitests/z7_blinky_emio/ps/blink.tcl b/minitests/z7_blinky_emio/ps/blink.tcl new file mode 100644 index 00000000..bf70d962 --- /dev/null +++ b/minitests/z7_blinky_emio/ps/blink.tcl @@ -0,0 +1,5 @@ +connect +targets -set -nocase -filter {name =~ "ARM* #0"} +rst -system +dow blink.elf +con