【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
从消费电子的soc芯片来说,现在国内从事芯片设计的企业还是很多的,这其中有新岸线、瑞芯微、全志、炬力等等。一个完整的soc芯片其实包含了很多东西,比如说cpu核、总线、gpu核、gpio、timer、spi、i2c、i2s、video、sound等等。当然,这些核心,有的是买来的,比如说cpu核心,有的完全可以自己设计,比如说i2c、spi等等。目前消费电子的cpu一般还是以arm为主,电视机顶盒会采用一些mips核、一些交换机设备会使用powerpc核心、医疗设备上用coldfire系列的比较多、sparc芯片多用在sun服务器上。以上谈到的这些cpu其实都是risc cpu,也就是精简指令的cpu。
risc cpu有些共同的特征,比如说指令简单、数据和指令分开、指令对齐、通用指令和协处理器分开、中断模式简单等等。基本上,如果大家学会了一种risc的cpu,再学习其他的cpu就比较简单了。之前,risc cpu的种类很多,但是我们一直没有机会看到cpu究竟是怎么设计的。这种情况直到出现了opencores这个网站之后才有了改善。因为,网站上为我们提供了openrisc这种risc cpu的开源代码,我们才看到设计一个真正的cpu究竟需要做哪些工作。当然,凭良心而言,这份openrisc的代码还是比较简洁的,大家如果看一下sun的opensparc代码,就会明白我想表达的意思了。但是,openrisc虽小,常见的功能却不少,同时它具有gcc的工具链,而且已经移植到linux上了,还是非常值得我们学习的。
通过openrisc的内容,我们发现一个完整的cpu应该包括这些内容,
(01)mmu、tlb的处理;
(02)cache的处理;
(03)cpu 五级流水线的处理,即IF、ID、EXE、LS、WB的处理;
(04)pc地址的处理;
(05)中断的处理;
(06)timer处理;
(07)流水线freeze信号处理;
(08)电源管理处理;
(09)biu处理,即cpu和bus接口处理;
(10)其他内容等等。
大家如果熟悉arm体系结构的话,就会对上面的内容非常熟悉。最基本的cpu内容也就是这些东西。当然,现代cpu为了满足性能的需求,还会加入其他的一些内容,比如多cpu、流水线预测、cache同步、中断调度等等。软件与硬件打交道的方法其实就两种,汇编和中断。汇编指令帮助我们进行基本的运算、访存、读写外设寄存器、读写cpu状态寄存器、读写cpu控制寄存器,而中断就是外设与cpu打交道的方法。当然,从体系结构上说,poll和interrupt都是可以的,只不过中断效率好一点。数据传输也一样,总线到cpu、再到内存的传输方式太慢,人们因此有设计出了dma这一种数据传输方式。在cpu体系结构中,其实很多的设计都是有原因的。大家不光要熟悉这些技术,最好对相关的背景知识有进一步的了解。
再回到arm,基本的指令无非是加减乘除、移位、比较、跳转、中断返回、状态获取和保存、协处理器的设置和保存、利用io地址访存外设等等。内容不多,但是后面演绎的东西就多了,比如什么时候用rtos、上下文切换怎么弄、soc体系结构怎么和linux绑定在一起、选择cpu有什么讲究、host和device有什么分工、外设协议如何和cpu打交道等等。这里面的学问还是很大的。当然,新技术会不断出现,学习的唯一方法就是学习相关技术手册、访问官网、买设备试验等等。一般来说,中文资料总是会慢几拍,所以学好英文还是很重要的。
胡乱写了这么多,一来是自己的总结,二来是希望与大家分享一些自己的感受。对于通用的算法,理论上其实软件、硬件都能实现,软件用c编写,跑在cpu上;硬件用verilog编写,直接综合成门电路实现。就拿float运算来说,有些cpu就不支持,有些还需要外设的dsp的帮助,这其中的权衡利弊还是挺多的。要学的东西很多,关键是掌握基础,掌握之后才能思考和分析。