目录
一 基础数据类型
1.常量
在程序运行中,其值不能改变的量称为常量。
- Verilog HDL中常用 parameter 定义一个常量。其使用格式如下:
parameter 参数名1=表达式,参数名2=表达式;
parameter Xiao=789,Ming=456;
parameter Xi=1.2;
parameter Gua=Xiao-Ming;
2.变量
与常量相反,在程序运行中可以改变其值的量---------
Verilog HDL中有许多中的变量数据类型,这里只对常用的几种进行介绍
- 网络数据类型 wire型
- 网络的数据类型表示了在实体结构中的物理连接(导线的意思)。
- 该数据类型的变量 不能存储值,且必须受到驱动器的或门的连续赋值语句,如 assign 的驱动。
- 如果没有驱动器连接该网络类型变量,其值为高阻(z)。
wire Xi; //定义了一个一位的wire型
wire [7:0]Xi; //定义了一个八位的wire型
wire [4:0]Xi,Wie; //定义二个四位的wire型
- 寄存器数据型 reg型
- reg 型数据常用在 always 模块内的指定信号,常代表触发器。
- 在 always 模块内的每一个信号需定义为 reg 型。
- 初始的默认值为不定值 x。
reg[3:0] rret;//定义了一个四位的reg
reg[4:1] Xi,Wie;//定义了两个四位的reg
- reg 的扩展 memory 型
- 通关该扩展可对 reg 进行存储器建模,仿照一个数组类型。
- 格式如下 :通过该格式,我们建立了一个名为Xi的256个8位存储器
reg[7:0] Xi[255:0]; //定义了256个8位存储器
reg[255:0] Wie[7:0]; //定义了8个256位存储器
Xi[127]=1; //对memory中的第127个存储器赋值位1
、
二 运算符与表达式
1.基础运算符
基础的算术运算符又称二进制运算符,共有一下几种
- ( + )运算,加法运算。( - )运算,减法运算
- ( * )运算,乘法运算。( / )运算,除法运算
- ( % )运算,模运算,求余运算,两侧均为整数运算
以上的运算类型与其他的语种类似,没有很多的区别。
2.特殊运算符
- ( ~ )运算,取反运算。( & )运算,按位与运算
- ( | )运算,按位或运算。( ^ )运算,按位异或运算
- ( ^~ )运算,按位同或运算。
- ( { } )运算,拼接运算。
{a,b[3.0],w,3'b101} //该表达式为拼接运算 将a与b[3.0]与w与101拼接为一个数据
{3{Xi}} //表达为{Xi,Xi,Xi}的拼接
注意:在运算两个不同长度的数据时,系统会自动将数据右端对齐,位少的用零补齐。
3.逻辑运算符
- ( && )运算,与运算。
- ( || )运算,或运算。
- ( ! )运算,非运算。
,
三.赋值语句
1.阻塞赋值与非阻塞赋值
赋值语句分为:阻塞赋值与非阻塞赋值
- 非阻塞赋值
- 使用非阻塞赋值时,赋值的变量不能立即生效。
- 在当块结束时赋值操作才算完成。
- 被赋值的对象是取值对象的初始值
在该例中,赋值是在 always 运行完后进行的,所以 A 得到了 B 的初始值,C 得到了 A 的初始值。
相当于:A=B; C=A;
always@(posedge clk) //非阻塞赋值
begin
A<=B;
C<=A;
end
always@(posedge clk) //阻塞赋值
begin
a=b;
c=a;
end
- 阻塞赋值
- 使用阻塞赋值时,被赋值变量会立即获取到变化值。
,
四.块语句的类型
1.顺序块
begin_end 语句,通常用于表示顺序执行的语句。
- 块内语句按顺序执行。(处于begin·····end 内)。
- 每一条语句的执行时间,由上一条语句决定。
- 对于顺序块,延时是用于确定前一语句的运行时间。
- 直到 end 才退出语句块。
在该例子中,语句执行完的总时间为15个时间单位(大约)
begin
语句one;
#5 语句two;
#10 语句three; //延时10个时间单位后执行语句3
end
2.并行块
fork 通常用户需要并行运算的场合
- 在该语句块内,所有语句同时运行。
- 运行到 jojn 时退出语句。
- 对于并行块,同时执行的语句,延时只是用于确定运行时序的。
在该例子中语句的最后执行时间为10个时间单位(大约)。
fork
语句one;
#5 语句two;
#10 语句three; //10个时间单位后执行语句3
jojn
五.条件与循环
1.条件
条件选择的语句类型有 if_else,case_endcase,前者多用户信号类型的判断,后者多用户信号的选择。
- if 语句的三种类型。
if(a>b)
语句one;
if(a>b)
语句two;
else
语句three;
if(a<b)
语句n;
else if(a==b)
语句m;
- case语句
- case语句可以快速的进行多支判断。
- Verilog 提供了三中不同的case方法:case,casex,casez。
- 判断case(Xi),如果Xi 与列表中有相同即为选中。
case
reg[3:0] Xi;
reg[3:0] sum;
case(Xi)
4'b0 : sum=4'b111;
4'b1 : sum=4'b110;
4'b2 : sum=4'b101;
4'b3 : sum=4'b100;
default: sum=4'b111; //都未选中的情况下运行该语句
endcase
casez
- 该类型应用于不需要考虑的高阻状态
- " ? "为该项不考虑高阻
reg[3:0] Xi;
reg[3:0] sum;
case(Xi)
4'b??0 : sum=4'b111;
4'b??1: sum=4'b110;
4'b?1?: sum=4'b101;
4'b?11: sum=4'b100;
default: sum=4'b111; //都未选中的情况下运行该语句
endcase
casex
- 该语句类型用户排除无须考虑的项,无论是否高阻
- 使用该语句时将上方代码案例中 ( ?)改成 ( x )
2.循环
需要连续运行,或者多次运行的语句
- forever 语句
- 该语句常用于产生周期性波形,用于仿真信号的测试。
- 必须写入 initianl 语句块中。
在这里插入代码片
- repeat 语句
- repeat 执行的是固定次数的循环次数。
- 在该条件内参数需要为常量,变量,或信号,如果为变量在循环开始时的数值即为循环次数。
repeat (loop_number)
begin
语句n;
end
- for 语句
- 表达式:for(初始条件;停止条件;条件控制)
// for 语句
integer J;
reg [3:0] number;
begin
number= 'b0 ;
for (J=0; J<=10; J=X+1)
begin
#10 ;
number= number+ 1'b1 ;
end
end
------------更新中----------------