Jmstein7 wrote:
I've tried using the various cores we've discussed and used here, but I just cannot get it to work (obviously). Is it possible to integrate, e.g., Arlet's core into a ubiquitous unit, as well as a via and acia, such that we could create drag and drop ip in vivado ip integrator and have a working system?
I don't think it's fair to say it doesn't work. We have a basic system working that uses Arlet's CPU core, block RAM, block ROM, a VIA, an ACIA, and an external bus interface connected to an external VIA. At least, it's working for me. If that same system isn't working for you, then we need to keep digging.
I think some of your frustration is because we are using a collection of 8-bit modules that don't share a common interface, and so don't quite connect directly together. Modules that could be identical, such as different CPU cores, choose slightly different names for signals, sometimes use those signals differently, and are often not well documented. It's difficult to build a working system out of these modules without a good understanding of these the subtleties. And when the scope is extended to include external peripherials, like real VIA and ACIAs, that adds another layer of complexity.
What's needed I think to solve this problem is for each module to implement a common interface. In the FPGA world there is exactly such an interface, called
the wishbone bus. It's been around for about 20 years and many of the modules on opencores support it. However, it comes with a certain amount of complexity, because it's very generic and because it's not tied to any one processor family. Some people on this forum (myself included) have used it in their own projects, but I've not seen it widely used in 8-bit systems.
[ Edit: It's also worth saying as well as Wishbone, there are many other "SoC" buses: AMBA, AXI, OCP, CoreConnect, MSBUS, etc. There is a overview/comparison
here. I picked Wishbone as an example above because it's the one I am most familiar with. ]
Once you have a set of modules that implement a common interface, like wishbone, I'm honestly not sure encapsulating them as IC Blocks for use with Vivado's IP integrator adds much value. It's just another level of abstraction, it ties you into using one vendor's tool chain, and even then it only supports their more recent/higher end devices.
Personally, I avoid Xilinx's IP framework as much as I can, preferring instead to develop everything as HDL. That makes it easier to build projects that target Altera, Lattice and Xilinx devices. It makes it easier to keep projects under revision control. And it makes it easier to do system simulation with third-party tools like Icarus Verilog. But I do accept that other may view this differently, and find the block diagram tools a useful way to visualize the whole design.
It's important to realize the Xilinx's IP framework does not, itself, solve the problem of interoperability between modules. You still need to design (or leverarage) a common internal bus (like wishbone), then create a set of modules that implement this bus interface. This is a manual process and it requires a good knowledge of HDL design, and a good knowledge of the existing components you leverage. It's not at all easy to do this well, which I think is why it's not yet been done for 6502 based systems.
This is quite an interesting topic, does anyone else have a view, or any suggestions for Jon?
Dave