GVIM与模板——让FPGA开发变得更简单
还在使用FPGA开发环境自带的代码编辑器?还在逐个字母敲击冗长重复的代码?明德扬至简设计法让你快速提高代码编写效率!利用GVIM这一高效的编辑工具并添加自定义模板,通过简短的脚本命令即可自动生成所有常用的逻辑块。
先来说说WIN系统下VIVADO和quartusII绑定GVIM作为默认代码编辑器的方法:
1 VIVADO:IDE上方主菜单栏Tools ->Options ,选择General项,点击Text Editor右侧“...”按钮。在弹出的Custom Editor Definition 下方的Editor空白内填写xxx /gvim.exe [file name] :[line number] 按下OK退出即可。其中xxx为GVIM软件安装路径。



2 quartusII:同样选择菜单栏中Tools ->Options

选择左侧的Preferred Text Editor,1处选中下拉菜单中Vim,并点击2处右侧“...”按钮找到GVIM的安装目录。最后点击OK退回。
在FPGA设计中一个个复杂的模块均由接口定义、信号定义、时序逻辑和组合了逻辑块等部分组成,因此将代码划分成几种类型的模块,以统一的代码风格通过简短的脚本语言调用可以很大程度提高设计效率,实现“填空式”设计!以下是脚本自动生成代码示例,括号中为根据规定格式的参数输入。
1 计数器
计数器是FPGA实现时序的基本单元,比如数据帧处理,串并转换等均要用到。命令模式下输入<:Mdyjsq > (注意<>不用输入,加尖括号只是为了与文字区分开) 按下回车自动生成如下计数器模块,连相关的信号定义也可自动生成。

再次输入同样的命令,会产生另一个计数器模块,同时cnt后编号依次递增,对于需要多个计数器嵌套使用的场合非常实用。
但如果想自定义定义计数器名称怎么办?难道要手动修改么?例如需要对din_vld这一信号进行计数,计10个一循环。命令模式下输入
<:call MDYJSQ("cnt_din","din_vld",10)>,按下回车生成如下代码。

格式为call MDYJSQ("计数器名称","加1条件",计数个数)。该模板加1条件和计数个数是可选参数,但建议输入脚本时添加,这样有助于在编写代码之前,思考好计数器最重要的两个要素:加1条件和计数个数。
2 状态机
较为复杂的时序逻辑中,经常需要状态机与计数器配合使用。如有如下状态转移图:

在命令模式下输入<:call MDYZTJ(3,"IDLE","S1","S2",12,23,31)>,按下回车生成明德扬四段式状态机。

在生成的框架中添加状态转移条件和相应状态输出。命令格式为call MDYZTJ(状态个数,"状态1名称","状态2名称",...,跳转条件1,跳转条件2,...)
3 always逻辑块
在逻辑设计中,最常用的就是always时序逻辑块,其内部通过多个if else语句区分不同的情况。当要产生信号dout逻辑且在两种情况下需要赋予不同的值时,命令模式下输入<:call MDYSHIXU("dout",2)>,按下回车生成如下代码。格式为call MDYSHIXU("信号名称",情况个数)

当然也少不了组合逻辑块,可以很方便地做到连续立即更新信号数值。插入模式下输入<Zuhe> 按下回车:

4 接口与信号定义
除了核心代码外的信号定义和接口定义同样可以快速生成。如数据包处理模块要输入位宽为8bit的数据包。根据至简设计法命名规范,在命令模式下输入
<:call MDYINPUT(“din_sop”,1, “din_eop”,1, “din”,8, “din_vld”,1) > 回车

格式为call MDYINPUT("输入接口信号1名称",信号1位宽,"输入接口信号2名称",信号2位宽) 同理,output,reg类型信号,wire类型信号生成方式和格式与input一致。
有了上述生成代码的脚本命令,对设计人员的帮助不然而喻。接下来通过GVIM工具常用快捷键操作示例,进一步体会什么叫效率!
1.补全命令

在插入模式,输入din_之后按下<ctrl+p>补全命令,可以快速根据当前文件中已有符号进行补全。有多个符号匹配时可自行选择。
2.跳转命令
命令模式下,按下<gg>会跳转到当前文件头,按下<G>跳转到文件尾(再也不用不停地滚动鼠标滚轮了)。
3.搜索命令
命令模式下,在想要找出同样符号位置的符号上按下*键,所有该符号出现位置自动高亮。调试起来很方便。

当要查找一个已知名称符号时,命令模式下输入</xxx> 直接找到所有xxx符号位置。上述两种搜索命令均可使用<n>跳转到下一个高亮位置,<N>跳转到上一位置。
4.删除复制命令
复制N整行:命令模式下,光标在一行头位置输入yy,将光标移到欲粘贴位置上一行任意处,按下p即可在下一行粘贴所复制内容。可在yy前加数字表示要从当前行开始向下复制行数。
5.保存退出
命令模式下,输入<:w xxx.y> 回车为以特定文件名和文件格式保存文件。输入<:wq> 回车保存当前文件退出。
6.替换命令
全文件替换:命令模式下,输入<:%s/xx/yy/gc> 回车把当前文件所有xx可选择替换成yy,逐个按下y确认替换,按下n否定替换。
范围替换:命令模式下,输入<:n,ms/xx/yy/gc>回车把n到m行所有xx可选择替换成yy,以相同方式确认。
如将5到22行clk替换成clk_tx:命令模式下,输入<:5,22s/clk/clk_tx/gc> 回车

灰色为当前待替换位置,按下<y>或<n>逐一确认。

7.列操作模式
在编写testbench时,要例化待测试模块。这是复制待测试模块中以下部分。

