Verilog运算符和表达式及模块

运算符和表达式

C语言中也有很多运算符,Verilog HDL中的运算符形式和C语言基本相同,但其作用却是非常重大的,代表着电路

算数操作符

  • 加、减法:都使用加法电路,减法就是加了一个负数
  • 乘法:直接用符号即可使用乘法电路
  • 除法、取模:EDA工具支持的不好,但是如果在其工艺库中有除法和取模运算电路就可以用符号做
    例1:
reg[3:0]A,B,C;	//4位
reg[5:0]D;	//6位
A=B+C;	//4位
D=B+C;	//6位

例2:

a=4b'1111;	//15
b=3b'011;	//3
$display("%b",a*b);		//结果位数同a,为4'b1101,高位被舍去
$display("%b",a/b);		//结果为4'b0101
$display("%b",a+b);		//4'b0010
$display("%b",a-b);		//4'b1100
$display("%b",a%b);		//4'b0000

关系操作符

大于、小于、大于等于、小于等于,相当于数字比较器电路

a=3; b=6; c=1; d=4'hx;	//d为4位的不定态
$display(a<b);	//结果为1(真)
$display(a>b);	//结果为0(假)
$display(a<=c);	//结果为0
$display(d>=a);	//结果为未知数x(规定任何不定状态数和已知状态数的比较结果都为不定状态)

相等关系操作符

等于(= =)、不等于(! =)、全等(= = =)、非全等(! = =),相当于数字比较器电路
“= =”运算的真值表:

==01xz
010xx
101xx
xxxxx
zxxxx

“= = =”运算的真值表:

==01xz
01000
10100
x0010
z0001
a=4'b0xx1;
b=4'b0xx1;
c=4'b0011;
d=2'b11;
$display(a==b);		//结果为不定值x
$display(c==d);		//结果为1
$display(a===b);	//结果为1
$display(c===d);	//结果为0

在可靠性要求高的电路设计中,不允许不同位宽信号进行比较,也不允许不定状态和高阻状态参与比较,因此大部分情况下只使用“==”。

逻辑运算符

与&&,或||,非!
若a=4’b1110,则!a相当于让a经过一个或门,再经过一个非门,!a=1’b0
   b=4’b0000,!b=1’b1
若b=4’b01x0,!b=x
任何不定态x参与的逻辑运算结果都是不定态。

按位操作符

按位取反~,按位与&,按位或|,按位异或^,按位同或^~
   a=5’b00101
   b=5’b11101
☞a&b=5’b11101

归约操作符

归约与&,归约或|,归约异或^,与非~&,或非~|,异或非~^、^~
a=4’b1001
|a代表一个1001相或的运算,相当于上面的逻辑运算符!a操作中的或门。

移位操作符(不常用)

左移位<<,右移位>>
空位自动补零。

module shift_tb
reg[5:0]a,b,c,d;
reg[7:0]e;	//e为8位
initial
	begin
	a=6'b101101;
	b=a<<2;
	c=a>>3;
	d=a<<7;
	e=a<<2;
	$display("%b",b);	//结果为6'b110100
	$display("%b",c);	//结果为6'b000101
	$display("%b",d);	//结果为6'b000000
	$display("%b",e);	//结果为8'b10110100
	end
endmodule

条件运算符

<条件表达式>?<表达式1><表达式2>
条件表达式的计算结果为真,执行表达式1,计算结果为假,执行表达式2。相当于一个2选1的数据选择器

连接和复制运算符(可代替移位运算符)

  • 连接操作符
    {信号1的某几位,信号2的某几位,…,信号n的某几位}
  • 重复操作符
    {复制次数{表达式}}
module con_rep_th
reg[2:0]a;
reg[3:0]b;
reg[7:0]c;
reg[4:0]d;
reg[5:0]e;
initial
	begin
	a=3'b101;
	b=4'b1110;
	c={a,b};
	d={a[2:1],b[2:0]};
	e={2{a}};
	$display("%b",c);	//结果为8'b01011110
	$display("%b",d);	//结果为5'b10110
	$display("%b",e);	//结果为6'b101101
	end
endmodule

使用连接和复制运算符代替移位运算符:
a=5’b00101
a<<2=5’b10100 (空位补零)
{a[2:0],2’b00}=5’b10100
{a[2:0],2’b01}=5’b10101(相当于空位可任意补

模块的基本概念

模块(module)代表一个元件,是verilog语言的基本单元,端口用于和其他模块的通信。

模块结构组成图

模块结构组成图

端口定义用来定义端口列表中的变量哪些是输入(input),哪些是输出(output)和双向端口(inout),以及位宽的说明。
逻辑功能描述用来产生各种逻辑,主要是组合逻辑和时序逻辑。主要包括initial语句、always语句、其他子模块实例化语句、门实例化语句、用户自定义原语(UDP)实例化语句、连续赋值语句(assign)、函数(function)和任务(task)。

例:上升沿D触发器
上升沿D触发器

module dff(din,clk,q,);
	input din,clk;
	output q;
	reg q;
	always@(posedge clk)
			q<=din;
endmodule
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值