1. FPGA是自顶向下的设计模式,开始写代码时第一项面临的就是模块划分。模块划分说容易就容易,说难就难,根据工程师的码龄,可以分为下列几种情况:
第一阶段:有啥好分的,就一个.v文件看着多方便;
第二阶段:代码写的有点多啊,尝试着分一下;
第三阶段:动手前,先想怎样划分:按A情况的划分,接口端子数量太多啊
第四阶段:这个功能需要复用,单独写个.v
第五阶段:这样分怎么样,客户需求变了的话,也好改
第六阶段:这是最好的划分方法了,不能追求太完美
......
总的来说,模块划分的意思在于,将复杂的功能一一分解开来,是设计思路的一种体现,模块划分的好,后期维护或者代码留用都比较方便。一旦划分成单独的模块,就可以将每个模块分配给不同的工程师来做,当然这是大公司的策略。大部分的情况还是一个人负责一个项目的,或者负责一块FPGA的。
2. 模块划分的依据
首先按功能和所处的位置进行划分:比如输入接口模块、输出接口模块、内部处理模块、及必要的时钟和复位控制模块。每个接口模块根据协议的复杂程度考虑是否进行细分。
其次模块间端口数量尽量不要太多,数据线除外。太多的话,一是写起来麻烦,浪费时间,容易出错;二是后期维护也不方便。实在不行的话,就将同功能的端口进行编码合并,增加单个信号的位宽。
再次,多个地方需要用到的功能要单独划分成模块。这样的好处是可以直接调用,也可以为后面的项目进行留用,有了问题只更改这一个模块即可。
最后模块划分并不是画几个框图而已,尤其是初学的时候要注意,一定要将各模块的端口名列出来。当你很清楚的列出端口名时,这个项目某种意义上已经做完了。
3. 模块间数据的处理方式-推拉门
数据(包括命令)在模块间进行传输时,根据情况有下来几种方式:
(1)这种情况用于B模块有能力够处理完A模块的数据,此时不需要协商,也是最简单的模式
(2)这种情况用于B模块没有持续处理数据的能力,或者在上电后的一段时间内尚未完成初始化,此时A需要看B的状态(ready信号)进行传输数据
(3)这种情况多半B模块占据着主控位置,在A模块准备好后,B决定何时去取数据
(4)多用于数据发送方不止一个情况,B内部需要进行仲裁
(5)情况同上,区别在于B主动去读取数据
整体来看,数据(包括命令)在模块间进行如何传输,某种程度上就是在决定谁是主模块,谁是从模块;主模块既可以主动去读取数据,也可以叫从模块主动发送数据,如同大门一样,既可以推也可以拉。
4. 最后一点,模块划分的最终归宿往往是如何对信号进行命名,毕竟起个好名字,bug都会少些O(∩_∩)O哈哈~