Verilog入门与进阶

1 从VHDL开始

我在刚开始进行FPGA开发时,使用的是VHDL语言,简单学习了一下语法就开始编码了,那时真是无知者无畏,因为之前有开发单片机的经历,就像写c语言一样来写VHDL,不太明白代码什么意思,就那么模仿着别人的代码进行开发,就这样也完成了几个小项目,现在如果看那时的代码真是惨不忍睹。虽然如此,这一时期还是有很多收获,学会编写测试平台,掌握了仿真的方法,这也是开发FPGA的基本功。单位组织参加过两个付费的FPGA培训,当时虽然听不太懂,但对FPGA有了更深入的认识,之后慢慢消化了培训资料,在FPGA时序分析、设计技巧方面有很大进步。下面进入正题,换了工作之后,要求切换语言从VHDL换成Verilog,下面把Verilog学习过程和大家分享一下,分为入门和进阶两部分。

2 Verilog入门

Verilog语法相比VHDL更简单,可综合的语法加起来用不了一页纸。虽然如此,要想真正掌握还是要下一番功夫。为了避免象学习VHDL一样,一直处于业余状态。我决心要系统学习Verilog,经过一番搜索,下选择了如下两本书。

在这里插入图片描述

《Verilog HDL入门(第3版)》这本书我觉很适合初学者,可以作为学习Verilog的第一本书,书中对Verilog语言进行了详细讲解,将Verilog设计分成数据流建模、行为级建模和结构建模。我当时一边看书一边做笔记,把书中的练习题也做了,感觉很有收获。

《Verilog数字系统设计教程》夏宇闻老师这本书大家应该比较熟悉了,这是我读的第二本Verilog书,同样推荐给大家。看完第一本后,再看这一本,读起来并不困难,既能巩固之前学到的知识,又有新的内容。尤其是关于阻塞与非阻塞的描述,一直指导着我之后的编码,相信读过这本书的朋友也是一样的情况。

学习完上面两本书,我感觉Verilog基本入门了,接下来就要靠大量的实践来提高了。

3 Verilog进阶

在入门的基础上如何进行提高呢,这时我想到了参加培训时一个老师推荐的书《数字设计原理与实践》,当时参加完培训我就买了这本书,翻了翻就扔一边了,看不进去。刚开始看《Altera FPGA/CPLD设计(基础)》、《Altera FPGA/CPLD设计(高级)》也是一样感觉,不知道在说什么。重新把这本书拿出来,仔细阅读有了跟之前完全不同的感受。当时老师推荐这个书时就说,如果你没有什么数字电路的基础,可以好好阅读这个书。学习FPGA,只会Verilog是不行的,要对数字电路有更深入的理解,就像我们常说的Verilog与其它软件语言的不同,每一句都对应着硬件电路。这本书目前出到了第五版,第五版相比第四版有了很多改变,去掉了VHDL语言的部分,全部使用Verilog。第五版目前只有英文版,第四版有中文版,推荐大家看第四版。
在这里插入图片描述

《Verilog HDL高级数字设计》最后推荐的也是最重量级的,如果只推荐一本书,那么我推荐这本。这本书教会我怎么使用状态机。我们工作中经常也遇到这样的情况,要实现某一功能,先用文字进行描述,接下来将文字变换成书中教的ASMD(算法状态机与数据通路)。ASMD将数字通路与控制器分离,同时将它们之间的联系呈现出来。完成ASMD图之后,代码也就出来了,我使用这种方法完成很多项目。

在这里插入图片描述

4 如何更进一步

看完上面的四本书之后,我也在寻找进一步提高编程能力的方法,渐渐的我发现,要继续提高,就要深入某个领域,比如图像方向、信号处理方向、高速接口或者AI推理,verilog或者说fpga仅仅是一个工具。这也是fpga工程师面临的一个困境,我相信很多fpga工程师到一定阶段都会遇到,如何破局呢?欢迎大家留言讨论。

需要下载电子版书籍的朋友关注 硬码农二毛哥 公众号,回复3,下载电子书,下图中后两本书都只有第三版。
在这里插入图片描述

