verilog入门学习笔记

verilog学习笔记(一)

模块结构

第一部分(必填)
module 模块名 ([端口列表]);
[端口信号声明;]
[参数声明;]
1、模块名是指电路的名字,由用户指定,最好与文件名一致
2、端口列表是指电路的输入/输出信号名称列表,信号名由用户指定,各名称间用逗号隔开。
3、端口信号声明是要说明端口信号的输入输出属性、信号的数据类型,以及信号的位宽。
输入输出属性有input,output,inout(双向)三种
信号的数据类型常用的有wire和reg两种
信号的位宽用[n1:n2]表示
同一类信号之间用逗号隔开
参数声明要说明参数的名称和初值
例子:
在这里插入图片描述
例子解释:
1、位宽不作说明,则默认1位;
数据类型不作说明,则默认为wire型。
2、输出信号S位宽为4位,对应信号为S[3],S[2],S[1],S[0]
第二部分功能描述部分
内部信号声明
(常用语句只有3种:assign语句,always语句,底层模块调用语句)
底层模块或门原语调用(包括生成块)
initial 或always语句块
任务和函数定义
specify块(路径延迟)
第三部分结束语句(必填)
endmodule

常用语句

assign语句(连续赋值语句)

基本格式
assign 赋值目标 = 表达式
特点“
1、赋值目标必须是wire型,wire表示电路间的连线。
2、之连续赋值语句是指其总是处于激活状态,只要表达式中的操作数有变化,立即进行计算和赋值。
例子
在这里插入图片描述
assign M=B|C;
Verilog具有丰富的表达式运算公式,可用于assign语句

算术型

在这里插入图片描述
(记住%求余,**求幂)
注意:
1、除了求余的操作数只能是整数,其它的操作数可以是实数也可以是整数。
2、求余运算结果取第一个操作数的符号

逻辑型

在这里插入图片描述
注意:
1、逻辑型运算的结果由3中1(真),0(假)、x(不确定)。

关系运算符

在这里插入图片描述

运算就结果与逻辑运算相同

按位运算符

在这里插入图片描述
注意:
1、按位运算的操作数是1位或多位二进制数。
2、按位非的操作数只有一个,将该数的每一位求非运算。
3、其它按位运算的操作数有2个或多个,将两个操作数对应的位两两运算;如果操作数位宽不同,位宽小的会自动左添0补齐;
4、结果与操作数位宽相同;
5、注意与逻辑运算符区分:
&按位与,&&逻辑与;
|按位或,||逻辑或。

缩减运算符

在这里插入图片描述
说明:
1、与按位与运算&区分:
例子:
(按位与运算)
Y=4‘ b1001&4’b0111结果为0001
(缩减与)
Y=&4‘ b1001结果为0
可以看出&起作用的运算位置不同
2、计算过程:
以上面的例子为例:从左到右第一位与后一位作与运算,求得的结果又与后一位作运算,结果只有一位
3、缩减运算的操作数是1位或多位二进制数

移位运算符

在这里插入图片描述
格式
操作数 移位符 n;
注意:
1、只有对有符号数的算术右移自动补符号位;其他移位均自动补0。
2、移位符与算术移位符的区别
例:
Y=4’b1001>>1;结果0100
Y=4’b1001>>>1;结果1100

拼接复制运算符

格式:
1、{操作数1,操作数2,…}
将操作数1,2…拼接到一起。
2、{n{操作数1,操作数2,…}}
将操作数1,2…拼接到一起后复制n遍拼接起来。

条件运算符

?:用于条件赋值
格式:
表达式1?表达式2:表达式3

always语句块(也叫过程块)

基本格式:
always @(敏感信号条件表)
各类顺序语句;
注意:
1、always语句本身不是单一的有意义的一条语句,而是和下面的语句一起构成一个语句块,称之为过程块;过程块中的赋值语句称过程赋值语句;
2、该语句块不是总处于激活状态,当满足激活条件时才能被执行,否则被挂起,挂起时即使操作数有变化,也不执行赋值,赋值目标值保持不变;
3、赋值目标必须是reg型的。
4、always语句中还可以使用if、case、for循环等语句,其功能更加强大。
5、激活条件由敏感信号条件表决定,当敏感条件满足时,过程块被激活。
敏感条件有两种,一种是边沿敏感,一种是电平敏感。
边沿敏感:
(posedge 信号名) 信号上升沿到来
(negedge 信号名) 信号下降沿到来
电平敏感:(信号名列表)信号列表中的任一个信号有变化
例:
(a,b,c)当a,b,c中有一个发生变化
例:
always@(posedge CLK)
Q=D;
当CLK上升沿到来时,激活该语句块,将D的值赋给Q;
否则,该语句块挂起,即使D有变化,Q的值也保持不变,直到下一次赋值。
此语句相当于一个D触发器
在这里插入图片描述
例:
always@(D)
Q=D;
当D有变化时(不管是由1变0还是由0变1),激活该语句块,将D的值赋给Q;否则,该语句块挂起,Q的值保持不变,直到下一次赋值。
相当于二极管
二极管
在以上两个例子中Q必须是reg型的
与assign语句相比:
1、always语句块中除了可以使用表达式赋值以外,还可以使用if,case等行为描述语句,还能够描述边沿变化,因此其功能比assign语句更强大(assign语句不能使用if等语句,也不能描述边沿变化)。
2、always语句块中如果多条就值语句必须将其用begin end包括起来,assign语句中没有begin end。(verilog语言所有是并行执行的,但是begin end里面是顺行执行的)
3、同一程序的always和assign两条语句,他们之间是并行的。如果程序中有一个变量Q则要进行声明。
内部信号声明格式:
数据类型 位宽 信号名称 元素个数

