有符号数的计算在 Verilog 中是一个很重要的问题(也很容易会被忽视),在使用 Verilog 语言编写 FIR 滤波器时,需要涉及到有符号数的加法和乘法,在之前的程序中我把所有的输入输出和中间信号都定义成有符号数,这样在计算时没有出现问题(实际在之前的程序中遇到了有符号和无符号数的问题,最后滤波结果不对,博客的程序是已经改正过的),下面实际试验一下 Verilog 的乘法问题;
1. 编写程序测试无符号数和有符号数的乘法
编写程序如下,其中,乘法的两个乘数分别是无符号、有符号的四种组合,输出的积也是分为无符号和有符号,共计 8 种可能;
module signed_test(
input [7:0] data_in_unsigned_1,
input [7:0] data_in_unsigned_2,
input signed [7:0] data_in_signed_1,
input signed [7:0] data_in_signed_2,
output [15:0] data_out_000,
output [15:0] data_out_001,
output [15:0] data_out_010,
output [15:0] data_out_011,
output signed [15:0] data_out_100,
output signed [15:0] data_out_101,
output signed [15:0] data_out_110,
output signed [15:0] data_out_111
);
//无符号 = 无符号 * 无符号
assign data_out_000 = data_in_unsigned_1 * data_in_unsigned_2;
//无符号 = 无符号 * 有符号
assign data_out_001 = data_in_unsigned_1 * data_in_signed_2;
//无符号 = 有符号 * 无符号
assign data_out_010 = data_in_signed_1 * data_in_unsigned_2;
//无符号 = 有符号 * 有符号
assign data_out_011 = data_in_signed_1 * data_in_signed_2;
//有符号 = 无符号 * 无符号
assign data_out_100 = data_in_unsigned_1 * data_in_unsigned_2;
//有符号 = 无符号 * 有符号
assign data_out_101 = data_in_unsigned_1 * data_in_signed_2;
//有符号 = 有符号 * 无符号
assign data_out_110 = data_in_signed_1 * data_in_un