分别产生8bit任意数乘以63的有符号与无符号结果
代码
module add_8bit_63(
// input [7:0] d1,
// output [13:0] sum
input signed [7:0]d1, //输入有符号的d1
output signed [13:0]sum,//输出无符号的结果sum
output signed [7:0]d2, //输出一个d1的值
output signed [13:0]d3 //输出d1*64的值
);
//要求计算任意数乘以63的有符号‘无符号结果//
// assign sum={d1,6'd0}-d1; ///无符号计算:d1*64-d1即为无符号的运算结果
有符号计算
/减去一个d1,位要对齐,所以加了14-8位的d1[7]
assign sum={d1[7],d1,6'b0} -{d1[7],d1[7],d1[7],d1[7],d1[7],d1[7],d1[7],d1};
//因为是有符号计算,假如是负数,那么d1[7]就为1,但不影响d1的值。
assign d2={d1[7],d1[7],d1[7],d1[7],d1[7],d1[7],d1[7],d1};//一个d1的值
assign d3={d1[7],d1,6'b0}; //d1*64的值
endmodule
`
仿真
有符号的仿真波形如下
因为无符号的计算嘛就不管位宽,直接相加,不存在问题。主要是有符号的相加得严格对齐,不然结果会出错,然后是二进制乘法,利用拼接符,像乘以64就是{d1[7],d1,6’d0}。
d1[7]是防止d1为有符号数并且是负数时计算出错,因为是负值的话第一位是1,那么在d1前面加个1就可以将d1的值与其他数相加减了,并且其它数的位数要对齐结果才不会出错。
可以从图6看到黄线处输入数据是d1=-6,输出d3是d1乘以64的值,d2就是一个d1的值,最后d3减去一个d1的值就是d1乘以63的值。
激励文件只需产生输入d1的值。