阻塞赋值与非阻塞赋值

设A、B同时由0变1
激活前:M1=0,M2=0,Q=0
阻塞赋值例子:
在这里插入图片描述
条件:
激活后:M1=1,M2=0,Q=1(每一步计算之后马上赋值)
非阻塞赋值例子:
在这里插入图片描述
激活后:M1=1,M2=0,Q=0(计算全部完成之后再赋值)
注意:
1、阻塞赋值用的符号是=,非阻塞赋值用的符号是<=
2、设计组合电路时常用阻塞赋值,设计时序电路时常用非阻塞赋值(但不是绝对的)。
3、不能在一个always块中混合使用阻塞赋值和非阻塞赋值。

底层模块和门原语调用

底层模块

底层模块描述
在这里插入图片描述
顶层模块描述:
在这里插入图片描述
为了调用底层模块,需要加两个内部变量d1和q1;并给两次调用的模块进行命名;调用时例化名不能省略。
底层模块调用格式:
底层模块名 例化名 (端口映射)
端口映射有两种方法:
端口名关联法(命名法)
位置关联法(顺序法)
命名法格式:
(.底层端口名1(外接信号名1),.底层端口名2(外接信号名2),…)
以上例的底层模块调用为例:
DFF dff1(.CLK(clk),.D(d1),.Q(q1));
因为有名字对应,不必按底层模块的端口信号列表顺序
顺序法格式:
(外接信号名1,外界信号名2,…)
DFF dff2(q1,d,q);
必须严格按照底层模块的端口信号列表顺序书写

门原语调用

门原语调用格式:
门原语名 实例名 (端口连接)
其中实例名可省略(和模块调用不同),端口连接只能采用顺序法,输出在前,输入在后。
在这里插入图片描述
常见的门:
在这里插入图片描述

Verilog中的数据类型

Verilog中的数据类型分为两大类
线网类(net类)
在这里插入图片描述
最常用的是wire
变量类(variable类)
在这里插入图片描述
最常用的是reg
因连续赋值语句不需要保存,过程赋值语句后者需要保存。
因此规定:
数据类型net型用于连续赋值的赋值目标或门原语的输出,且仿真时不需要分配内存空间
数据类型variable用于过程赋值的赋值目标,且仿真时需要分配内存空间。
数据类型使用注意
1、使用何种赋值语句对该信号进行赋值,如果是连续赋值或门原语赋值或例化语句赋值,则定义成net型;如果是过程赋值则定义成variable型。
2、对于端口信号来说,input信号和inout信号必须定义成net型的;output信号可以是net型的也可以是variable型的,决定于如何对其赋值。
三种赋值方法比较:
在这里插入图片描述
(1)使用连续赋值
在这里插入图片描述
此时,d和e必须定义为net型
(2)使用门原语赋值
在这里插入图片描述
此时,d和e也必须定义为net型的。
(3)使用过程赋值语句
在这里插入图片描述
此时,d和e必须定义为variable型的。

Verilog数字的表示格式

无符号数的表示方法:
<位宽>’ <进制><数字>
例:
2‘ b00——(00)2
有符号数的表示方法:<位宽>’ < sb ><数字>
例:
8’ sb10111011——(-69)10
注意有符号数是按照补码表示的,即第一位是符号位。(1表示负数,0表示正数)
Verilog语言的逻辑值有四种
1:逻辑1,高电平,数字1
0:逻辑0,低电平,数字0
x:不确定
z:高阻态

if语句

判断执行结果:
结果为真(1或非0),则执行真语句,
条件为假(0或x),则执行假语句。
在这里插入图片描述
在用if语句设计“组合电路”时要注意,如果条件不完整,会综合出寄存器。
使条件完整的两种方法:
1、加else
在这里插入图片描述
2、设初值
在这里插入图片描述

case语句

注意
Case语句最后要有个endcase不能忘。
如果条件描述不完整,则会综合出寄存器;在设计组合电路时要注意使条件描述完整。
加default语句可以使条件完整。如果条件描述完整也可以不加default语句。

Verilog语言的描述风格

三种描述方式
1、结构化描述(也称门级描述)(全部用门原语和底层模块调用)(不适合具体书写,因为不是很直观)
2、数据流级描述(全部用assign语句)
3、行为级描述(全部用always语句配合if、case语句等)
4、RTL级描述(数据流级+行为级,可综合)
实际描述是三种混合的。

其它规定

(1)关键字
关键字即Verilog语言中预定义的有特殊含义的英文词语
(2)标识符
标识符即用户自定义的信号名、模块名等等;注意关键字不能作标识符;Verilog区别大小写(关键字都是小写)。
(3)文件取名和存盘
Verilog文件扩展名为.v; verilog不要求文件名和模块名一致,但Quartusll要求一致
(4)注释
//单行注释
/**/多行注释

数字电路遗忘知识点的补充

常见的电路门
在这里插入图片描述

参考b站BV1iv4y1F7Km

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值