在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」,
点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!
用老石的一句话其实很好说明本质,cpu运行时固定数据流,底层硬件在变化。而fpga运行是固定底层硬件,数据流在硬件上流动。我知道很多初学者看到这段并不能理解,不是说fpga是可以对硬件进行编程的器件吗?为什么运行的时候底层硬件是固定的?
这其实跟他们处理数据的思路有关,cpu是通过指令集去完成指定操作,而fpga实现功能的思路与数字硬件电路一样,需要加法器,那我就用与非门搭建一个加法器,只不过fpga内部就把与或非这些逻辑门用查找表这一个器件替代了,查找表本质就是ram,这个ram只能通过综合软件进行初始化,每次写完程序后,使用vivado,quartus综合,然后烧录,烧录的是什么?其实就是给这些查找表赋值,确定这些查找表的功能,有的查找表根据写的代码,可能是加法器,减法器,数据选择器,比较器等等。当工程烧录进fpga之后,那fpga内的每个查找表的功能和连接方式其实就已经确定了,其实fpga内部的电路就已经确定了,后续需要处理的数据只需要从输入端流出到输出端,就完成了相关了运算,所以说fpga运行是数据流在底层硬件上流动,因此速度就很快。
从而也得知编写fpga本质就是搭建数字电路,只不过使用查找表替换了与,或,非这些基本逻辑。比如在学数字电路的时候想要实现两个加法运算,怎么做?如果不考虑速度,那就按顺序执行。如果想电路简单,速度快,那是不是直接搭两套加法器电路,每个电路完成一个加法运算,最后把两个电路计算结果使用一个数据选择器选择输出就行了?这其实跟fpga的思路是一样的,想速度快直接搭两套完全相同的电路实现两个运算即可。
而单核cpu想要完成两组运算怎么办?那就只有按顺序一组一组的来了。cpu他需要取址,译码等操作,每次只能执行一条指令,当他取到需要运算的数据后,如果要执行加法运算,就需要调用底层加法器,如果要执行除法,就要调用除法器去完成,本质是数据固定,根据运算类型不同调用底层不同硬件去计算,所以速度相对较慢。
当然现在cpu和fpga都已经不是当年那个简单的器件了,fpga内部也早就不只有查找表,cpu内部运算也进步了,但本质的东西还是没变。