From 68c80359ba0983bc21a18c0270025be9b441c0bb Mon Sep 17 00:00:00 2001 From: Wojciech Kosior Date: Tue, 29 Dec 2020 19:56:04 +0100 Subject: add the ability to include additional data at the end of bitstream image and prepare an example, that reads thic data through SPI and displays it --- examples/example3b_spi_tclasm/instructions.s.tcl | 142 +++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 examples/example3b_spi_tclasm/instructions.s.tcl (limited to 'examples/example3b_spi_tclasm/instructions.s.tcl') diff --git a/examples/example3b_spi_tclasm/instructions.s.tcl b/examples/example3b_spi_tclasm/instructions.s.tcl new file mode 100644 index 0000000..294a73e --- /dev/null +++ b/examples/example3b_spi_tclasm/instructions.s.tcl @@ -0,0 +1,142 @@ +### Relevant addresses: +### * h140000 - h1401FF - SPI data transfer memory +### * h140200 - h140201 - SPI bytes_to_output reg +### * h140202 - h140203 - SPI bytes_to_receive reg +### * h140204 - h140207 - SPI operating reg +### * h1C0008 - h1C0009 - low bits of timer reg +### * h100000 - h1009FF - VGA text memory +### * h100A00 - h100A01 - VGA power-on register +### * h1C0006 - h1C0007 - LED2 register + +### The bitstream binary itself is 135100 bytes big. We append our data +### at the and of this binary file, so it can later be found at address +### 135100 on the flash chip. + +set_sp h100000; # 2 16-bit instructions + +### power up flash ship +## set bytes_to_output to 1 +const 1; # 1 16-bit instruction +storew h140200; # 2 16-bit instructions +## set bytes_to_receive to 0 +const 0; # 1 16-bit instruction +storew h140202; # 2 16-bit instructions +## release power-down SPI command +const 0xAB; # 2 16-bit instructions +storeb h140000; # 2 16-bit instructions +## start SPI operation +const 1; # 1 16-bit instruction +storew h140204; # 2 16-bit instructions + +### wait for at least 3000 ns after command gets sent +## reset the timer +const 0; # 1 16-bit instruction +storew h1C0008; # 2 16-bit instructions + +## loop until 45 ticks pass; 45 ticks is 3600 ns; additional 600ns is enough +## for power-up command to be sent +# there were 18 16-bit instructions up to this point, so loop address is 36 +loadwzx h1C0008; # 2 16-bit instructions +const 45; # 1 16-bit instruction +lt; # 1 16-bit instruction +cond_jump 36; # 1 16-bit instruction + +### we'll transfer a total of 2400 bytes by making 5 transfers of 480 bytes; +### our SPI peripheral is capable of transfering at most 511 bytes in one go +## initialize transfers counter +const 0; # 1 16-bit instruction +storew h080000; # 2 16-bit instructions + +### transfers loop starts here, it'll execute 5 times +# there were 26 16-bit instructions up to this point, so loop address is 52 +### read 480 bytes from SPI +## set bytes_to_output to 5 +const 5; # 1 16-bit instruction +storew h140200; # 2 16-bit instructions +## set bytes_to_receive to 480 +const 480; # 2 16-bit instructions +storew h140202; # 2 16-bit instructions +## fast read SPI command +const 0x0B; # 1 16-bit instruction +storeb h140000; # 2 16-bit instructions +## prepare address; 135100 is base address of our data inside flash memory +const 135100; # 2 16-bit instructions +## compute the offset of bytes, that have already been read +loadwzx h080000; # 2 16-bit instructions +const 480; # 2 16-bit instructions +mul; # 1 16-bit instruction +## also store the computed offset for later +storew h080002; # 2 16-bit instructions +## add the offset +loadwzx h080002; # 2 16-bit instructions +add; # 1 16-bit instruction +## store the address in big endian +store h080008; # 2 16-bit instructions +load h080008; # 2 16-bit instructions +const 256; # 2 16-bit instructions +div; # 1 16-bit instruction +storew h140002; # 2 16-bit instructions +load h080008; # 2 16-bit instructions +storeb h140003; # 2 16-bit instructions +load h080008; # 2 16-bit instructions +const 65536; # 2 16-bit instructions +div; # 1 16-bit instruction +storeb h140001; # 2 16-bit instructions +## start SPI operation +const 1; # 1 16-bit instruction +storew h140204; # 2 16-bit instructions + +### force wait for operation completion +const 0; # 1 16-bit instruction +storew h140200; # 2 16-bit instructions + +### assume data to be ascii characters and print it to screen +### initialize index to 0 +const 0; # 1 16-bit instruction +storew h080004; # 2 16-bit instructions + +## print characters in a loop +# there were 77 16-bit instructions up to this point, so loop address is 154 +## load current index value, get 2 copies of it, add offset to one copy +loadwzx h080004 +loadwzx h080002 +add +loadwzx h080004 +## load 4 bytes from SPI memory +load+ h140000 +## write to VGA memory +store+ h100000 +## increase index +loadwzx h080004 +const 4 +add +storew h080004 +## compare index to 479 +loadwzx h080004 +const 479 +lt +cond_jump 154 + +## increase transfers count +loadwzx h080000 +const 1 +add +storew h080000 + +## switch LED2 +loadwzx h080000 +const 2 +rem +storew h1C0006 + +## if less than 5 transfers were done, continue with another one +loadwzx h080000 +const 5 +lt +cond_jump 52 + +### after loops, start generating VGA output +const -1 +store h100A00 + +halt -- cgit v1.2.3