- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
PAGE2 / NUMPAGES2
Verilog HDL常用基本语法V1.0
目录
TOC \o 1-3 \h \z \u 1. 前言 1
2. Verilog HDL基本结构 1
2. 数据类型及变量、常量 3
1. 逻辑值 3
2. 数值表达方式 4
3. 线网(net)型变量 4
4. 寄存器(reg)型变量 5
5. 常量 5
6. 存储器 6
3. 运算符 6
1.算数运算符 6
2. 逻辑运算符 6
3. 按位运算符 7
4. 关系运算符 7
5. 等式运算符 7
6. 其他特殊运算符 7
7.运算符优先级 9
4. 赋值语句 9
1. 连续赋值语句assign 9
2. 过程赋值语句 9
3. always语句 9
4. 阻塞与非阻塞 10
5. 条件语句 11
1. if-else语句 11
2. case语句 12
6. 循环语句forever 13
循环语句repeat 13
循环语句while 14
循环语句for 15
1. 前言
Verilog HDL语法较多,但是常用的语法较少,本文总结使用较为频繁的Verilog HDL语法,帮助初学者入门。由于整理时间仓促以及作者能力有限,文中难免有纰漏之处或者不严谨的内容,请大家批评指正。
2. Verilog HDL基本结构
我们首先看下面的代码:
module AND4(a,b,out);
output[3:0] out;//4位输出
input[3:0] a,b;//4位输入a和b
assign out = ab;//按位与运算
endmodule
这段代码中定义了一个模块AND4,由模块的声明开始,最开始的关键词是module,这个模块的名字叫AND4,这个模块的最后是endmodule
我们还可以使用另外一种写法,直接在参数列表里面将参数名列出:
module AND4(input[3:0] a, input[3:0] b, output out);
assign out = ab;
endmodule
通过RTL分析,得到以下结果
下面我们看一个分频模块
module FenPin(input clk_in, output clk_out);
reg c_out = 0;
assign clk_out = c_out;
always @(posedge clk_in)
begin
c_out = ~c_out; //取反
end
endmodule
其中,posedge表示上升沿,clk_in表示时钟,绿色部分是always块,一般用来描述时序逻辑电路。RTL分析结果如下:
图中D触发器处于上升沿触发,c_out的初始值为0,每经过时钟clk_in的上升沿翻转一次,其仿真结果如下:
经过上面的分析,我们可以总结出Verilog HDL 的基本结构
1. Verilog HDL程序由模块构成,每个模块在module和endmodule声明语句中
2. 每个Verilog HDL源文件中只有一个顶层模块,其他为子模块。可以每一个模块写一个文件
3. 每个模块中要对端口定义,并说明输入输出端口,然后对模块的功能进行逻辑描述。
4. 模块中的时序逻辑部分在always块的内部,在always块中只能对寄存器变量赋值。
5. 模块中对端口或其他wire型变量的赋值,必须在always块的外部使用assign语句,通常是将寄存器的值送出。
6. 程序书写格式自由,一行可以写几个语句,一个语句也可以分多行写。
7. 除了endmodule语句、begin_end语句和fork_join语句外,每个语句和数据定义的最后必须有分号。
8. 可用/*…*/和//…对程序的任何部分作注释。加上必要的注释,可以增强程序的可读性和可维护性
2. 数据类型及变量、常量
1. 逻辑值
2. 数值表达方式
3. 线网(net)型变量
线网(net)型变量最常用的就是wire。可以将wire直接的理解为连线。例如一个D触发器reg1的输出是Q,这个Q连接到端口out1上,那么out1的值始终跟随着reg1的值的变化而变化。例如:
wire clk_out;
assign clk_out = c_out;
例:
wire[7:0] a,b,c;//a,b,c都是位宽为8位的wire
wire d;//d是1位的wire
4. 寄存器(reg)型变量
reg型也称为寄存器型。数字电路中的触发器只在时钟有效边沿到来的时候,保存的值才能够发生改变。
例:
wire clk_out;
reg c_out;
文档评论(0)