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. 以下是自己找了资料,总结并实践的内容.如果有表述和理解错误的地方.恳请指正. ...
随机推荐
- wamp环境下如何安装redis扩展
Redis安装 wamp环境安装redis扩展 首先在自己本地项目中phpinfo(); 查看php版本; (php版本是5.5, ts-vcll表示MSVC11 (Visual C++ 2012), ...
- memcached一致性哈希及php客户端实现
1.memcached分布式算法 memcached的分布式是依靠客户端的算法来实现,假设键名为$key,服务器数量为N,常规的实现方式有两种: 取模哈希 crc32($key)%N,通过这个算法将键 ...
- Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)
目录 SignalR系列目录(注意,是ASP.NET的目录.不是Core的) 前言 一晃一个月又过去了,上个月有个比较大的项目要验收上线.所以忙的脚不沾地.现在终于可以忙里偷闲,写一篇关于Signal ...
- iOS 超大高清图展示策略 TileLayer 及 levelsOfDetailBias 分析
本次分析针对当下流行的中国地图图片处理,1亿像素,就是下面这张: 原图尺寸:11935x8554 文件大小:22.1MB 原始加载方式 首先,我们尝试一下直接加载的方式,看看效果会有多恐怖 效果请看下 ...
- Android Weekly Notes Issue #286
December 3rd, 2017 Android Weekly Issue #286 本期文章包含如何通过踩坑来学习Kotlin,以及利用Kotlin的data class做MVVM状态保存,还包 ...
- 数据库服务器---Qps
QPS(Query Per Second)意思为"每秒查询率",是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准.同时也代表一种计算 ...
- webrtc视频数据解码处理流程
- Linux多线程编程——线程的同步
POSIX信号量 posix信号量不同于IPC中的信号量 常用的posix信号量函数 #include <semaphore.h> int sem_init(sem_t* sem,i ...
- C++ stack
stack 栈,一种后进先出的数据结构,在c++ stl里作为容器适配器,string,vector,deque,在内存中是连续的 声明方式 stack<int,deque<T>&g ...
- python爬虫(四)_urllib2库的基本使用
本篇我们将开始学习如何进行网页抓取,更多内容请参考:python学习指南 urllib2库的基本使用 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地.在Python中有很 ...