正数的补码与原码相同,负数的补码转换方式是符号位不变,幅度位按位取反加一。
代码如下
//2021-11-2
//补码转换逻辑;
`timescale 1ns/1ps
module comp_conv(a,a_comp);
output[7:0] a_comp;
input[7:0] a;
//wire[7:0] y;
//assign y[6:0]=~a[6:0]+1; //按位取反加一
//assign y[7]=a[7];//符号位不变
//assign y={a[7],~a[6:0]+1};
//assign a_comp=a[7]?y:a;
assign a_comp=a[7]?{a[7],~a[6:0]+1}:a;
endmodule
//------testbench of comp_conv-----
module comp_conv_tb;
reg[7:0] a_in;
wire[7:0] y_out;
comp_conv comp_conv(.a(a_in),.a_comp(y_out));
initial begin
a_in<=0;
#2560 $stop;
end
always#10 a_in<=a_in+1;
endmodule
仿真结果如下
https://www.bilibili.com/video/BV1hX4y137Ph?p=3&spm_id_from=pageDriver