第三节 组合逻辑代码设计与仿真 (补码转换和七段译码设计)
一、补码转换
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.测试结果