还在使用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开发变得更简单的更多相关文章

  1. spring 第一篇(1-1):让java开发变得更简单(下)

    切面(aspects)应用 DI能够让你的软件组件间保持松耦合,而面向切面编程(AOP)能够让你捕获到在整个应用中可重用的组件功能.在软件系统中,AOP通常被定义为提升关注点分离的一个技术.系统由很多 ...

  2. spring 第一篇(1-1):让java开发变得更简单(下)转

    spring 第一篇(1-1):让java开发变得更简单(下) 这个波主虽然只发了几篇,但是写的很好 上面一篇文章写的很好,其中提及到了Spring的jdbcTemplate,templet方式我之前 ...

  3. spring 第一篇(1-1):让java开发变得更简单(上)

    1.释放POJOS能量 传统开发中是如何束缚POJOS呢,如果你开发过java很长时间,那你一定有接触过EJB的开发.那时候开发一个小小的功能都要扩展框架的类或者实现其接口.所以你很容易在早期的Str ...

  4. .net敏捷开发框架 力软敏捷开发(learun) 让开发变的更简单

    版本:6.1.6.2 体验地址:www.fishcmonkey.com 联系QQ:6539471

  5. .net敏捷开发框架 力软(learun) 让开发变的更简单

    版本:6.1.6.2 体验地址:www.fishcmonkey.com 联系QQ:6539471

  6. 深入解析 Kubebuilder:让编写 CRD 变得更简单

    作者 | 刘洋(炎寻) 阿里云高级开发工程师 导读:自定义资源 CRD(Custom Resource Definition)可以扩展 Kubernetes API,掌握 CRD 是成为 Kubern ...

  7. 快开宝PDA开单器出入库扫码:让批发零售变得更简单

    快开宝PDA开单器出现前 批发商户是这样开单和管理的 ★员工痛苦:需要记客户.价格.库存等等,应对报错价.错漏单.盘错货等各种状况. ★老板麻烦:每天要守店.对单.核账,经常因错漏单.库存乱.积压货. ...

  8. [翻译]Kafka Streams简介: 让流处理变得更简单

    Introducing Kafka Streams: Stream Processing Made Simple 这是Jay Kreps在三月写的一篇文章,用来介绍Kafka Streams.当时Ka ...

  9. Moq让单元测试变得更简单

    [ASP.Net MVC3 ]使用Moq让单元测试变得更简单 前几天调查完了unity.现在给我的任务是让我调查Moq. 以下是自己找了资料,总结并实践的内容.如果有表述和理解错误的地方.恳请指正. ...

随机推荐

  1. Html5如何自学 只需这几步

    Html5在整个行业卷起了一场大潮流,好多人都,但是很多人都不知道该怎么学习Html5,不知道Html5该如何自学?不知道Html5开发多久才会学会?接下来将从以下几点内容详细讲述. 第一,很多人建议 ...

  2. 一次php涉及跨域功能的麻烦及解决方案

    一,功能及描述 1,在后台管理网站(php)admin.xxx.com(以下简称admin),上拉取并编辑aaa.xxx.com(php,以下简称aaa)上的图片及文件 2,file_get_cont ...

  3. A workaround to change shared memory size for Docker containers in AWS ECS

    Issue Because of not supporting to specify the following docker run parameter, containers in ECS can ...

  4. Python中的单例模式

    在 Python 中,我们可以用多种方法来实现单例模式: 使用模块 使用 __new__ 使用装饰器(decorator) 使用元类(metaclass) # mysingleton.py class ...

  5. oracle中 常用的 join on 相关和 集合运算的总结

    sql常用联合查询的 join on . left join(左连接) . right join (右连接).inner join (等值连接)以及常用的集合运算有:union.unionall.mi ...

  6. MongoDB-Use --auth parameter with connecting error

    When you use mongoDB started as "mongod --dbpath ../../data/db --auth", and you use the ex ...

  7. HTTP协议之URL

    1.什么是URL URL的全称是Uniform Resoure Locator,统一资源定位器.URL是浏览器寻找信息时所需的资源位置.当一个人将浏览器指向一个URL,浏览器就会在幕后发送适当的协议报 ...

  8. 关于APIcloud中的登录与注册的简单实现

    1.apiclou实现页面的登录方式,不适用自带的登录. html代码 <div class="login_ipt_box"> <img class=" ...

  9. C# 在RichTextBox中滚动鼠标时滚动的是父窗口的滚动条

    1. RichTextBox u2 = new RichTextBox(); 2. 先记住日RichTextBox没有显示滚动条时的总宽度和显示宽度 u2.Width - u2.ClientSize. ...

  10. NNSZ OIers' Blog Archive

    HWL:ssttkkl ,已经搬家到这个地址 NINGLONG:NINGLONG 愤鸟先飞: FNXF Syhien:13355936 ,已经搬家到这个地址 IDE:ThetaS TFW:TFX‘s ...