分享

浅谈FPGA、MBD和HDL代码生成

 wanglh5555 2016-09-21

前两天感冒去医院,本想就是拿点药吃吃。可是一楼挂号、二楼看门诊开药、回到一楼付费、最后到药房取药,在没有多少病人需要排队的情况下足足花了我半小时时间。可是如果回到二十年前的乡村医院,只需找到全村都熟知的大夫,说明来意、取药、付费到走人五分钟即可搞定。我很清楚,现在医院的这种由指示牌引导病人从一个地点走向另一个地点、顺序固定的流程化操作对于处理大流量病人的时候是高效的,但在另一些情况又是低效的。

同样,CPUMCUDSP等处理器不就是采用由MOS管等构成的基本门电路按照一定的架构(比如冯.诺依曼架构、arm架构等)、顺序搭建而成能够控制电流沿着一定路线、时序流动从而可以处理由C语言所描述的算法的硬件数字电路吗?它对于处理某些算法是高效的,但对于另一些算法的处理却未必高效,比如信号、图像、视频等。既然连冯.诺依曼架构的处理器都不能高效处理的这些算法,该如何处理呢?答案就是采用基本门电路自己搭建这样的硬件电路。当然,可不是让您到电子元器件市场采购上千万与、或、非门回家手动连接哦!而是采用FPGA

您可以认为FPGA就是一个巨大无比的容器,里面藏有千万数量级的基本门电路,并且排列有序。有些FPGA中除了有这些基本资源之外,还含有DSPPowerPCARM处理器等。所以您可以采用这样的FPGA很方便的实现一个片上系统(SOC)。不要担心这些资源之间如何连接,因为在这些基本门电路以及其它资源之间存在长短不同的断开的连接线,您只需要选取想要的资源将对应的连接线连上就可以了。是不是在一头雾水的想,那得多大的一个显微镜来帮忙才能完成这些线的连接呀?况且我的数字电路知识早还给老师了,根本不知道该如何用这些基本元器件搭建那么复杂的图像处理算法!

哈哈,您又想多了。

首先,您连放大镜都不需要,会有一个软件的开发环境协助您的工作,如果您用的是XlinxFPGA芯片,对应的开发环境就是ISE或者Vivado;另外,您也不需要很清楚专业的数字电路知识,只需要使用硬件描述语言(HDL)描述您的算法,集成在ISE里的综合工具会将您的算法综合成为基本门电路连接而成的逻辑网表。如果您用的是verilogHDL,其语法很像C语言哦!综合出来的逻辑网表经过一个映射和布局布线的过程之后就可编译成为一个bit文件,使用下载工具通过JTAG口下载到FPGA,您的系统就可以工作了。当然在编译之前还需要将系统的IO口和FPGAIO对应起来。

看来使用FPGA还是比较容易的,复杂的地方都有EDA工具帮我实现了,只需要熟悉VHDL或者verilogHDL硬件描述语言就可以搞定了嘛!不过,可能是中学学英语烙下了恐惧症,提到学习语言就有点头痛。如果有个智能的工具连代码都帮我搞定了那才是真正的爽啊!

说了那么多,其实我最想跟大家聊的是HDL代码生成

用手写代码来描述算法过程是痛苦的,debug起来也不方便,更要命的是,整了好久挤出一批代码,结果发现需求文档有问题。还有比更要命还要命的,写需求那帮家伙不承认文档有误,说是我理解问题。有没搞错,我可是玩代码的,能用abc…外加一些乱七八糟的符号把一幅模糊的图片变清晰了,可想有多聪明呀!吵也没用,代码还得重写呀!问题到底出在哪里了呢?答案很简单,您的开发模式有问题。为什么那么老土用Office来描述您的需求呢?Office除了能帮您检查出几个错别字之外,它能帮您验证功能缺陷?可以使用SimulinkStateflowMATLAB Function外加一些信号处理和图像处理模块在模型里实现您的需求和算法呀!并且从需求开始就可以通过仿真来验证功能。大量的输入激励源、各种仿真观测模块,更重要的是还有Simulink Verification & ValidationSimulink Design Verifier这样的工具箱帮助在模型阶段进行动态和静态测试与分析,最大程度的保证系统算法安全可靠。原来还有这么好的工具呀?好了,我的需求和设计在模型里验证没问题了,现在总算真正理解了需求了吧?再也不理那帮写需求文档的家伙了。开始写我的代码喽,还好距离代码交付还有几个月,写完加上debug测试时间应该还来得及,大不了牺牲几个周末吧!等等,别犯傻了,为啥不用HDL代码生成工具呢?不仅不会牺牲周末,还可放两月假!那又是个什么鬼?

好吧,我们一起来看看HDL代码生成工具到底能做点啥?

HDL代码生成工具可以将您在Simulink模型里所描述的算法生成硬件描述语言,VHDLverilogHDL因为FPGA处理的都是定点数据,所以在生成HDL代码之前需要对模型进行定点化处理,否则所生成的代码是不可综合的。另外,并不是所有的Simulink模块都支持HDL代码生成,所以如果决定做HDL代码生成的话需要有选择的使用Simulink模块。在MATLAB命令行输入如下命令所弹出的子库都是支持HDL代码生成的。HDL代码生成之前需要对模型做些设置,可以使用MATLAB函数hdlsetup 进行快速设置。

>>hdllib

HDL代码生成工具除了生成代码,还可生成便于查看代码的html报告。从报告中很方便的实现模型到代码的双向追踪。

HDL代码生成工具可以自动生成testbench用于测试所生成的HDL代码。testbench的输入激励数据恰恰是在Simulink中对算法进行仿真的数据。有效的重用了需求阶段的验证数据。

HDL代码生成工具可以生成用于编译和硬件描述语言在第三方仿真工具下仿真的tcl脚本。这样您可以在ModelSim环境运行这些脚本实现代码的快速编译和仿真。

HDL代码生成工具可以方便的在模型中实现速度和面积的优化。通过环境设置可以在MATLAB环境调用第三方的综合和布局布线工具对所生成的代码进行综合以及布局布线。从产生的报告中获取时延及资源使用信息,并计算且高亮显示Simulink模型中的关键路径。您可以通过添加Pipeline的方法实现速度的优化。同时,也可以通过SharingFactorStreamingFactor设置实现面积优化。在模型中所做的优化不会改变原有算法,可以通过生成验证模型加以验证。

对于一些需要使用MATLAB function模块集成MATLAB函数所实现的算法,可以使用HDLCoder所提供的MATLAB设计模板库进行改写。可以通过如下命令打开这个设计模板库:

>>eml_hdl_design_patterns

HDL代码生成工具可以产生黑盒接口用于集成用户手写HDL代码或IPSimulink模型中通过子系统进行占位并作适当的设置就可以生成模块接口。

可以在MATLAB环境实现联合仿真。将模型中的某个子系统生成硬件描述语言在ModelSimFPGA中仿真或运行,其它部分在Simulink中运行,从而验证模型和所生成代码的等效性。



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多