失控----FPGA去中心化设计
0赞上一篇TDL博客,先暂停更新,因为我在考虑其中的一个关键技术点(模块间是不是可以完全不用裸的reg wire 来连接,只用interface,这样能大大降低模块间的耦合度,其实本博客基本就能找到答案了)。
最近在看KK的《失控》,KK的观点刚好切合FPGA目前的发展------去中心化设计。这篇文章就来讲讲去中心化设计。
假设一个项目:
一、拥有的外设:4路SPI分别接外MCU,4路I2C分别接外总线,4路UART分别接4个PC,1路网口(只UDP),1路Qflash,2个LED,2个数码管。
二、设计要求:只有一个,所有外设都是两两相通的,比如任意SPI,都能把数据推送到任意UART,也有从任意I2C接收数据,任意接口都能控制数码管。
可能的设计思路
挂个U核,各个外设,接口都做成标准总线slaver口IP,外加中断控制,由CPU统一对这些IP进行调度控制,这是现在FPGA SoC的设计方法,也是ARM 集成的方式。
纯逻辑控制,各种状态机控制不同外设,在这个项目中这种实现方式难度相当大。
(曾经看过一篇博文提到FPGA实现TCP,指出无非两种方式,一种嵌CPU,用U去跑协议棧,另一种是写大的状态机)
莫老师说用Noc(network on chip),我确实是使用这种方法。
只是个人不是很喜欢noc这个词,因为network会让人偏离关注点,其实纵观整套代码,net是隐藏的,没有哪个模块来表示net,也没有统一的net protocol,外设决定protocol,外设的设计重要性会被net分散掉;再者我也不喜欢这么狭义专业的叫法,更喜欢范特西的,有想象力的词,用《失控》里面的一个高频词“生态系统”EoC,各个模块的关系就像一个自恰的生态系统。
SOC图
EoC Noc图
总线其实是没有一个总的实体的(interconnect),是由发布的多个interconnect组成,当然也可以设计成一个实体,但是弊大于利。所以更像下面的图
-----------------------------------------------------------------------------------------------------------------------------------------
特性对比
1、SOC接入设备是有限的,大大受限于中断数量,一个CPU挂上千个slaver,有上千个中断(也并不是每个都有中断,LED就没有,有中断的还是多数),那是很可怕的,当然现在的也没有看见那个SOC挂这么多的。EoC NoC没有这个限制,可以接入任意数量的设备。
2、外设设备可以看成资源,CPU其实也是资源,SOC会出现资源过度占用,因为每一次外设的交互都会叠加在CPU这个宝贵的资源上,所以也会造成CPU性能越来越高(我们真的需要这么高么),EOC NOC也会出现资源过度占用,但是不会出现,SPI过度占用会影响I2C的情况。
3、SOC接口和协议相对简单除了CPU是master 其余都是slaver,协议只有一种就是CPU规定的(地址多少位,数据多少位这些)。EOC NOC设备可以只有其一任意接口,也可以两种都有,协议更是每一个设备的协议可以不一样,控制LED的bus协议就和SPI的bus协议可以不一样。
4、分布独立性,SOC方面如果UART想控制LED,必须在CPU没有再处理Ethernet的时候才能完成,EOC NOC没有这种限制,只有请求的设备都是重叠。所以可以做到全部设备满负荷运行,SOC如果一直在处理大规模的Ehernet数据,则可能没有时间来处理SPI,其余设备就会处于被动空闲状态。
5、设计难度,EOC NOC在于net路由,设备的master,slaver接口的设计,SOC 因为已经有现成的Bus和IP,设计基本都在C环境。
6、Bus区别,EOC NOC是轻量的BUS,不会有优先级,中断,因为设备master根本没有能力处理优先级(也不需要),SOC基本是全功能的BUS。
由于一篇博文有字数限制,所以请看下篇