Verilog基本语法及应用

Verilog基本语法及应用_第1张图片

目录

  • 一 基础数据类型
    • 1.常量
    • 2.变量
  • 二 运算符与表达式
    • 1.基础运算符
    • 2.特殊运算符
    • 3.逻辑运算符
  • 三.赋值语句
    • 1.阻塞赋值与非阻塞赋值
  • 四.块语句的类型
    • 1.顺序块
    • 2.并行块
  • 五.条件与循环
    • 1.条件
    • 2.循环

一 基础数据类型

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
  • 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

------------更新中----------------

你可能感兴趣的:(verilog基础,开发语言,单片机,硬件工程,fpga开发)