Verilog14、Verilog乘法、比较、数值表示


verilog 中关于乘法结果的有无符号计算、比较的有无符号、数值的表示形式

1、示例代码:

(
    input clk,
    input rst_n,
	output [7:0] out0,
	output [7:0] out1,
	output [7:0] out2
    );
	
	wire [3:0] a;
	wire [3:0] b;
	assign a = 4'b1001;
	assign b = 4'b0001;
	
	// 如果两个乘数有一个是无符号数,则结果为无符号数;
	wire [7:0] out0;
	assign out0 = a * b;					// out0 = 'h09 = 'b0000_1001
	
	wire[7:0] out1;
	assign out1 = $signed(a) * b;			//out1 = 'h09 = 'b0000_1001
	
	// 若两者都为有符号数,则结果为有符号数
	wire[7:0] out2;
	assign out2 = $signed(a) * $signed(b);		// out2 = 'hf9 = 'b1111_1001,有符号数和无符号乘法的区别在于【位扩展时补0还是补符号位】
												// 波形窗口radix改为 signed decimal,可以看到结果为 -9
	
	
	/*********** 直接比较会被当作无符号数来比较 *******************/
	wire sign0;
	assign sign0 = (out2>0)?1'b1:1'b0;				// sign0 = 1
	
	wire sign1;
	assign sign1 = ($signed(out2)>0)?1'b1:1'b0;		// 带上$signed()变有符号数的比较,sign1 = 0
	
	
	
	/************************ verilog 中的数据是用补码来表示的 *********************************/
	wire [3:0] c;
	wire [3:0] d;
	assign c = -4'd3;			// c = 'hd = 4'b 1101 (-3的补码)
	assign d = 4'd1;
	
	wire [7:0] out00;
	assign out00 = c * d;		// out00 = 'h0d = 'b0000_1101
	
	wire[7:0] out01;
	assign out01 = $signed(c) * d;		// out01 = 'h0d = 'b0000_1101
	
	wire[7:0] out02;
	assign out02 = $signed(c) * $signed(d);			// out2 = 'hfd = 'b1111_1101,波形窗口radix改为 signed decimal,可以看到结果为 -3
	
	wire sign00;
	assign sign00= (out02>0)?1'b1:1'b0;				// sign00 = 1,两个比较数当作无符号数处理
	
	wire sign01;
	assign sign01 = ($signed(out02)>0)?1'b1:1'b0;	// sign01 = 0,有符号数的比较
	
	
endmodule


/************************ 结论 **********************************/
/*
Verilog乘法:
		1、如果两个乘数有一个是无符号数,则结果为无符号数
		2、若两者都为有符号数,则结果为有符号数。$signed(a)*signed(b)
		3、有符号数和无符号乘法的区别在于【位扩展时补0还是补符号位】。波形窗口radix改为 signed decimal,可以看到对应的十进制结果

Verilog比较:
		1、两个数直接比较会被当作无符号数来比较
		2、带上$signed()变有符号数的比较。if($signed(a) > $signed(b))
		
Verilog 数制:
		1、Verilog中间计算数据以补码形式存在,如 -4'd3 显示为 'hd = 4'b 1101 (-3的补码)
*/
/************************ End **********************************/

2、仿真结果

3、结论

3.1、Verilog乘法:

	1、如果两个乘数有一个是无符号数,则结果为无符号数
	2、若两者都为有符号数,则结果为有符号数。$signed(a)*signed(b)
	3、有符号数和无符号乘法的区别在于【位扩展时补0还是补符号位】。波形窗口radix改为 signed decimal,可以看到对应的十进制结果

3.2、Verilog比较:

	1、两个数直接比较会被当作无符号数来比较
	2、带上$signed()变有符号数的比较。if($signed(a) > $signed(b))

3.3、Verilog 数制:

	1、Verilog中间计算数据以补码形式存在,如 -4'd3 显示为 'hd = 4'b 1101 (-3的补码)
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值