So, a couple of years ago I've seen people over the internet making their own computers and CPUs from scratch at home, the kind of thing that average person would think is possible only in industrial setting by a team of experts. Since then this idea has infected my mind, and I started to learn electronics and digital circuits in my spare time, then bought soldering iron and small assortment of electronic components, and started to experiment.
A year ago I first started to think seriously about really building a cpu, then I thought that using individual transistors would be cool (I still think so, but it means A LOT of tedious work, with at least half of the circuits not working as designed at first). At that time I read several books about cpu design (But how do it know?, DIY Calculator, and others). Based on my new knowledge and estimating my limitations, I decided, that this computer should be based around 16-bit datapath, and to have 16-bit wide instructions. It also would have 16 bit memory (data and address), all for simplicity of implementation.
The instructions are not to be microcoded, but rather decoded from instruction word by combinational logic. 16 bit instructions are this width explicitly for ease of decoding. Longer instructions would be even easier, but it may increase component count and overall cost beyond what could be allotted to it.
Another feature is register file of 8 16-bit registers, so they are addressed by 3-bit addresses. They are to be operated as: A <-- ALUop(A,B). General architecture is Load/Store.
Well, after that I put this project on hold, and recently, some month ago I turned to it again. I made simulations in Digital for ALU and Register File first, and around that started to design the rest of the system. Right now I am implementing instructions for this simulated computer, and it already kind of works, with little program in machine language.
The instructions available now are:
ALU instructions -- the simplest decoder, because ALU instruction is almost the same as instruction word for hardware. There are quite a lot of different instructions, so the ALU can do many things with its operands, which could be one of the registers, two of the registers, or one of the registers and some 8-bit constant, which is encoded in instruction.
Short jumps (within 256-byte page) -- unconditional, and on condition of Carry, Negative, and Zero flags. Lower 8 bits of jump address are encoded in instruction itself.
Load from page -- can load a word into one of general purpose rgisters from within the current memory page (256 byte long), as the lower 8 bit of memory address is encoded into instruction.
Load immediate -- loads a word which is on the next address after instruction.
Here is screenshot of this "computer" simulation running a small program running in Digital digital logic simulator (only part is seen):
This is work in progress (in the beginning stage of it), so the layout is subject to great change.
Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.