1 、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 、数据类型
首先对
数的表示方式
进行讲解,Verilog只能表示二进制的逻辑值,可以为0,1,高阻,未知
如下图所示, 数在Verilog里面有3种表示
Verilog的数据类型
分为 寄存器型(reg) 线型(wire) 符号常量(parameter) 寄存器数组
(1)寄存器型
之所以reg叫做寄存器型,是因为数字电路中的触发器只在时钟有效边沿到来的时候,保存的值才能够发生改变。
reg型信号的定义格式如下:
定义一个n位的寄存器变量 :
reg [n-1:0]变量名;
定义m个n位的寄存器变量 :
reg [n-1:0]变量名1,变量名2,....变量名m;
下面给出2个例子:
reg [7:0] a, b, c; //a, b, c都是位宽为8位的寄存器
reg d; //1位的寄存器d
(2)线型
wire型信号的定义格式如下:
定义一个n位的wire变量 :
wire [n-1:0]变量名;
定义m个n位的wire变量 :
wire [n-1:0]变量名1,变量名2,.变量名m;
下面给出2个例子:
wire [7:0] a, b, c; // a, b, c都是位宽为8位的wire
wire d; //d是1位的wire
(3)符号常量
如果用关键词parameter来定义一个标识符,代表一个常量,这个常量就被称为符号常量。
例如: parameter width=3;//符号常量width的值是3,如果未进行重定义,当在程序中出现width时就用3代替。
同样的,可以一次性定义多个符号常量,parameter idle=1,one=2,two=3,stop=4;//定义了4个符号常量。如果未进行重定义,当代码中出现idle就用1代替,出现one就用2代替,出现tow就用3代替,出现stop就用4代替。
但是符号常量可以被重定义,使用#即可
如下图,一开始time_delay=5 time_count=10,重定义之后time_delay=4 time_count=8
(4)寄存器数组
存储器实际上是一个寄存器数组。
存储器使用如下方式定义
reg [ msb: lsb] memory1 [ upper: lower]
(upper:lower)代表寄存器个数,(msb是最高有效位,lsb是最低有效位)代表每个寄存器的位数
reg[3:0] mymem1[63:0]; //mymem1为64个4位寄存器的数组。
reg dog [1:5]; //dog为5个1位寄存器的数组。
dog[4]= 1; //合法赋值语句,对其中一个1位寄存器赋值。
dog[1:51]= 0; //合法赋值语句,对存储器大范围赋值。
3 、 运算符
(1)算术运算符
算术运算符
|
说明
|
+
|
加
|
-
|
减
|
*
|
乘
|
/
|
除
|
%
|
取模(余数)
|
在进行整数的除法运算时,结果要略去小数部分,只取整数部分;
进行取模运算时( %) 结果的符号位采用模运算符中第一个操作数的符号。例如,-10%3结果-1,11%-3 结果为2。
在进行算术运算时,如果某一个操作数有不确定的值x,则整个结果也为不确定值x。
(2)逻辑运算符
逻辑运算符
|
说明
|
&&
|
逻辑与
|
||
|
逻辑或
|
!
|
逻辑非
|
逻辑运算最常用于条件判断语句。逻辑运算只区分真假,而不管是什么数值。逻辑运算的输入4'ha1和4'h01是没有区别的,都是逻辑真,而0为逻辑假。一般来说,逻辑运算的结果要么为真(1)要么为假(0)
特例是如果有一个输入为未知X,那么结果也是X。
例如,4'ha1&&4h01是1,4'ha1&&4h00是0。
■对于逻辑与或:只有两个输入都是0的时候,逻辑或的结果才是0。
■对于逻辑非:当输入为非0值,输出就是0。
(3)按位运算符
按位运算符
|
说明
|
&
|
按位与
|
|
|
按位或
|
~
|
按位取反
|
^
|
按位异或
|
~^ ^~
|
按位同或
|
按位运算符是对照数据的每一位进行运算, 例如0101&1100=0100,0101|1100=1101
ps:异或是指如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
同或是指如果a、b两个值不相同,则同或结果为0。如果a、b两个值相同,同或结果为1。
(4)关系运算符
关系运算符
|
说明
|
<
|
小于
|
<=
|
小于等于
|
>
|
大于
|
>=
|
大于等于
|
关系运算符和逻辑运算符一般用于条件判断语句。
关系运算结果为1位的逻辑值1(真)或0(假),但也可能是x(未知)。关系运算符根据关系运算的结果是真还是假,用于条件判断。
关系运算时,若关系为真,则返回值为1;若声明的关系为假,则返回值为0;若某操作数为不定值x,则返回值也一定为x。
(5)等式运算符
等式运算符
|
说明
|
==
|
等于
|
!=
|
不等于
|
===
|
全等于
|
!==
|
全不等于
|
"=="和"!="称作逻辑等式运算符,其结果由两个操作数的值决定。由于操作数可能是x或z,其结果可能为x。
"==="和"!=="常用于case表达式的判别,又称作case等式运算符。其结果只能为0和1。如果操作数中存在x和z,那么操作数必须完全相同结果才为1,否则为0。
注意"=="和"="是完全不同的,"="是对寄存器赋值使用的。
(6)移位运算符
a>>n中a代表要进行向右移位的操作数,n代表要移几位。a<<n表示将a逻辑左移n位。
这两种移位运算都用0来填补移出的空位。
例如a是一个5位的寄存器,那么a=4'b1001<<1,a的结果就是5'b10010。但是当a是一个4位的寄存器,那么a=4'b1001<<1,a的结果就是4'b0010。
(7)条件运算符
用法:
assign wire类型变量=条件?表达式1:表达式2;
如果满足条件,变量=表达式1,否则,变量=表达式2
(8)拼位运算符
使用拼接运算符可以将变量任意组合后输出或送给另一个变量。
用法:
{信号1的某几位,信号2的某几位,......信号n的某几位}
{m,-a,b[3:0],w,3'b101}等同于{a,b[3],b[2],b[1],b[0],w,1b'[1],1'b[0],1'b[1]}
{4{w}}等同于{w,w,w,w}
{b{3{a,b}}等同于{b,a,b,a,b,a,b}
4 、语句
(1)赋值语句
(2)结构说明语句(always+initial)
(3)if语句
(4)case语句
(5)循环语句(repeat+forever+while+for)
2.1.2 本节引言
给
FPGA
一个支点,它可以撬动整个数字逻辑。““给我一根杠杆我就能撬动地球”是古希腊数学家、物理学家阿基米德说的,这句话是阿基米德的经典语录,这句话还被翻译为“给我一个支点,我就能撬起整个地球”,用了夸张的方式来说明杠杆原理。”
2.1.3
FPGA
简介
FPGA
(F
文章目录引言
Verilog
和 V
HDL
区别
Verilog
和 C的区别
Verilog
基础知识
Verilog
的标识符
Verilog
的数字进制格式
Verilog
的数据类型1) 寄存器类型2) 线网类型3) 参数类型
Verilog
的运算符1) 算术运算符2) 关系 运算符3) 逻辑 运算符4) 条件 运算符5) 位 运算符6) 移位 运算符7) 拼接 运算符8) 运算符 的优先级关键字程序框架
Verilog
高级知识点阻塞赋值( Blocking)非阻塞赋值( Non-Blocking)阻塞和非阻塞应用场景ass
空白符包括空格符(lb)、制表符(\t )、换行符和换页符。在编译和综合时,空白符被忽略。
2.1.2 注释符
(1)单行注释:以“//”开始,
Verilog
HDL
忽略从此处到行尾的内容。
(2) 多行注释:多行注释以" /* "开始,到 " */ "结束,
Verilog
HDL
忽略其中的注释内容。在
Verilog
HDL
中标识符( ldentifier)被用来命名信号名、模块名、参数名等,它可以是任意一组字母、数字、$符号和_(下划线)符号的组合。应该注意的是标识符的字母区分大小写,并且第一个字符必须
在学习的过程中,无论学什么都不可能一蹴而就。都是从一个初步认识到慢慢了解再到精通掌握的过程,学习
Verilog
HDL
语法也是一样的道理,首先你要清楚什么是
Verilog
HDL
,然后结合实践再遵从理论,这样后面的学习才能理解的更透彻。
由于该
语言
与C
语言
比较接近,因此在
FPGA
的学习里面我先选择学习它,在后面如果有时间还需要学习VDHL。而且国内一般用
Verilog
用的比较多。
它具有一下的描述能力:设计的行为特性、设计的数据流特性、设计的结构组成、包含响应监控和设计验证方面的时延和波形产生机制。
可以由任意顺序的字母、数字、美元符号和下划线组成,但第一个字符不能是数字或者美元符号,只能是字符或下划线,因为以美元符开始的标识符与系统的保留字冲突。
转义标识符:与C中一致。
空白符:包括空格、制表符、换行和分页符。它们出现在字符串里
Verilog
具有很强的电路描述与建模能力,能从多个层次对数字系统进行描述和建模。因此,在简化硬件设计任务、提高设计效率与可靠性、
语言
易读性、层次化和结构化设计等方面展现了强大的生命力与潜力。
Verilog
的主要特性:
可采用 3 种不同的方式进行设计建模:行为级描述——使用过程化结构建模;数据流描述——使用连续赋值语句建模;结构化方式——使用门和模块例化语句描述。
两类数据类型:线网(wire)数据类型与寄存器(reg)数据类型,线网表示物理元件之间的连线,寄存器表示抽象的数据...
Verilog
HDL
快速入门
Verilog
HDL
是一种硬件描述
语言
(
HDL
:Hardware Description Language),它是以文本形式来描述数字系统硬件的结构和行为的
语言
。 世界上最流行的两种硬件描述
语言
是
Verilog
HDL
和V
HDL
。注意,
Verilog
HDL
是一种描述
语言
,它和常见的编程
语言
C有根本的不同。C
语言
,让计算机的CPU从上往下按顺序执行每一条指令,执行完