FPGA编辑神器(gvim)

2 篇文章 0 订阅

前言

  • 代码的整洁是十分重要的,尤其是对齐方面。有些人写的代码就非常美观,规范,有些人就写不尽人意了,有人就会说想要写出整齐美观规范的代码是需要花费很多时间的吧,而且还很繁琐,所以为了省事,就写的很“随意”,这种“随意的代码”自己看看还行,但是在公司里,都是团队合作,你的代码不单单要自己看着舒服,也要别人看着舒服,所以每个公司都有自己的代码规范,但都大同小异。下面将介绍一种在FPGA领域最常用的代码编辑工具-----gvim,大部分公司都是用这个软件的,毕竟开源,而且使用起来非常灵活,可以自己定义各种骚操作~

为什么要使用gvim

  • 工欲善其事,必先利其器,做为一名FPGA或者数字芯片设计人员,gvim就是我们编写代码的神器,掌握vim是十分必要的,使用vim来编写RTL代码会极大提高我们的效率,通过一些模板和规则的制作,vim也会让我们的代码看起来更加完美漂亮,尤其是对齐方面。

  • 我接触vim也有段时间了,对vim也比较熟悉,这里我要推荐一本关于vim的书籍----《vim的实用技巧》。看完这本书,我对vim有了新的认识,也学了很多,以前总是想着制作快捷键和模板,却对vim自带的一些强大功能一无所知,真是惭愧。多掌握vim自带的一些功能,这样就可以随便在哪都可以用的顺手。

  • 对于新手来说,刚开始使用gvim会有点吃力,各种不熟悉,这个是正常现象,要有一定的耐心哦,后面会越用越顺手的。文章的最后我会给出我配置好的gvim,下载后可以直接使用。

  • 下面我将会介绍一些vim自带的核心功能,

gvim技巧

  1. 点范式: “.”命令可以让我们重复上次的修改,它是Vim中最为强大的多面手。那么何为修改?从进入插入模式的那一刻起(例如,输入i),直到返回普通模式时为止(输入),这期间做出的改变称为一次修改。vim会记录其每一个动作,做出这样一个修改后再用.命令的话,它就会重新执行这些按键操作。
    核心思想就是:执行、重复、回退;一键移动,另一键执行
  2. 把撤销单元切成块。i{insert some text}是一次修改,u键会触发撤销命令。
  3. 双剑合璧,天下无敌。 操作符 + 动作命令 = 操作。 如:d{motion}。
    操作符如下:
命令用途
c修改
d删除
y复制
g~反转大小写
gu转化为小写
gU转化为大写
>增加缩进
<减小缩进
=自动缩进
动作用途
aw一个单词
ap一段
l一个字符
  1. 重新映射大小写转换键(根据自己习惯)
  2. 区分实际行和屏幕行(jk命令会工具实际行移动,gj,gk则按照屏幕行移动。)
  3. 单词和字符串;w单词,W字符串。单词由字母、数字、下划线组成,字符串则有非空白字符序列组成。
  4. 分隔符文本对象
  5. 分隔符文本对象
