Verilog学习笔记(02)
Posted 高山流水123a s d
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Verilog学习笔记(02)相关的知识,希望对你有一定的参考价值。
文章目录
参考:Verilog数字VLSI设计教程
硬件描述语言Verilog
Verilog HDL数字设计与综合
Verilog HDL 数字集成电路高级程序设计
2.1 数据流描述
数据流建模:通过连续赋值语句和运算符的建模方式
显式连续赋值语句
<线网类型> <线网位宽> <线网信号>;
assign #<延迟><线网信号>=赋值表达式;
隐式连续赋值语句
<线网类型> <驱动强度><位宽> #<延迟><线网信号>=赋值表达式;
注意:
(1)赋值语句只能是线网类型(wire)
(2)连续赋值语句总是处于激活状态,用于组合逻辑之中
(3)连续赋值语句不能出现在过程块中,因为连续赋值语句是独立于过程语句的一种设计方式
(4)多个连续赋值语句之间是并行关系
(5)连续赋值语句的延时具有硬件电路中惯性延时特性,任何小于其延时的信号变化脉冲会被过滤掉,不会出现在输出端上
2.2 运算符
当遇到优先级时,可用()进行标注。
1.算术运算符:+、-、*、/、%
在赋值语句下,算数操作符结果的长度由操作符左端的目标长度决定
一般情况下,常用+、-、*,若要用/、%时,需要调用专用的IP
在加法操作中,最大位宽为maxm,n+1
在乘法操作中,最大位宽为m+n-1
2.关系运算符:>、<、> =、< =、= =、!=、= = =、!= = =
== | 0 | 1 | x | z |
---|---|---|---|---|
0 | 1 | x | x | x |
1 | x | 1 | x | x |
x | x | x | x | x |
z | x | x | x | x |
=== | 0 | 1 | x | z |
---|---|---|---|---|
0 | 1 | 0 | 0 | 0 |
1 | 0 | 1 | 0 | 0 |
x | 0 | 0 | 1 | 0 |
z | 0 | 0 | 0 | 1 |
注:
关系运算符的结果是1bit信号
3.逻辑运算符:&&、||、!
例:
寄存器变量a、b的初值分别为4’b1110和4’b0000,则!a=1’b0,!b=1’b1,a&&b=1’b0,a||b=1’b1
逻辑运算的结果是一个1bit信号
4.按位运算符:~ 、&、|、^ 、^~
按位运算的结果是一个多bit信号
5.归约操作符:&、|、^ 、~ & 、~ |、~^
归约操作符的操作数只有1个
归约运算的结果是一个1bit信号
6.移位操作符:<<、>>
当信号移出去之后,末端的信号处理只能是补零
7.条件操作符
<条件表达式>?<表达式1>:<表达式2>
8.连接与复制操作符:、
3.1 行为级描述
行为级描述是通过对于电路行为的计算机程序语言设计,综合工具可以生成相应的由基本单元构成的数字电路
1.过程语句
initial
begin
语句1;
语句2;
...
语句n;
end
特点:语句从开始到结束只执行一遍,且按顺序执行
2.always过程语句
always@(敏感事件列表)
语句块;
敏感事件分为两种:电平敏感,边沿敏感
(1)@(a)
(2)@(posedge a)
(3)@(negedge a)
采用过程语句对组合电路进行描述时,所有的输入信号要写到敏感事件表中
在信号定义方面,在过程语块(initial和always)中,被赋值信号必须定义为reg型
3.2 语句块
串行语句块
begin:块名
语句1;
语句2;
...
语句n;
end
对于可综合电路来讲,通常会使用串行语句块
并行语句块
fork:块名
语句1;
语句2;
...
语句n;
join
主要用于测试和仿真
阻塞赋值语句
变量 = 表达式 ;
特点:
(1)在串行语句块中,各条阻塞赋值语句将按照排列顺序依次执行;
在并行语句块中,各条阻塞赋值语句将同时执行;
(2)先计算等号右边表达式的值,然后立刻将计算的值赋给左边变量,与仿真时间无关
非阻塞赋值语句
变量 <= 表达式 ;
特点:
(1)在串行语句块中,各条阻塞赋值语句并行执行;
(2)先计算等号右边表达式的值,然后等待延迟时间结束,再将计算的值赋给左边变量
非阻塞赋值语句在数字电路的流水线设计中起到了很大作用
3.2 条件分支语句
条件分支语句包含两种,一种是if语句,另一种是case语句,这两条语句在可综合电路设计过程中以及测试和仿真中都起着极大地作用
if条件分支语句
形式1:
if (条件表达式) 语句块;
形式2:
if (条件表达式)
语句块1;
else
语句块2;
形式3:
if (条件表达式)
语句块1;
else if(条件表达式)
语句块2;
...
else if(条件表达式)
语句块n-1;
else
语句块n;
形式2最为常用
当条件分支较多时,建议使用case语句
if条件语句与硬件电路中的MUX相匹配
case条件分支语句
case(控制表达式)
值1:语句块1;
值2:语句块2;
...
值n:语句块n;
default:语句块n+1;
endcase
casez | 0 | 1 | x | z |
---|---|---|---|---|
0 | 1 | 0 | 0 | 1 |
1 | 0 | 1 | 0 | 1 |
x | 0 | 0 | 1 | 1 |
z | 1 | 1 | 1 | 1 |
casex | 0 | 1 | x | z |
---|---|---|---|---|
0 | 1 | 0 | 1 | 1 |
1 | 0 | 1 | 1 | 1 |
x | 1 | 1 | 1 | 1 |
z | 1 | 1 | 1 | 1 |
casez、casex语句与case语句的区别是:
casez只比较0、1、x的信号,当信号为高阻态时,输出信号是不进行比较的
casex不比较不定状态和高阻态,只比较0、1两个状态
在数字电路中,组合电路的输出信号绝对不能直接连到输入信号端,这种电路是不稳定电路
3.3 循环语句
1.forever循环语句
forever 语句或语句块;
例:
//Function: 产生固定周期时钟
module forever_tb;
reg clock;
initial
begin
clk = 0;
forever #50 clock = ~clock;
end
endmodule
2.repeat循环语句
repeat(循环次数表达式)
语句或语句块(循环体);
例:
//Function: 产生固定周期数的时钟信号
module repeat_tb;
reg clock;
initial
begin
clk = 0;
repeat(8) #50 clock = ~clock;
end
endmodule
3. while循环语句
当条件不满足时退出循环
while(条件表达) 语句或语句块;
例:
//Function: 产生时钟信号
module while_tb;
reg clock;
initial
begin
clk = 0;
while(1)
#50 clock = ~clock;
end
endmodule
4. for循环语句
for (循环变量赋初值;循环结束条件;循环变量增值) 语句块;
例:
//Function: 产生时钟信号
module for_tb;
reg clock;
integer i;
initial
begin
clk = 0;
for(i=1,i>=0;i=i+1)
#50 clock = ~clock;
end
endmodule
Verilog学习笔记(01)
Verilog学习笔记(03)
以上是关于Verilog学习笔记(02)的主要内容,如果未能解决你的问题,请参考以下文章