当前位置:   article > 正文

vivado乘法器IP核进行无符号与有符号数相乘问题的验证_vivado乘法器输出有符号吗

vivado乘法器输出有符号吗

本文验证乘法器IP核Multiplier进行无符号(unsigned)与有符号数(signed)相乘的正确性,其中也遇到了一些问题,做此记录。

配套工程:https://download.csdn.net/download/weixin_48412658/88354179

问题的讨论

IP核手册中提到pg108-mult-gen.pdf>,两端口的类型必须一致。进行验证后发现AB的数据类型不一致时也能够计算出正确的输出值,是否意味着两端口类型可以不一致进行计算啦?

在这里插入图片描述

验证过程

IP核配置

首先配置两个乘法器IP核:

第一个是有符号的相乘。

在这里插入图片描述

第二个是有无符号与有符号的相乘。

在这里插入图片描述

例化乘法器

变量输入类型:

reg signed [15 : 0] A_sig;
reg        [15 : 0] A_unsig;

reg signed [15 : 0] B_sig;		//例化中B始终是有符号类型

//输出
wire signed [31 : 0] P_sig;

wire 		[31 : 0] P_unsig;
wire signed	[31 : 0] P_sig2;	//用于mult_unsigned_signed IP核
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

设置初始值:

A_sig = 16'b1101_1101_1101_1101;
	A_unsig = 16'b1101_1101_1101_1101;
	B_sig = -50;
  • 1
  • 2
  • 3

例化中前第一个使用的是第一个IP核,第二三个使用的是第二个IP核。

//例化待测设计
mult_signed_signed mult_signed_signedi (
  .CLK(sys_clk), 
  .A(A_sig),     
  .B(B_sig),     
  .P(P_sig)      
);

mult_unsigned_signed mult_unsigned_signed1 (
  .CLK(sys_clk),  
  .A(A_unsig),      
  .B(B_sig),      
  .P(P_unsig)	//将输出赋值给P_unsig      
);

mult_unsigned_signed mult_unsigned_signed2 (
  .CLK(sys_clk),  
  .A(A_unsig),      
  .B(B_sig),      
  .P(P_sig2)   //将输出赋值给P_sig2   
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

仿真代码

`timescale 1ns / 1ps
//
// Module Name: tb_mult
//
module tb_mult();

//输入
reg           sys_clk;
reg signed [15 : 0] A_sig;
reg        [15 : 0] A_unsig;
reg signed [15 : 0] B_sig;

//输出
wire signed [31 : 0] P_sig;

wire 		[31 : 0] P_unsig;
wire signed	[31 : 0] P_sig2;	//用于mult_unsigned_signed IP核
//信号初始化
initial begin
    sys_clk = 1'b1;
	A_sig = 16'b1101_1101_1101_1101;
	A_unsig = 16'b1101_1101_1101_1101;
	B_sig = -50;
end

//生成时钟
always #10 sys_clk = ~sys_clk;
    
initial begin
	#10
	forever begin
		#(100);
			A_sig = A_sig + 1'b1;
			B_sig = B_sig + 1'b1;
		end
end

initial begin
	#10	
	forever begin
		#(100);
			A_unsig = A_unsig + 1'b1;
		end
end
//例化待测设计
mult_signed_signed mult_signed_signedi (
  .CLK(sys_clk), 
  .A(A_sig),     
  .B(B_sig),     
  .P(P_sig)      
);

mult_unsigned_signed mult_unsigned_signed1 (
  .CLK(sys_clk),  
  .A(A_unsig),      
  .B(B_sig),      
  .P(P_unsig)      //将输出赋值给P_unsig
);

mult_unsigned_signed mult_unsigned_signed2 (
  .CLK(sys_clk),  
  .A(A_unsig),      
  .B(B_sig),      
  .P(P_sig2)      //将输出赋值给P_sig2
);

endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

仿真波形分析与结论

波形中的进制Radix均根据是sig还是unsig设置成对应的进制。

可以看出:

有符号(signed)与有符号数(signed)相乘,输出赋值给有符号能得到正确输出。

无符号(unsigned)与有符号数(signed)相乘,输出赋值给有符号能得到正确输出。

无符号(unsigned)与有符号数(signed)相乘,输出赋值给无符号得到错误的输出,实质上将P_unsig的进制设置成signed的显示时则和P_sig2相同,表示两种是补码的关系。

通过试验可以验证无符号(unsigned)与有符号数(signed)相乘的乘法器IP核输出的值赋值给有符号数时能够计算正确。

在这里插入图片描述

补充:vivado乘法器IP核简单调用

vivado乘法器IP核简单调用:https://blog.csdn.net/Master_0_/article/details/123694290

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/533607
推荐阅读
相关标签
  

闽ICP备14008679号