命令用途
vi}{}内部
vi)()内部
vi][]内部
vi"""内部
va}一对花括号
va)一对圆括号
va]一对[]
va"一对""
  1. 范围文本对象
命令用途
iw当前单词
aw当前单词及 空格
iW当前字符串
aW当前字符串及 空格
is当前一个句子
as当前一个句子及 空格
ip当前段落
ap当前段落及 空格
  1. 位置标记
    m{a-zA-Z}标记当前位置,’{mark}跳到位置标记处
  2. 在匹配括号间跳转 %
  3. 寄存器
  • 无名寄存器(""): x,s,d{motion},c{motion},y{motion}命令都会覆盖无名寄存器中的内容。
  • 复制专用寄存器("0):当使用y{motion}是,要复制的文本会同时拷贝到无名寄存器和复制专用寄存器中。
  • 有名寄存器("a-"z)
  • 系统剪贴板("+),选择专用寄存器("*):如果想从vim复制文本到外部程序(反之亦然),则必须使用系统剪贴板。
  • 在可视模式下使用p命令时,会先从无名寄存器中取出内容,然后在把高亮的内容存到无名寄存器中。
  • p命令粘贴到光标后,P命令则是粘贴到光标前。
  1. 利用宏来制作模板
  • q键既是“录制”按钮,也是“停止”按钮。为了录制我们的按键操作,一开始需要按q{register},从而指定一个用于保存宏的寄存器。当状态栏中出现“记录中”时,表示录制已经开始。此后,我们执行的每一条命令都被宏捕获,直到再次按下q键停止为止。
  • 将宏粘贴到文档中,(:put a)
  • 编辑完宏后,0"ay$dd
  • 将我们录制好的宏粘贴到_vimrc中即可。
  1. 给列表编号
    在配置大量寄存器的时候,是需要输入一些编号的,一个一个的输入会比较繁琐,使用gvim的“迭代求值方法”就会简单很多
//需要在[]内一次输入编号(0-19),手动输入会比较繁琐,更何况有些场景(0v5640寄存器的配置,有304个寄存器,要是都手动输入会比较麻烦)
assign  cfg_array[]  =       {8'h78, 16'h3103, 8'h11};
assign  cfg_array[]  =       {8'h78, 16'h3008, 8'h82};
assign  cfg_array[]  =       {8'h78, 16'h3008, 8'h42};
assign  cfg_array[]  =       {8'h78, 16'h3103, 8'h03};
assign  cfg_array[]  =       {8'h78, 16'h3017, 8'hff};
assign  cfg_array[]  =       {8'h78, 16'h3018, 8'hff};
assign  cfg_array[]  =       {8'h78, 16'h3034, 8'h1A};
assign  cfg_array[]  =       {8'h78, 16'h3037, 8'h13};       
assign  cfg_array[]  =       {8'h78, 16'h3108, 8'h01};      
assign  cfg_array[]  =       {8'h78, 16'h3630, 8'h36};
assign  cfg_array[]  =       {8'h78, 16'h3631, 8'h0e};
assign  cfg_array[]  =       {8'h78, 16'h3632, 8'he2};
assign  cfg_array[]  =       {8'h78, 16'h3633, 8'h12};
assign  cfg_array[]  =       {8'h78, 16'h3621, 8'he0};
assign  cfg_array[]  =       {8'h78, 16'h3704, 8'ha0};
assign  cfg_array[]  =       {8'h78, 16'h3703, 8'h5a};
assign  cfg_array[]  =       {8'h78, 16'h3715, 8'h78};
assign  cfg_array[]  =       {8'h78, 16'h3717, 8'h01};
assign  cfg_array[]  =       {8'h78, 16'h370b, 8'h60};
assign  cfg_array[]  =       {8'h78, 16'h3705, 8'h1a};

下面介绍“迭代法求值”

  • :let i=0 使i=0
  • qa 开启录制宏
  • 0f[a<ctrl + r>=i 在[]中插入i的值
  • 回车后ESC
  • :let i+=1 使i递增
  • 回车后按q 退出录制
  • jVG 选择其余所有行
  • : 进入命令模式
  • normal @a 回放之前录制好的宏即可
  • 其实目的就是先录制一段宏,然后是变量i累加,最后再其余的行播放这个宏即可。
    ----------------------------敲黑板-------------------------------

已配置好的gvim命令说明

以下是我自己配置的一些命令,下载我的gvim后就可以直接使用。
在插入模式下输入相应的命令后,再回车(或者空格)即可

命令用途
F2功能键插入文件头
Modulemodule模板
Definedefine模板
Codecode注释模板,用来分隔变量和代码,使整个代码布局更加合理
ii
qq列块模式
pp补全命令
hh插入模式下左移
jj插入模式下下移
kk插入模式下上移
ll插入模式下右移
inputinput对齐模板 (输入完毕按空格即可)
output8output对齐模板,最后的数字取值范围是[0,32],默认为wire型的。(输入完毕按空格即可)
outputreg8output对齐模板,最后的数字取值范围是[0,32]。(输入完毕按空格即可)
reg8reg模板,最后的数字取值范围是[0,32]。(输入完毕按空格即可)
wire8wire模板,最后的数字取值范围是[0,32]。 (输入完毕按空格即可)
Shixu时序逻辑代码模板,默认带2个else if
Shixu1时序逻辑代码模板,带一个else if
Zh组合逻辑代码模板
Jsq计数器代码模板
Jsq22层计数器模板
Jsq33层计数器模板
Ztj3段式状态机模板
F10功能键例化
F7功能键调整例化后的格式
=ap在普通模式下输入=ap,可以调整该段代码的自动缩进

对于已保存的文件,可以使用下面的方法进行空格和TAB的替换

TAB替换为空格:
:set ts=4
:set expandtab
:%retab!

空格替换为TAB:
:set ts=4
:set noexpandtab
:%retab!

set ts=4
set softtabstop=4
set shiftwidth=4
set expandtab
set autoindent

ts是tabstop的缩写,设TAB宽度为4个空格。
 softtabstop 表示在编辑模式的时候按退格键的时候退回缩进的长度,当使用 expandtab 时特别有用。
 shiftwidth 表示每一级缩进的长度,一般设置成跟 softtabstop 一样。
 expandtab表示缩进用空格来表示,noexpandtab 则是用制表符表示一个缩进。
 autoindent自动缩进

福利

为了能及时回复大家,现在获取源码方式如下:
微信扫描下面的二维码关注【春哥笔记】公众号,回复"gvim"即可Get源码的获取方式:
在公众号中有视频演示操作哦~
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值