无论是学IC设计还是FPGA开发,Verilog都是最基本、最重要的必备技能。但任何一门编程语言的掌握都需要长期学习。并不是简简单单的随便读几本书,随便动动脑筋那么简单。Verilog是一门基于硬件的独特语言,由于它最终所实现的数字电路,具备着硬件与生俱来的并行性,所以Verilog的设计思想与思维方式和绝大多数基于软件的编程语言截然不同。
什么是Verilog?
Verilog HDL(简称 Verilog )是一种硬件描述语言,用于数字电路的系统设计。可对算法级、门级、开关级等多种抽象设计层次进行建模。
Verilog 继承了 C 语言的多种操作符和结构,与另一种硬件描述语言 VHDL 相比,语法不是很严格,代码更加简洁,更容易上手。
Verilog 不仅定义了语法,还对语法结构都定义了清晰的仿真语义。因此,Verilog 编写的数字模型就能够使用 Verilog 仿真器进行验证。
Verilog的用途
Verilog的主要应用包括:
– ASIC和FPGA工程师编写可综合的RTL代码
– 高抽象级系统仿真进行系统结构开发
– 测试工程师用于编写各种层次的测试程序
– 用于ASIC和FPGA单元或更高层次的模块的模型开发
学习VerilogHDL之前必须学习数字电路相关的知识。比如数字逻辑、微机原理(硬件)、电路分析、模拟电路(初级)这些。后续学一点数字信号处理的课程是有益的补充。再往前的基础就到高中的电学知识了。
在Verilog编程中需要注意以下几点:
所有的Verilog程序都以Module(模块、组件)的方式存在,一个简单的逻辑可以由一个Module组成,复杂的逻辑可以包含多个Modules,每个Module有独立的功能,并由输入、输出端口被其它module调用。通过Module的方式可以将一些比较独立、可以复用的功能进行模块化,代码阅读起来也比较直观;
Verilog的信号分为wire和register两种类型,wire可以看成直接的连接,而register具有对某一个时间点状态进行保持的功能,因此在设计逻辑的时候要明确定义每个信号是wire还是reg属性;
并行执行:Verilog描述的主要是硬件而不是软件,因此也就意味着其描述的各个功能之间可以并行执行,比如在你的设计中你有3个计数器,每一个计数器都连接到不同的时钟上,这是没有问题的,每一个时钟都干自己的事。不像MCU,只有一个线程按照顺序执行。
基础Verilog语法
Verilog语法比较多,但我们常用的也就那么几种,简单在此罗列一下。
(1)module(建议一个.v文件只写一个module)
module “.v文件名”(
“port”
);
“用户Verilog程序”
endmodule
module模块,从软件思想上,可以理解为函数,顶层文件module就是主函数,其他文件module就是被主函数调用的函数。从硬件思想上,可以理解为电路板,顶层文件为电路主板,其他文件是从板,module中的“port”就是主从板之间的跳针。
(2)Port定义
Port有三种类型,input、output、inout。很好理解,input就是外部进入module的信号,output就是module输出到外部的信号,inout表示这个端口既能接收外部信号,也能向外部发出信号。
Port在module中的定义有多种,我们在这里只介绍一种。
(3)内部变量声明
Verilog内部变量有两种:wire型和reg型。
其中wire型变量可以理解成电路板中的布线,reg型变量可以理解成电路板中的电阻元件或者电容元件等。
(4)assign语句
assign语句可以给wire型变量赋值。
例如:
wire out ;
reg in ;
assign out = 0; ///assign out = in;
上面语句表示给out变量接地,//这一行后面的东西都表示注释,表示将寄存器in的值赋值给out变量。
(5)always语句
always语句经常给reg型变量赋值,内部经常有if语句和case语句,我觉得可以理解成一块电路板上的芯片元件。
out_reg为reg型变量,这个always模块可以理解成一个6bit的加法器。上述语句的总体意思为:在osc_clk这个信号上升沿的时候进行判定,若rst_n = 0,则out_reg = 0;否则,out_reg = in1 + in2。
其实always语句里还有涉及到阻塞性赋值和非阻塞性赋值的问题,这里我建议新手只要遇到always,就尽可能使用非阻塞性赋值(<=)。
(6)if语句与case语句
这两个语句比较简单,相信看过c代码的人都了解,我就不再一一讲述。
Verilog学习的过程
学习的过程,每个人都不太相同。首先是软件的使用,比如QuartusII的使用应该放在所有的学习之前(学过数字电路的同学,如果没有学过的话,先把一些基本概念学一下,在学习到《数字逻辑基础与VERILOG设计》的时候开始用原理图设计的方法学习使用该软件),然后就是学习Verilog了,建议在学习的过程中把书中的例子都用软件做一次,也利用Quartus提供的仿真功能进行仿真。
基本的语法知识学习的同时,书上很多仿真的例子在Quartus里面并不能实行,这个时候就需要学习使用ModelSim了。进一步学习Verilog的高级编程知识,利用软件多做一些例子程序。
书看的差不多的时候,就可以到板子上编一些实际的应用程序了。参考电路板上的硬件,针对不同的部件进行编程和验证。
然后就是根据自己的兴趣爱好和专业方向,找一个题目用Verilog去实现,这个过程中需要学习更多其他方面的知识,这样才能做成真正的应用系统。
这个时候可能手上的CPLD的资源可能就不那么够了,也许就该用FPGA来做了。此外FPGA和CPLD还是有区别的,两个器件应用的场合有所不同,这个在学习的过程中也要逐步积累这些知识和经验。此外,还可以学习一些SOC方面的知识,这里不仅仅是指的Nios II。
需要注意的是学习是一辈子的事情,不是花上那么几个月你就能把所有的技能学到手,更多的时候是通过实践不断提升自己的能力。
想要获取更多学习资料,可以私信留言。学习之路上,IC修真院与你同行!