文章来自本人微信公众号“花蚂蚁”,欢迎各位同行和大佬关注交流。
原文点击:小白如何快速入门Verilog?
对于FPGA初学者来说,具备数字电路逻辑基础是必须的,但是首要的是掌握硬件描述语言(VHDL或Verilog HDL),只有掌握了硬件描述语言,才能将“心中”的数字电路知识在硬件上“实现”出来。
小白如果想要学习FPGA或者数字集成电路设计,首先必须要突破Verilog语言关。只有快速掌握Verilog语法才能快速的投入到FPGA的设计中去。但是,初学者不应该花费巨量的时间精力在语法学习上。
我们知道,verilog的语法中有70%是仿真语法,只有30%的语法可用于电路设计(也就是所谓可综合的语法),而且30%的语法中又有许多是低频语法,使用比较少的。
打开一个verilog的工程代码,会看到里面的特高频的语法无非是:wire、reg、assign、always@(...)、赋值(=、<=)、initial、begin...end、if、else、case、运算符(加减乘除与或非等)。
一些不常用的语法可以先不掌握,但是要了解其功能、在以后用到时不确定的可以回头查看工具书进行学习、巩固。
我看过很多FPGA或者Verilog的书,关于Verilog语法方面的讲解往往有几个通病:
- Verilog语法讲解的部分太少,细节讲解不够;
- 混乱:语法和建模甚至FPGA知识穿插着讲,缺少循序渐进的过程,对初学者极不友好;
- 缺乏重点:有的语法极少极少能用到,但却花费大量篇幅去讲解。当然这并不缺点,作为教材或者教科书肯定要做到面面俱到。但对于初学者来说却是不必要的。
那么重点来了,小白如何能够快速上手Verilog呢?
我们知道任何的学习之路是一个模仿、学习、动手、创新、设计,不断迭代的过程。
首先,要对Verilog语法有一定的了解,不要求一定掌握用法,但要做到没吃过猪肉,也要见过猪跑。
我将Verilog的语法进行了总结,写了十三篇文章,让小白“快速见识猪如何跑”,每一篇讲解一类语法,结合正确的示例代码和错误的示例代码,有的章节对个别语法进行了归纳总结,帮助初学者加深理解。
小白们可以每天学习一章,结合下文提供的Verilog经典例程,两周内轻松搞定Verilog语法。
十三篇文章如下:
- Verilog语法之〇:Verilog HDL简介
- Verilog语法之一:简单的Verilog HDL模块
- Verilog语法之二:常量
- Verilog语法之三:变量
- Verilog语法之四:运算符
- Verilog语法之五:标识符与关键字
- Verilog语法之六:阻塞赋值与非阻塞赋值
- Verilog语法之七:begin...end与fork...join
- Verilog语法之八:条件语句
- Verilog语法之九:循环语句
- Verilog语法之十:过程块(initial和always)
- Verilog语法之十一:任务和函数
- Verilog语法之十二:系统函数和任务
- Verilog语法之十三:编译预处理
对语法知识有了初步的了解之后,下一步就应该“模仿”了。
我给小白们准备了一份礼物,下面是我精心整理的n多verilog代码。帮助小白们由浅至深的“模仿”。在模仿的过程中能够进一步的巩固之前了解的语法知识。
这些Verilog例程基本涵盖了以后可能遇到的所有用法,参考这些代码,可以做出你想要的任何设计。
当你想要用Verilog编写一段代码实现某个功能时,如果你能够想到参考哪段代码能够实现你的设计,那么恭喜你,你已经入门了!!!
所有示例代码,点击链接免费获取。
01-锁存器、触发器、寄存器、移位寄存器等
【免费】VerilogHDL示例代码之01-锁存器、触发器、寄存器、移位寄存器等资源-CSDN文库
-> 电平敏感的 1 位数据锁存器 UDP 元件
-> 上升沿触发的 D 触发器 UDP 元件
-> 带异步置 1 和异步清零的上升沿触发的 D 触发器 UDP 元件
-> 基本 D 触发器
-> D触发器——三态控制端8位
-> 带异步清 0、异步置 1 的 D 触发器
-> 带同步清 0、同步置 1 的 D 触发器
-> 带异步清 0、异步置 1 的 JK 触发器
-> JK触发器
-> SR锁存器
-> T触发器
-> 电平敏感的 1 位数据锁存器
-> 带置位和复位端的 1 位数据锁存器
-> 8 位数据锁存器
-> 8 位数据寄存器
-> 8 位移位寄存器
-> 触发器设计实例
-> 电平敏感型锁存器设计实例之一
-> 带置位和复位端的电平敏感型锁存器设计实例
-> 电平敏感型锁存器设计实例之三
-> 移位寄存器设计实例
-> 八位计数器设计实例之一
-> 八位计数器设计实例之二
02-逻辑门、三态门、mux等
【免费】VerilogHDL示例代码之02-逻辑门、三态门、mux等资源-CSDN文库
-> “与-或-非”门电路
-> 与非门——混合结构描述
-> 用 case语句描述的 4选1 数据选择器
-> 持续赋值方式定义的 2选1 多路选择器
-> 阻塞赋值方式定义的 2选1 多路选择器
-> 门级结构描述的 2选1MUX
-> 行为描述的 2选1MUX
-> 数据流描述的 2选1MUX
-> 调用门元件实现的 4选1 MUX
-> 用 case语句描述的 4选1 MUX
-> 数据流方式描述的 4选1 MUX
-> 用条件运算符描述的 4选1 MUX
-> 带使能端的四选一电路
-> 四选一电路多种描述
-> 比较器模块
-> 任务实现比较器
-> 行为描述三输入与门
-> 3选1 多路选择器 UDP 元件
-> 基本门电路的几种描述方法
-> 用 bufif1 关键字描述的三态门
-> 用 assign语句描述的三态门
-> 三态双向驱动器
-> 三态双向驱动器
-> 二输入与非门——结构描述
-> 二输入与非门——行为描述(case语句)
-> 二输入或非门——结构描述
-> 二输入或非门——行为描述(case语句)
-> 二输入异或门——结构描述
-> 二输入异或门——行为描述(case语句)
-> 三态门——描述1
-> 三态门——描述2
-> 8位宽三态门
-> 带方向控制的8位宽三态门
-> 两个加法器和一个选择器的实现方式
-> 两个选择器和一个加法器的实现方式
03-各种计数器
【免费】VerilogHDL示例代码之03-各种计数器资源-CSDN文库
-> 4 位计数器
-> 4位计数器(电平触发)
-> 4位计数器(边沿触发)
-> 4 位计数器的仿真程序
-> 4位计数器——带清零端、置数端和使能端
-> 4位计数器——带清零端、置数端、使能端和计数方向
-> 同步置数、同步清零的计数器
-> 行为描述方式实现的 4 位计数器
-> 4 位 Johnson计数器(异步复位)
-> 十进制模24计数器
-> 模为60 的 BCD码加法计数器
-> 减法计数器
-> 模值可变计数器
-> 可变模加法/减法计数器
04-各类加法器
【免费】VerilogHDL示例代码之04-各类加法器资源-CSDN文库
-> 调用门元件实现的 1 位半加器
-> 数据流方式描述的 1 位半加器
-> 采用行为描述的 1 位半加器
-> 采用行为描述的 1 位半加器
-> 调用门元件实现的 1 位全加器
-> 数据流描述的 1 位全加器
-> 数据流描述的1 位全加器
-> 行为描述的 1 位全加器
-> 混合描述的1 位全加器
-> 1 位全加器进位输出 UDP 元件
-> 包含 x态输入的 1 位全加器进位输出 UDP 元件
-> 用简缩符“?”表述的 1 位全加器进位输出 UDP 元件
-> 结构描述的4 位级连全加器
-> 数据流描述的 4 位全加器
-> 4 位全加器的仿真程序
-> 行为描述的 4 位全加器
-> 4位全加器——通过task和并联四个一位全加器模块实现
-> 4位全加器——通过function和并联四个一位全加器模块实现
-> 8 位全加器
-> 累加器顶层连接文本描述
-> 非流水线方式 8 位全加器
-> 4级流水方式的 8 位全加器
-> 8 位级连加法器
-> 8 位并行加法器
-> 8 位超前进位加法器
-> 减法器-不带借位
-> 减法器-带借位
05-乘法器
【免费】VerilogHDL示例代码之05-乘法器资源-CSDN文库
-> 8 位并行乘法器
-> 4×4查找表乘法器
-> 8 位加法树乘法器
-> while语句乘法器
-> for语句乘法器
-> repeat语句乘法器
-> 乘累加器(MAC)代码
-> 乘累加器的测试代码
06-异步复位同步释放
【免费】VerilogHDL示例代码之06-异步复位同步释放资源-CSDN文库
同步复位异步释放
07-分频
【免费】VerilogHDL示例代码之07-分频资源-CSDN文库
-> 经典2分频
-> 2分频信号、4分频信号、8分频信号
-> 12分频
-> 6分频
-> 7分频
-> 5分频占空比50%
-> 任意计数分频
08-语法语句
【免费】VerilogHDL示例代码之08-语法语句资源-CSDN文库
-> 同位宽操作和扩位操作
-> !、&&、||运算符举例
-> 比较运算符举例
-> 组合逻辑运算举例
-> 与、或、非、异或、同或运算符
-> 移位操作符(放大19倍)
-> 缩位运算符
-> 非阻塞赋值
-> 阻塞赋值
-> 阻塞赋值方式描述的移位寄存器 1
-> 阻塞赋值方式描述的移位寄存器 2
-> 阻塞赋值方式描述的移位寄存器 3
-> 非阻塞赋值方式描述的移位寄存器
-> 用 always过程语句描述的简单算术逻辑单元
-> 用 initial过程语句对测试变量 A、B、C赋值
-> 用 begin-end 串行块产生信号波形
-> 用 fork-join 并行块产生信号波形
-> case语句
-> case语句(优先编码)
-> 用 casez 描述的数据选择器
-> 隐含锁存器举例
-> 用 for语句描述的七人投票表决器
-> 用 for语句实现2 个 8 位数相乘
-> 用 repeat实现8 位二进制数的乘法
-> 同一循环的不同实现方式
-> 用 if-else语句描述的 4选1 MUX
-> 用 case语句描述的 4选1 MUX
-> 位置映射法调用比较器子模块
-> 信号映射法调用比较器子模块
-> parameter参数化调用
-> 通过defparam 参数指定例化模块的内部参数
-> 用`include 描述的累加器
-> 使用了`include语句的 16 位加法器
-> `ifdef条件编译举例
-> define语句
-> task任务举例
-> task测试程序
-> function函数
-> 4位全加器——通过task和并联四个一位全加器模块实现
-> 4位全加器——通过function和并联四个一位全加器模块实现
-> 用函数和 case语句描述的编码器(不含优先顺序)
-> 阶乘运算函数
-> 测试程序
-> 顺序执行模块1
-> 顺序执行模块2
-> 并行执行模块1
-> 并行执行模块2
-> 加法计数器中的进程
-> $time 与$realtime 的区别
-> $random 函数的使用
09-串并转换
【免费】VerilogHDL示例代码之09-串并转换资源-CSDN文库
-> 4 位串并转换器
-> 串行输入串行输出
-> 串行输入并行输出
-> 并行输入串行输出
-> 串并转换——左移位和右移位实现
-> 并行数据流转换为一种特殊串行数据流模块的设计
-> 通过模块实例调用实现大型的设计
10-状态机设计
【免费】VerilogHDL示例代码之10-状态机设计资源-CSDN文库
-> 状态机设计的例子
-> 自动售卖机状态机
-> 自动售卖机状态机测试代码
-> 一个简单的状态机设计--序列检测器
-> 利用状态机实现比较复杂的接口设计
11-编解码应用
【免费】VerilogHDL示例代码之11-编解码应用资源-CSDN文库
-> BCD码— 七段数码管显示译码器
-> 8-3编码器(case语句)
-> 8-3编码器(优先编码)
-> 3-8编码器
-> 3-8译码器
-> 8-3优先编码器
-> 用函数定义的 8-3优先编码器
-> 七段数码管译码器
-> 奇偶校验位产生器
-> (7,4)线性分组码编码器
-> (7,4)线性分组码译码器
-> (7,4)循环码编码器
-> (7,4)循环码纠错译码器
-> CRC编码
12-仿真语法举例
【免费】VerilogHDL示例代码之12-仿真语法举例资源-CSDN文库
-> 延迟定义块举例
-> 激励波形的描述
-> 用 always过程块产生两个时钟信号
-> 存储器在仿真程序中的应用
-> 8 位乘法器的仿真程序
-> 8 位加法器的仿真程序
-> 2选1 多路选择器的仿真
-> 8 位计数器的仿真
13-进阶设计
【免费】VerilogHDL示例代码之13-进阶设计资源-CSDN文库
-> 顺序脉冲发生器
-> 序列信号发生器
-> 用组合电路实现的 ROM
-> 256×8 RAM 模块
-> 256×16 RAM 块
-> 用函数实现简单的处理器
-> 微处理器的测试代码
-> 自动转换量程频率计控制器
-> 长帧同步时钟的产生
-> 引入了 D 触发器的长帧同步时钟的产生
-> 数字跑表
-> 4 位数字频率计控制模块
-> 4 位数字频率计计数子模块
-> 频率计锁存器模块
-> 交通灯控制器
-> “梁祝”乐曲演奏电路
-> 自动售饮料机
-> 多功能数字钟
-> 电话计费器程序
-> 11阶FIR 数字滤波器
-> 16 位高速数字相关器
-> ROM操作
-> RAM操作
-> I2C—EEPROM控制器
-> 数据栈操作——LIFO(后进先出)
-> 同步FIFO代码一
-> 同步FIFO代码二
-> 同步FIFO代码二测试代码
-> LED流水灯操作
-> 4X4键盘矩阵与7段数码管
-> 数字频率计
-> 乒乓游戏机
-> 交通控制器
-> 数字钟一
-> 数字时钟二
-> 自动售货机
-> 出租车计费器
-> 电梯控制器
-> 利用SRAM设计一个FIFO
-> 简单卷积器的设计
-> LCD1602字符显示设计
-> 简易电子时钟设计
-> 简易计算器设计
-> 模数转换器AD7886仿真模型(虚拟模块)的设计:
-> “商业化”的虚拟模块之一:INTEL USART 8251A (通用串行异步收发器芯片)
-> “商业化”的虚拟模块之二: INTEL 8085A 微处理器的行为描述模块
-> 设计一个8位数字显示的简易频率计
-> 设计一个11位巴克码序列峰值检测器,巴克码序列为11`B11100010010
-> 设计一个1MHZ的FIR低通滤波器