Uncle Bob, 'Clean Architecture' is the book you want. Examples are in Java but you shouldn't have any problems understanding
This book is a must-read, imo.
Clean Architecture: A Craftsman's Guide to Software Structure and Design (Robert C. Martin Series) https://www.amazon.com/dp/0134494164/ref=cm_sw_r_cp_apa_i_FyzqDbV9KJ25Y
https://www.amazon.com/Digital-Design-Computer-Architecture-Harris/dp/0123944244
This book teaches you how to implement a 32-bits MIPS processor with single or multi-cycle design using verilog.
This book:
Elements of Computing Systems - https://www.amazon.com/Elements-Computing-Systems-Building-Principles/dp/0262640686/ref=sr_1_1?ie=UTF8&qid=1518118693&sr=8-1&keywords=elements+of+computing+systems
Will do what you are looking to do.
I found Andrew Tanenbaum's Structured Computer Organization really good for getting a thorough introduction to computer hardware from logic gates over instruction set architecture to assembly language.
I haven't done that LISP project, but I recommend Crafting Interpreters.
I know that you say you want to build a compiler. And this tripped me up when I first started. But an interpreter and a compiler are very, very similar--to the point of being nearly identical. You can build a compiler by building an interpreter, then swapping out the immediate-calculation functions for functions that generate machine code (or LLVM IR or whatever). You will often want at least a basic interpreter for your language anyway, if for no other purpose than simplifying expressions.
I also recommend the "Dragon Book", which is pretty much the textbook on compiler design. Reading this book was absolutely eye-opening, because it presents a bunch of very basic and general information that everybody in language design just assumes you know.
I really struggled when I started before I read this book because so much stuff is very much simpler than I imagined. For instance, for my first language project, I got stuck on codegen and never finished. I was stuck on the basic question: okay, but how do I know what order to generate the code in? It seemed like a very hard question, requiring DAGs and dependency analysis and all sorts of shit like that, and I got discouraged and quit. Especially because so many tutorials are like "now that you've parsed your language, interpreting it is easy and left as an exercise for the reader". Guess what? It is easy. It's just a brain-dead post-order traversal. But literally the only place that ever said it that simply and directly was the Dragon Book.
in this book you'll find a chapter on the evolution of PC's architectures and parts, but i'm not sure this is what you're looking for.
Modern computers still use the same “basic theory” that the first computers used.
Introduction to computing systems is a good book that will give you what you are looking for.
Não sei se seria complicado demais, mas tem o livro The Elements of Computing Systems: Building a Modern Computer from First Principles (por R$ 99 na amazon).
Ele mostra como construir um "computador", incluindo SO, bootloader, etc, que roda num processador que você também constrói virtualmente. E justamente p/ construir esse processador você parte das portas lógicas mais básicas e vai incrementando.
Não é tão "logic for dummies" mas me parece bem recompensador. (Está na minha wishlist ainda)
Also, if you're interested in learning it yourself (I wasn't sure, people have already questioned my base-less claims of knowing computer before), I recommend this book, which we used in our class, r courses on "Computer organization"/"MIPS architecture basics"
MIPS was designed at first to be easy to learn and teach, and was later used by real computers IIRC, so earning through it can help a lot. and you can use qemu-mips to run assembly code written for mips, if you want to see things happening fast, or other emulators to see everything moving and changing
In college, I had a course called Introduction to Computer Engineering. It started with how a transistor works, then how multiple transistors could store values, then how transistors could perform boolean operations, then how all of those boolean operations could be programmable rather than single-purpose, and then how you might design a human-readable shorthand to represent the instructions going to this programmable circuit.
C programming was the next semester.
We used this textbook for that course. I always found it very readable.
According to Clean Architecture, core logic should not depend on I/O; I/O should depend on core logic. But it's your choice on whether to take this advice, as it is not easy to do at first.
I agree, particularly with the first paragraph.
Ben's CPU videos coupled with Harris and Harris https://www.amazon.co.uk/Digital-Design-Computer-Architecture-Harris/dp/0123944244 is a great way to get junior EEs started with FPGAs.
I would start from there (CPU), but you won't be missing or struggling with anything if you start from somewhere else, or jump around a bit.
To be fair, Ben Eater's 8-bit computer uses microcoded ROM for control of the processor, which is just one of many control schemes for a processor. Though, that's outside the scope of this comment.
OP, check out Digital Design and Computer Architecture for a good intro after you watch through some of Ben Eater's stuff. I'd HIGHLY recommend doing the questions at the end of each chapter to make sure you actually understand the stuff.
The book mostly covers question 3 (and I guess 4) above. 1 and 2 are, as others have stated, more VLSI questions.
On that front (again, briefly): the chip designers use hardware description languages (like Verilog and VHDL) to describe the functionality of the chip. They then use programs to convert it to an intermediary language called RTL (register transfer logic). They then "lay out" the chip - describe how they want things positioned with respect to one another) and the chip fabricator then uses libraries that they have to transfer the RTL to a series of photolithography masks… you know what. This process is too damned complex to go through right now. Sam Zeloof has a great series of videos on this. He built a chip fabrication set up in his folks' garage when he was in high school. He's insane.
Structured Computer Organization, by Andrew Tanenbaum does a lot of what you’re looking for.
I read it a fair while ago but IIRC it’s pretty well written and understandable.
But How Do It Know? Is a really good book that explains how computers work in a very simple way. There’s also a short YouTube video that sums up the concepts in the book.
But How Do It Know? - The Basic Principles of Computers for Everyone https://www.amazon.com/dp/0615303765/ref=cm_sw_r_cp_api_glt_fabc_WM1AQKMRCGNFPYW5T2F5
There's a lot of books written about good programming practices, some of which are more advanced than others. Search around on amazon and you'll find a few.
I cannot vouch for this specific book, but I read another book in the same series, which taught me a lot of things about software design that I had never even thought about.
You should be able to find the book on Amazon.
Here Its’s not called nand2tetris.
Edit: I was a little unclear. The book is not called nand2tetris, but the associated courses are/were. You can go to nand2tetris.org to find the author’s website and links to their coursera courses. You really don’t need the courses. The books is great.
Find it here on Amazon. It's actually a pretty good textbook and worth reading even if you're mostly a software developer.
Love this book. Helped me to "glue" various concepts together:
https://www.amazon.com/Structured-Computer-Organization-Andrew-Tanenbaum/dp/0132916525
I also wouldn't hesitate to recommend Pong Chu's Verilog/VHDL books, which are very practical.
Digital Design and Computer Architecture, Second Edition is another book I recommend because it takes primitives and then successively builds components that are finally integrated to produce a RISC processor (bottom-up).
https://www.amazon.com/Digital-Design-Computer-Architecture-Second/dp/0123944244/
Other links you may want to check out:
https://www.reddit.com/r/ECE/comments/50tlkl/fpga_bookresource_reccomendations/d7c08i8/
You don't need architecture perse unless you want high performance. If you want high performance, you pretty much want to learn the equivalent of a class in computer organization and computer architecture. So if you aren't dealing with raw pointers directly, advanced multithreading, vector/simd math, HPC, 3d graphics, gpu cards, etc, you really don't need computer architecture. If any of those things interest you, you should probably learn it, and you can definitely learn it as you learn C++. If you are mainly dealing with C++ standard library and gui stuff, you will rarely encounter computer architecture topics.
The standard texts (and my favorites) are
http://www.amazon.com/Computer-Organization-Design-Fifth-Edition/dp/0124077269/ (Patterson and Hennesey).
http://www.amazon.com/Computer-Architecture-Fifth-Edition-Quantitative/dp/012383872X ( Computer Architecture, Fifth Edition: A Quantitative Approach, Hennesey)
Those are not referral links, and I recommend they be read in that order.
Some people might say those books are a bit rough for a beginner, so try to get a sample or borrow one to see if you like them. There are some other easier computer org /arch books out there but I'm not aware of any really good legally free ones off the top of my head.
I would love to contribute to GCC but I don't have a solid compiler background. Where do you guys suggest I start? Something like this book? Just jumping in and seeing what sticks?
Sounds like cool stuff.
For Zynq specifics and great examples on using Vivado for Zynq SoC development, have you seen the Zynq Book? There is a lot of great information in there.
For bottom up courses on FPGAs I'm not super familiar with any. A great text book which simply covers introductory details on hardware design, FPGAs, and hardware description languages is Digital Design and Computer Architecture by Harris and Harris. Not all chapters of the book are relevant to what you're interested in, but some contain the introductory information I think you're looking for. If you're uninterested in paying for the book, it shouldn't be too difficult to find it online 😉.
I dont know if this is even still relevant to your question, but i always wondered how a pc works and i stubled over this youtube video: How a CPU works.
Ofcause it is only the most basic computer you can build, but with modern computers the basics are the same, you just have some more things that help doing other things faster.
The Video is based on this Book: But how do it know, which i have read and really reccommend if you want to know a little more about the Topic.
i agree with the others, you are still a newbie, you should be in tutorials
AND
you have figured out something that many students never figure out, that it is NOT enough to just know loops, if-statements, variables, etc,
learning the bigger picture of application design and architecture is a whole other skill. since you are aware of the issue -- which is a big plus for you -- when you do these tutorials try stepping back several times through the tutorial and ask yourself, how does this application work from 10,000 feet? how is it designed? Why?
one type of course/tutorial you could start looking for -- on the side because you are very new -- is a course on OOP design.
the book "clean architecture" by uncle bob is an easy to read start
https://www.amazon.com/Clean-Architecture-Craftsmans-Software-Structure/dp/0134494164
again ... you are still a newbie, so you would not always know what he is talking about, but it is in easy english, not very difficult language, so you might find it interesting.
For the CpE side, this is commonly the intro book teaching the fundamentals:
https://www.amazon.com/Introduction-Computing-Systems-Gates-Beyond/dp/0072467509
And for computer architecture it seems to be commonly this one:
https://www.amazon.com/Computer-Architecture-Quantitative-John-Hennessy/dp/012383872X
Macroeconomists have the purple book on international macro.
Computer scientists have the purple dragon book on compilers.
They serve roughly the same purpose.
What they said above. Additionally, patterns can be described as a DSL (Domain Specific Language) that help you communicate ideas and approaches more succinctly and become transferrable knowledge. Anytime you see a foreach, that's an iterator patten from GOF. Controller, there's a few different versions depending on where in the stack you are (Front Controller vs Controller in MVC (this comes from Smalltalk a long time ago) but generally is doing some request brokering. Fowler had a lot of these in an oldie but goodie: https://smile.amazon.com/Patterns-Enterprise-Application-Architecture-Martin/dp/0321127420/ref=sr_1_4
It's worth a read even if it's for consistent naming, which ends up making development faster, or at least it should.