我个人本科有门计算机组成原理与接口技术学起来感觉特别吃力,该课程是关于 mips 指令,然后实验是做 FPGA 板的实验,应该用的是 nexys4 开发版。我想请教一下各位这门课到底该如何入门,我听学校老师的课,感觉有点听不懂。我感觉记忆量很大,很多东西我不是很理解,感觉是死记硬背。还有就是做题涉及到 mips 指令和 c 语言指令相互转换的题目,以及就是 FPGA 做中断和 AXI 总线一些实验在 vivado 上做一些实验,这些我都感觉脑海一片空白。希望各位能够推荐一些好上手的资料。感谢。
1
duke807 2023-02-06 13:41:00 +08:00 via Android 2
我表示,这些专业知识靠上课就完蛋了,除非你不在国内
建议找海外教材自学 fpga 建议在 linux 系统下开发,因为厂商 eda 都是原生 linux 版本,之后 porting 到 win 系统 而且未来涉及到 asic 芯片开发,主流 eda 都是 linux only 语言建议用 verilog ,不要用 vhdl 仿真建议用 cocotb ,用 python 写 tb 更高效方便,波形用 gtkwave 查看 |
2
Mithril 2023-02-06 13:59:42 +08:00 5
你要搞明白一件事,这课不是让你去学 FPGA 的,而是让你通过 FPGA 和实验,去了解“计算机组成原理”的。
简而言之,就是你自己用 FPGA 上模拟一个简单的 CPU 核,去尝试和了解指令是如何执行的,中断是如何处理的等等内容。你去找一堆 FPGA 教程,学各种开发相关的内容其实是本末倒置了。 对于 FPGA 开发方面,你只要知道怎么编写烧录程序,怎么调试(甚至这个都不必要,学会怎么用 LED 就行,等你项目复杂靠灯搞不定了,自然就想办法去学了),以及基本的 Verilog 或者 VHDL 的语法功能就行了。 如果你自己实在弄不明白,可以找老师要一份写好的项目,最简单的能跑就行。在此基础上随便改改,逐渐习惯了整个流程,再上手写自己的。 这个课程可以算本科课程里面最重要的之一了。通过它你可以明白,用于支撑你开发的这些代码运行的电路基础到底是什么样的。哪怕你以后只做高级语言开发,这些也能帮你写出更高性能的代码,更容易地学习靠近底层的技术。非常值得你花大量精力去学好它。 |
3
leoleoasd 2023-02-06 14:06:00 +08:00
我的 verilog mips 核(只做了学校要求的十几条简单指令,非常少):
https://github.com/leoleoasd/mips_cpu logisim mips: https://github.com/leoleoasd/mips-cpu-logisim 可以参考 |
4
leoleoasd 2023-02-06 14:07:50 +08:00 1
mips 指令和 c 语言指令如果不熟悉,可以找汇编语言资料。不同的架构的汇编( mips/arm/riscv/amd64 )都是相通的,学明白一个其他的就自然懂了
以及,非常推荐『深入理解计算机系统』( Computer System: A Programmer's Perspective )这本书,适合汇编和计算机组成原理课程的入门。 |
5
Schwinger777 OP @duke807 感谢您的指点。
|
6
Schwinger777 OP @Mithril 感谢您的指点,我会好好体会计算机组成原理。我可以买 nexys4 开发版照着官方给的指导手册慢慢来研究吗?
|
7
Schwinger777 OP @leoleoasd 多谢大佬的指点
|
8
leoleoasd 2023-02-06 14:21:51 +08:00
至于『推荐在 linux 系统下开发』、『推荐使用 verilog 而不是 VHDL 』这类建议,一定要提前问老师是否可以。比如,我们学校的机组课程不能用 VHDL ,我们也必须用一个只有 windows 版的很旧的 eda (板子很旧,新的 eda 不支持)
|
9
Schwinger777 OP @leoleoasd 我会找老师咨询的,我不知道是不是我学习方法有问题,在 mips 指令和 c 语言互相转化的时候,短一点的代码和汇编我都能做出来,但是一到比较长的代码,或者涉及递归迭代,我做这种问题,就会脑袋一片空白。然后考试做中断设计的综合题目,也是很难下笔,这种情况是不是我实验理解不够,做的太少?我看书上那些伪代码,短的可以看懂,但是一旦代码很长,我就感觉很难看下去,对于一些细节感觉就是看不懂。
|
10
leoleoasd 2023-02-06 14:51:21 +08:00
我理解,长的代码和短的代码也没本质区别?比如 c 翻译成汇编的时候,第一步,给所有变量分配一个地址(栈上或者堆上或者寄存器),然后一行一行对照着翻译。翻译的时候,只管当前的一行,不管上下文。最后再整体看看有没有可以优化的(比如复用寄存器、复用运算结果等)就完了,这样 拆开看,短的程序和长的程序也没本质区别?可能就是熟练程度的问题?
我当时是,大一看了深入理解计算机系统那本书(也没看完,就只看了前几章,到 jvm 那里就没继续看),就有了一个初步的理解,然后再上计组课和汇编课就没啥难度了 |
11
leoleoasd 2023-02-06 14:52:28 +08:00
中断设计,我做的不多。我一般是先用 c 和伪代码整体想好怎么写,再一点一点翻译成汇编。直接写汇编确实很难。
|
12
Mithril 2023-02-06 14:53:49 +08:00
@Schwinger777 自己买肯定是可以的,但感觉没什么必要,直接用学校的就行了。只要不是上课时间值班老师一般是不会拦着你的,毕竟他们也知道实验课就是为了让你刷经验的。
而且有的时候学校的不一定和你买的一样,有的是自己统一做过修改,有的是版本特别老,你自己买个不一定能对的上。而且它本身也不便宜,反正你都交了学费了,玩坏几块板子也算回本了:) 另外你说的短一点的能写出来,长的写不出来。个人认为主要还是经验问题,多写多练就行了。你本身开发经验就不是很多的时候,去学这做这些编译器的工作自然比较困难。 你可以用个正常的编译器生成汇编,然后你再用你写的对比一下。主要是看看编译器在结构上是怎么处理你的代码的。不懂怎么装交叉编译工具的话,可以试试这个 https://godbolt.org/ 主要注意的是转换的思路,不要在意具体细节,毕竟不同编译器有不同的处理逻辑,指令集也不一定完全一致。 |
13
rudder2021 2023-02-06 18:29:26 +08:00 via Android 1
我最近在看的一本书,好像叫《 Computer Architecture Tutorial Using an FPGA 》,书中基本上是手把手地教你怎么用 Verilog 实现一个简单的 ARM CPU ,不过书中用的是 Intel 的 FPGA 。有兴趣可以看看。
中文书的话,我觉得比较好的入门资料: 1. 《计算机组成 结构化方法》,从底层的数字电路一步步往上搭建体系结构 2. 《数字设计和计算机体系结构》,里面包含了 SystemVerilog 、VHDL 的入门内容 如果需要了解更高级的内容,可以找一些数字 IC 和 VLSI 设计的书来看 |
14
levelworm 2023-02-07 11:31:07 +08:00 via Android
实在不行先看看这两门课程,第一门是 nand2tetris ,仅看硬件部分即可;第二门是 edx 上面的 RISC-V softcore ,都挺适合入门的,后者可以用类 verilog 语言。
|
15
qi1070445109 2023-02-07 13:07:33 +08:00 via Android
@Schwinger777 这不是编译器做的吗?可以编译出来看看
|