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
module helloworld();
initial
begin
$display("Hello World!");
$finish;
end
endmodule
看起来是不是比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 模块结束定义 -
模块结构:
module 模块名(a,b,c,d); input a,b; output c,d; endmodule //与下面等同 module 模块名(input a,input b,output c,output d); endmodule
结合上面的代码进行说明:
module helloworld(); //定义模块,及模块的名字
initial //初始化
begin //代码块开始,相当于C语言的'{'
$display("Hello World!"); //调用输出函数,相当于C语言的printf
$finish; //调用结束函数,相当于C语言的return 0
end //代码块结束,相当于C语言的'}'
endmodule //模块结束
为了让一个程序能够学到更多的东西,我们可以把上面的hello world
程序修改的更加细致一些:
coding_1.1
`timescale 1ns/100ps
module helloworld(
input wire[3:0] a, //定义了输入端口a和b,输出端口result
input wire[6:0] b,
output reg result
);
reg clk;
assign a = 4'b0001; //初始化a和b
assign b = 7'b0000001;
initial begin
result <= 0; //在a和b相等的条件下初始化result
clk <= 0;
$display("Hello,I am ready");
end
always #50 clk = ~clk;
always @(posedge clk)
begin
$display("Hello World!");
// $finish;
end
always @(clk) begin
$display("sir,where am I?");
end
always @ (result == 1)
$display("haha");
endmodule
思考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
更加体现了数据传输的思想,表示一种通过变量名互相连接的关系。
条件语句
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uI10eNgT-1601887728263)(龙芯班讲义——Verilog入门/image-20201003154811154.png)]
-
常见的条件语句
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