对zynq7000,zynqmpsoc器件和AI推理感兴趣的朋友,欢迎关注我的公众号 硬码农二毛哥 一起学习交流
在这里插入图片描述

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
目 录 译者序 前言 第1章 简介 1 1.1 什么是Verilog HDL? 1 1.2 历史 1 1.3 主要能力 1 第2章 HDL指南 4 2.1 模块 4 2.2 时延 5 2.3 数据流描述方式 5 2.4 行为描述方式 6 2.5 结构化描述形式 8 2.6 混合设计描述方式 9 2.7 设计模拟 10 第3章 Verilog语言要素 14 3.1 标识符 14 3.2 注释 14 3.3 格式 14 3.4 系统任务和函数 15 3.5 编译指令 15 3.5.1 `define和`undef 15 3.5.2 `ifdef、`else 和`endif 16 3.5.3 `default_nettype 16 3.5.4 `include 16 3.5.5 `resetall 16 3.5.6 `timescale 16 3.5.7 `unconnected_drive和 `nounconnected_drive 18 3.5.8 `celldefine 和 `endcelldefine 18 3.6 值集合 18 3.6.1 整型数 18 3.6.2 实数 19 3.6.3 字符串 20 3.7 数据类型 20 3.7.1 线网类型 20 3.7.2 未说明的线网 23 3.7.3 向量和标量线网 23 3.7.4 寄存器类型 23 3.8 参数 26 第4章 表达式 28 4.1 操作数 28 4.1.1 常数 28 4.1.2 参数 29 4.1.3 线网 29 4.1.4 寄存器 29 4.1.5 位选择 29 4.1.6 部分选择 29 4.1.7 存储器单元 30 4.1.8 函数调用 30 4.2 操作符 30 4.2.1 算术操作符 31 4.2.2 关系操作符 33 4.2.3 相等关系操作符 33 4.2.4 逻辑操作符 34 4.2.5 按位操作符 35 4.2.6 归约操作符 36 4.2.7 移位操作符 36 4.2.8 条件操作符 37 4.2.9 连接和复制操作 37 4.3 表达式种类 38 第5章 门电平模型化 39 5.1 内置基本门 39 5.2 多输入门 39 5.3 多输出门 41 5.4 三态门 41 5.5 上拉、下拉电阻 42 5.6 MOS开关 42 5.7 双向开关 44 5.8 门时延 44 5.9 实例数组 45 5.10 隐式线网 45 5.11 简单示例 46 5.12 2-4解码器举例 46 5.13 主从触发器举例 47 5.14 奇偶电路 47 第6章 用户定义的原语 49 6.1 UDP的定义 49 6.2 组合电路UDP 49 6.3 时序电路UDP 50 6.3.1 初始化状态寄存器 50 6.3.2 电平触发的时序电路UDP 50 6.3.3 边沿触发的时序电路UDP 51 6.3.4 边沿触发和电平触发的混合行为 51 6.4 另一实例 52 6.5 表项汇总 52 第7章 数据流模型化 54 7.1 连续赋值语句 54 7.2 举例 55 7.3 线网说明赋值 55 7.4 时延 55 7.5 线网时延 57 7.6 举例 57 7.6.1 主从触发器 57 7.6.2 数值比较器 58 第8章 行为建模 59 8.1 过程结构 59 8.1.1 initial 语句 59 8.1.2 always语句 61 8.1.3 两类语句在模块中的使用 62 8.2 时序控制 63 8.2.1 时延控制 63 8.2.2 事件控制 64 8.3 语句块 65 8.3.1 顺序语句块 66 8.3.2 并行语句块 67 8.4 过程性赋值 68 8.4.1 语句内部时延 69 8.4.2 阻塞性过程赋值 70 8.4.3 非阻塞性过程赋值 71 8.4.4 连续赋值与过程赋值的比较 72 8.5 if 语句 73 8.6 case语句 74 8.7 循环语句 76 8.7.1 forever 循环语句 76 8.7.2 repeat 循环语句 76 8.7.3 while 循环语句 77 8.7.4 for 循环语句 77 8.8 过程性连续赋值 78 8.8.1 赋值—重新赋值 78 8.8.2 force与release 79 8.9 握手协议实例 80 第9章 结构建模 83 9.1 模块 83 9.2 端口 83 9.3 模块实例语句 83 9.3.1 悬空端口 84 9.3.2 不同的端口长度 85 9.3.3 模块参数值 85 9.4 外部端口 87 9.5 举例 89 第10章 其他论题 91 10.1 任务 91 10.1.1 任务定义 91 10.1.2 任务调用 92 10.2 函数 93 10.2.1 函数说明部分 93 10.2.2 函数调用 94 10.3 系统任务和系统函数 95 10.3.1 显示任务 95 10.3.2 文件输入/输出任务 97 10.3.3 时间标度任务 99 10.3.4 模拟控制任务 99 10.3.5 定时校验任务 100 10.3.6 模拟时间函数 101 10.3.7 变换函数 102 10.3.8 概率分布函数 102 10.4 禁止语句 103 10.5 命名事件 104 10.6 结构描述方式和行为描述方式的 混合使用 106 10.7 层次路径名 107 10.8 共享任务和函数 108 10.9 值变转储文件 110 10.9.1 举例 111 10.9.2 VCD文件格式 112 10.10 指定程序块 113 10.11 强度 114 10.11.1 驱动强度 114 10.11.2 电荷强度 115 10.12 竞争状态 116 第11章 验证 118 11.1 编写测试验证程序 118 11.2 波形产生 118 11.2.1 值序列 118 11.2.2 重复模式 119 11.3 测试验证程序实例 123 11.3.1 解码器 123 11.3.2 触发器 124 11.4 从文本文件中读取向量 126 11.5 向文本文件中写入向量 127 11.6 其他实例 128 11.6.1 时钟分频器 128 11.6.2 阶乘设计 130 11.6.3 时序检测器 132 第12章 建模实例 136 12.1 简单元件建模 136 12.2 建模的不同方式 138 12.3 时延建模 139 12.4 条件操作建模 141 12.5 同步时序逻辑建模 142 12.6 通用移位寄存器 145 12.7 状态机建模 145 12.8 交互状态机 147 12.9 Moore有限状态机建模 150 12.10 Mealy型有限状态机建模 151 12.11 简化的21点程序 153 附录 语法参考 157 参考文献 172

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硬码农二毛哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值