Verilog入门
Verilog入门
前言
最原始的,或许就是最有效的,一些缩写的全称或许是入门的关键。比如xswl
(笑死我了)、xmsl
(羡慕死了)等。
名词解释
Verilog
什么是Verilog
?遇事蒙圈,上网浏览!
wikipedia
:Verilog是一种用于描述、设计电子系统(特别是数字电路)的硬件描述语言,主要用于在集成电路设计,特别是超大规模集成电路的计算机辅助设计。Verilog是电气电子工程师学会(IEEE)的1364号标准。
Verilog
全称是Verilog Hardware Description Language
(Verilog
硬件描述语言),缩写Verilog HDL
,简称Verilog
总之,就是用来描述硬件——描述电路的一种语言,从前,CPU的设计是许多个工程师在纸上绘制的电路图,现在我们可以用变成语言来实现了。
VHDL
那么上图中提到的VHDL
是什么呢?全称是Very-High-Speed Integerated Circuit Hardware Description Language
,这里千万不要以为Verilog HDL
和VHDL
是一样的东西噢!
FPGA
wikipedia
:现场可编程逻辑门阵列(英语:Field Programmable Gate Array,缩写为FPGA),它以PAL、GAL、CPLD等可编程逻辑器件为技术基础发展而成。作为专用集成电路中的一种半客制电路,它既弥补完全客制电路不足,又克服原有可编程逻辑组件门电路数有限的缺点。
EDA
wikipedia
:电子设计自动化(英语:Electronic design automation,缩写:EDA)是指利用计算机辅助设计(CAD)软件,来完成超大规模集成电路(VLSI)芯片的功能设计、综合、验证、物理设计(包括布局、布线、版图、设计规则检查等)等流程的设计方式。
思考1:思考硬件描述语言设计方法的优缺点
语法入门
Hello World
语言入门是不是都会从Hello World
开始emmm
coding_1.0
1 | module helloworld(); |
看起来是不是比C
还简洁?!接下来我们来探究一下其中的秘密……
基本概念
关键字
关键字 含义 module 模块开始定义 input 输入端口定义 output 输出端口定义 inout 双向端口定义 parameter 信号的参数定义 wire wire信号定义 reg reg信号定义 always 产生reg信号语句的关键字 assign 产生wire信号语句的关键字 begin 语句的起始标志 end 语句的结束标志 posedge/negedge 时序电路的标志 case Case语句起始标记 default Case语句的默认分支标志 endcase Case语句结束标记 if if/else语句标记 else if/else语句标记 for for语句标记 endmodule 模块结束定义 模块结构:
1
2
3
4
5
6
7module 模块名(a,b,c,d);
input a,b;
output c,d;
endmodule
//与下面等同
module 模块名(input a,input b,output c,output d);
endmodule
结合上面的代码进行说明:
1 | module helloworld(); //定义模块,及模块的名字 |
为了让一个程序能够学到更多的东西,我们可以把上面的hello world
程序修改的更加细致一些:
coding_1.1
1 |
|
思考2:
wire
和reg
的区别?为什么a
和b
用assign...=
赋值,而result
用always...<=
的形式赋值?
数据类型及其运算符
先介绍一下常见的两种数据类型:
名称 | 含义 | 举例 |
---|---|---|
reg |
register 寄存器类型 |
reg[3:0] reg_a,reg_b; |
wire |
wire 线型 |
wire[4:0] wire_a,wire_b; |
针对上述思考2,应该可以观察到,reg
型数据在always
块中赋值,wire
型数据在assign
语句中赋值。这正是reg
和wire
的区别之一。其中wire
对应连续赋值,如assign
,reg
对应过程赋值,如always
和initial
。
wire
综合之后一般是一根导线,reg
则要根据条件判断是组合逻辑(与原先电路状态无关)还是时序逻辑(跟原先电路状态有关)。
wire
和reg
的使用还是难以用以上几句话说清楚,大家自行继续思考呀~
再介绍一下运算符:
和C语言的运算符一毛一样!
语法小结
- 所有的过程块(
initial
、always
)、assign
连续赋值语句等,都是并行执行的。 Verilog
更加体现了数据传输的思想,表示一种通过变量名互相连接的关系。
条件语句
常见的条件语句
if……else
、while
、case()……endcase
、forever begin……end
、for(;;)
等,具体与C
相差无几。
结构说明语句
initial
——初始化语句,运行程序就立即开始always
——只要符合条件,就会一直执行思考3:
always
,while
、for
以及forever
有什么区别?task
——任务,task task_name(input a,……);……endtask
function
——函数,function function_name(input a,……);……endfunction
思考4:任务和函数的区别,也可以扩展了解一下进程和线程的区别,加油!
系统函数
如上面的程序,$display
函数就是一个非常有用的系统函数,这里我们不研究它的实现过程,只需要知道怎么用即可,如同C
语言的printf
,在不同的地方加一句printf
,或许会对调试有很大的帮助!
其他的函数还有$time、$setup、$write
等,遇到的时候可以再进行了解。
系统任务
与系统函数相似,常用的有$readmemh、$readmemb、$finish、$stop
等,其与系统函数的区别,与任务和函数的区别一致。
必知必会
- ``include
——文件包含,所有的代码写在一个文件里那是很头疼的一件事,就像所有的器官都长在脑袋里那样令人费解。
include`的作用就是将分开的文件联系在一起,具体请查询“预编译”相关解释。 - ``timescale
——
timescale 10ns/10ps其中
10ns指时间单位,
10ps指时间精度,模块中的时间均为
10ns的整数倍,时间延迟的最小分辨率为
10ps`