补码转换:
正数补码与原码相同;
负数补码转换方法是符号位不变,幅度位按位取反加一
电路原理图:
Verilog代码:
`timescale 1ns/10ps //写testbench时,要写好时间单位
module comp_conv(
a,
a_comp
);
input[7:0] a;
output[7:0] a_comp;
//wire[6:0] b;//按位取反的幅度位;
//wire[7:0] y;//负数的补码;
//assign b=~a[6:0];//(方法1)
//assign y[6:0]=b+1;//按位取反+1;
//assign y[6:0]=~a[6:0]+1;//按位取反+1;(不用b,方法2)
//assign y[7]=a[7];//符号位不变
//assign y={a[7],~a[6:0]+1};//(不用b,方法2)直接一步得到y的值;
//输出结果a_comp二选一
//原码最高位a[7]是1,负数,输出负数的补码y;最高位是0,正数,输出原码a;
//assign a_comp=a[7]?y:a;
assign a_comp=a[7]?{a[7],~a[6:0]+1}:a;//(方法3)不用中间变量y,直接得到a_comp结果
//逻辑不太复杂时,用位拼接,二选一
endmodule
testbench
//-----------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;//初值
#3000 $stop;//系统任务结束
//8位数,走256值,每个值间隔10ns,时间2560ns,定时间3000ns足够了
end
//让a_in变化
always #10 a_in<=a_in+1;//遍历逻辑值
endmodule