第三节 组合逻辑代码设计与仿真 (补码转换和七段译码设计)


一、补码转换

1.方法

  正数补码与原码相同;

  负数补码转换方法是符号位不变,幅度位(其余位)按位取反加1;

  注意:

  1.1 在用补码运算的结果中, [1000 0000] 就是-128. 但是注意因为实际上是使用以前的-0的补码来表示-128, 所以-128并没有原码和反码表示.(对-128的补码表示[1000 0000]补算出来的原码是[0000 0000], 这是不正确的)

  1.2 为什么要用补码?

    根据运算法则减去一个正数等于加上一个负数;机器可以只有加法而没有减法, 这样计算机运算的设计就更简单了;

2.设计原理图

3.verilog 设计代码

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];
//assign y[6:0] = b+2'b1;
//assign y[7] = a[7];
assign a_comp = a[7]?{a[7],(~a[6:0]+2'b1)}:a;

endmodule

4.测试代码

//testbench of comp_conv
`timescale 1ns/1ns
module comp_conv_testbench();
reg [7:0] A;
wire [7:0] A_COMP;

//instantiation the module
comp_conv U1(
    .a(A),
    .a_comp(A_COMP)
    );

initial begin
    #0 A <= 2'b0000_0000;
    #3000 $stop;
end

always #10 A <= A+1;

endmodule

5.测试结果

 二、七段数码管译码设计

1.原理图

2.verilog设计代码

module seg_dec(
    num,
    a_g
    );
input [3:0] num;
output reg [6:0] a_g; //a_g ---> {a,b,c,d,e,f,g}

always @ (num) begin
    case(num)
        4'd0 : a_g <= 7'b111_1110;
        4'd1 : a_g <= 7'b011_0000;
        4'd2 : a_g <= 7'b110_1101;
        4'd3 : a_g <= 7'b111_1001;
        4'd4 : a_g <= 7'b011_0011;
        4'd5 : a_g <= 7'b101_1011;
        4'd6 : a_g <= 7'b101_1111;
        4'd7 : a_g <= 7'b111_0000;
        4'd8 : a_g <= 7'b111_1111;
        4'd9 : a_g <= 7'b111_1011;
        default : a_g <= 7'b000_0001;
    endcase
end
endmodule

3.测试代码

//testbench of the seg_dec
module seg_dec_testbench();
reg [3:0] Num;
wire [6:0] A_g;

//instantiation the module
seg_dec U1(
    .num(Num),
    .a_g(A_g)
    );

initial begin
    #0 Num <= 4'd0;
    #150 $stop;
end

always #10 Num <= Num+1;

endmodule

4.测试结果