I'm pretty familiar with ISE and Lattice Diamond (which looks like like ISE), but this is the first project I've done with Vivado and Vitis. I'm doing a Microblaze design with external memory, SPI, I2C, and general I/O. I get that the general idea is to do the hardware design in Vivado, and it generates include files and whatnot for software development in Vitis.
But intuitive? Not to me. If I hadn't found a workflow example which says click here, type this in here, do this, do that, I'd still be struggling.
For Vivado, it seems to be throw a bunch of pieces into a block design, keep clicking on block automation and connection automation multiple times until they stop popping up, then generate a bitstream and send that and some other info to Vitis. But apparently you don't program the FPGA with Vivado, you use Vitis? Hmm, I'm more used to a flow where you program the FPGA, and then JTAG is used to insert the running program for Microblaze, presumably this is still happening under the covers. But Vivado seems to desperately want to abstract everything away from you. I haven't yet worked on how to get my own Verilog into the design -- presumable there's a side way to do this, or maybe I create my own IP chunk that gets dropped into the block design? And why was it so hard to figure out how to do the pin planning for my design. Oh, you switch to a pin planning layout when you happen to be viewing either the synthesis or implementation output? That's not intuitive to me. Why isn't there a pin planning/constraints button right in the left flow panel?
Then there's Vitis. Point it at the stuff from Vivado and you're good to go, no? Platform project? System project? Domain? Say what? Yet, I muddled through it and got an app running. Presumably doing "program FPGA" sends the vivado bitstream, and "Launch on Hardware" puts the microblaze program into the internal blockram through JTAG. Oh, but heaven forbid you make a hardware change in Vivado, then forget to re-export the bitstream, and tell Vitis to read it again. Then either things don't work or they don't compile. Why is this such a clunky way to do things? Why isn't there a dependency between Vivado and Vitis so then when the hardware changes, Vitis knows this and updates everything as appropriate? Ugh!
Did I miss the magic document that simply explains how everything is supposed to work and hang together? Instead docs seem to be either marketing ("seize the future with HLS and Vivado/Vitis!") or detailed user guides about a particular topic.