a.鼠标选中待删除区域,按下<ctrl+q>进入列选模式。b.按下delete直接删除,之后用tab键在每行前流出空白。c.命令模式下,输入<ctrl+q>进入列操作模式,通过<j><k><h><l>(下 上 左 右)键选择欲编辑区域。d.输入大写字母“I”,再输入想要列插入符号“.”,最后按下Esc键退出完成列插入。以同样方式插入每行后()




合理规范的代码是设计成功关键,通过上述一个个简短便于记忆的脚本命令,可以让设计人员从低级重复性的工作中解脱出来,将时间花在“刀刃”上。从代码搬运工变成专注于功能算法的设计师,让解答题变成填空题,从此开始!
GVIM与模板——让FPGA开发变得更简单的更多相关文章
- spring 第一篇(1-1):让java开发变得更简单(下)
切面(aspects)应用 DI能够让你的软件组件间保持松耦合,而面向切面编程(AOP)能够让你捕获到在整个应用中可重用的组件功能.在软件系统中,AOP通常被定义为提升关注点分离的一个技术.系统由很多 ...
- spring 第一篇(1-1):让java开发变得更简单(下)转
spring 第一篇(1-1):让java开发变得更简单(下) 这个波主虽然只发了几篇,但是写的很好 上面一篇文章写的很好,其中提及到了Spring的jdbcTemplate,templet方式我之前 ...
- spring 第一篇(1-1):让java开发变得更简单(上)
1.释放POJOS能量 传统开发中是如何束缚POJOS呢,如果你开发过java很长时间,那你一定有接触过EJB的开发.那时候开发一个小小的功能都要扩展框架的类或者实现其接口.所以你很容易在早期的Str ...
- .net敏捷开发框架 力软敏捷开发(learun) 让开发变的更简单
版本:6.1.6.2 体验地址:www.fishcmonkey.com 联系QQ:6539471
- .net敏捷开发框架 力软(learun) 让开发变的更简单
版本:6.1.6.2 体验地址:www.fishcmonkey.com 联系QQ:6539471
- 深入解析 Kubebuilder:让编写 CRD 变得更简单
作者 | 刘洋(炎寻) 阿里云高级开发工程师 导读:自定义资源 CRD(Custom Resource Definition)可以扩展 Kubernetes API,掌握 CRD 是成为 Kubern ...
- 快开宝PDA开单器出入库扫码:让批发零售变得更简单
快开宝PDA开单器出现前 批发商户是这样开单和管理的 ★员工痛苦:需要记客户.价格.库存等等,应对报错价.错漏单.盘错货等各种状况. ★老板麻烦:每天要守店.对单.核账,经常因错漏单.库存乱.积压货. ...
- [翻译]Kafka Streams简介: 让流处理变得更简单
Introducing Kafka Streams: Stream Processing Made Simple 这是Jay Kreps在三月写的一篇文章,用来介绍Kafka Streams.当时Ka ...
- Moq让单元测试变得更简单
[ASP.Net MVC3 ]使用Moq让单元测试变得更简单 前几天调查完了unity.现在给我的任务是让我调查Moq. 以下是自己找了资料,总结并实践的内容.如果有表述和理解错误的地方.恳请指正. ...
随机推荐
- spring学习笔记(一) Spring概述
博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书. 强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...
- 提高运维效率(二)桌面显示IP
运维人员远控电脑询问IP时,总要告诉用户找ip的步骤,岂不很烦? 以下方法直观地把ip地址显示在桌面上,再做个入职培训,即可提高运维效率. 1. 下载bginfo.exe软件,放到域控下的netlo ...
- asp.net core 实现一个简单的仓储
一直有自己写个框架的想法,但是一直没有行动起来,最近比较闲,正好可以开工了. 现在已经完成了两部分.1.一个简单仓储,实现使用的是ef 2.IOC部分,这里是把内置的ioc替换成了aotofac,这部 ...
- Java数据结构和算法(四)——栈
前面我们讲解了数组,数组更多的是用来进行数据的存储,纯粹用来存储数据的数据结构,我们期望的是插入.删除和查找性能都比较好.对于无序数组,插入快,但是删除和查找都很慢,为了解决这些问题,后面我们会讲解比 ...
- 如何使用python将MySQL中的查询结果导出为Excel----xlwt的使用
如何在MySQL中执行的一条查询语句结果导出为Excel? 一.可选方法 1.使用sql yog等远程登录,执行查询语句并导出结果集为Excel 适用于较简单的查询结果集的导出 如果需要多个SQL语句 ...
- 一些公司对quantitative的要求
来自日月光华BBS: Company: UBS AG Job Title: Quantitative Developers / Analysts (Entry Level, Multiple Posi ...
- file-loader 使用心得
将webpack 里面的图片文件都放在制定文件夹. 配置如下 { test: /\.png$/, loader: "file-loader?name=imgs/[name]-[hash].[ ...
- mysql 有哪些索引
Mysql支持哪几种索引 从数据结构角度 1.B+树索引(O(log(n))):关于B+树索引,可以参考 MySQL索引背后的数据结构及算法原理 2.hash索引:a 仅仅能满足"=&quo ...
- Nginx动静分离实现
Nginx动静分离实现: Nginx是一种轻量级,高性能,多进程的Web服务器,非常适合作为静态资源的服务器使用,而动态的访问操作可以使用稳定的Apache.Tomcat及IIS等来实现,这里就以Ng ...
- 小tip:生成一组不重复的随机数(去重的方法)
var arr = []; for(var i=0;i<150;i++){ // num为0-100的随机数 var num = Math.round(Math.random()*100); v ...