HDLbits答案更新系列6(3.1 Combinational logic 3.1.3 Arithmetic Circuits 3.1.4 Karnaugh Map to Circuit)

目录

前言

3.1.3 Arithmetic Circuits

3.1.3.1 Half adder(Hadd)

3.1.3.2 Full adder(Fadd)

3.1.3.3 3-bit binary adder(Adder3)

3.1.3.4 Adder(Exams/m2014 q4j)

3.1.3.5 Signed addition overflow(Exams/ece241 2014 q1c)

3.1.3.6 100-bit binary adder(Adder100)

3.1.3.7 4-digit BCD adder(Bcdadd4)

3.1.4 Karnaugh Map to Circuit

3.1.4.1 3-variable(Kmap1)

3.1.4.2 4-variable(Kmap2)

3.1.4.3 4-variable(Kmap3)

3.1.4.4 4-variable(Kmap4)

3.1.4.5 Minimum SOP and POS(Exams/ece241 2013 q3)

3.1.4.6 Karnaugh map(Exams/m2014 q3)

3.1.4.7 Karnaugh map(Exams/2012 q1g)

3.1.4.8 K-map implemented with a multiplexer(Exams/ece241 2014 q3)

结语

HDLbits网站链接


前言

今天更新两个小节内容,都是相对基础的内容,但又不缺乏深度, 卡诺图化简,看波形写逻辑也是招聘经常考察的内容,希望大家能够掌握,下面我们就开始吧。

3.1.3 Arithmetic Circuits

3.1.3.1 Half adder(Hadd)

module top_module( 
    input a, b,
    output cout, sum );
    
    assign cout = a & b;
    assign sum = a ^ b;

endmodule

3.1.3.2 Full adder(Fadd)

module top_module( 
    input a, b, cin,
    output cout, sum );
    
    assign cout = a & b | a & cin | b & cin;
    //assign cout = a & b | (a | b) & cin;
    //assign cout = a & b | (a ^ b) & cin;
    assign sum = a ^ b ^ cin;

endmodule

大家注意,单比特的全加器中a | b和a ^ b是相同的

3.1.3.3 3-bit binary adder(Adder3)

module top_module( 
    input [2:0] a, b,
    input cin,
    output reg [2:0] cout,
    output reg [2:0] sum );
    
    integer i;
    always@(*)begin
        for(i = 0; i <= 2; i = i + 1)begin
            if(i == 0)begin
                cout[i] = a[i] & b[i] | a[i] & cin | b[i] & cin;
                sum[i] = a[i] ^ b[i] ^ cin;
            end
            else begin
                cout[i] = a[i] & b[i] | a[i] & cout[i - 1] | b[i] & cout[i - 1];
                sum[i] = a[i] ^ b[i] ^ cout[i - 1];
            end
        end
    end

endmodule

博主为了省事(其实没省多少)o(* ̄︶ ̄*)o 就用了for循环,大家注意,for循环可以节约时间(相对),但是for中一定要是常量,因为我们在设计硬件电路,不是软件语言。

3.1.3.4 Adder(Exams/m2014 q4j)

module top_module (
    input [3:0] x,
    input [3:0] y, 
    output [4:0] sum);
    
    wire[3:0]	sum_1;
    wire[3:0]	cout;
    
    assign sum_1[0] = x[0] ^ y[0];
    assign sum_1[1] = x[1] ^ y[1] ^ cout[0];
    assign sum_1[2] = x[2] ^ y[2] ^ cout[1];
    assign sum_1[3] = x[3] ^ y[3] ^ cout[2];
    assign cout[0] = x[0] & y[0];
    assign cout[1] = x[1] & y[1] | x[1] & cout[0] | y[1] & cout[0];
    assign cout[2] = x[2] & y[2] | x[2] & cout[1] | y[2] & cout[1];
    assign cout[3] = x[3] & y[3] | x[3] & cout[2] | y[3] & cout[2];
    
    assign sum = {cout[3], sum_1};
    
    //second way
    //assign sum = x + y;

endmodule

方法二直接使用行为级描述了,博主的方法一按照图中的电路结构写的麻烦一些,现实中直接使用方法二就可以了。

3.1.3.5 Signed addition overflow(Exams/ece241 2014 q1c)

module top_module (
    input [7:0] a,
    input [7:0] b,
    output [7:0] s,
    output overflow
); //
    
    assign s = a + b;
    assign overflow = a[7] & b[7] & ~s[7] | ~a[7] & ~b[7] & s[7];

endmodule

大家注意,这道题的溢出判断需要想一想,其实原理就是如果两个数都为负数,那个相加一定为负数,但是最终s的最高位不是1,那就证明溢出了,两个数都是正数同理。

3.1.3.6 100-bit binary adder(Adder100)

module top_module( 
    input [99:0] a, b,
    input cin,
    output cout,
    output [99:0] sum );
    
    assign {cout, sum} = a + b  + cin;

endmodule

3.1.3.7 4-digit BCD adder(Bcdadd4)

module top_module( 
    input [15:0] a, b,
    input cin,
    output cout,
    output [15:0] sum );
    
    wire[2:0]	cout_1;
    
    bcd_fadd u1_bcd_fadd(
        .a      (a[3:0]		),
        .b      (b[3:0]		),
        .cin	(cin		),
        .cout	(cout_1[0]	),
        .sum	(sum[3:0]	)
    );
    bcd_fadd u2_bcd_fadd(
        .a      (a[7:4]		),
        .b      (b[7:4]		),
        .cin	(cout_1[0]	),
        .cout	(cout_1[1]	),
        .sum	(sum[7:4]	)
    );
    bcd_fadd u3_bcd_fadd(
        .a      (a[11:8]	),
        .b      (b[11:8]	),
        .cin	(cout_1[1]	),
        .cout	(cout_1[2]	),
        .sum	(sum[11:8]	)
    );
    bcd_fadd u4_bcd_fadd(
        .a      (a[15:12]	),
        .b      (b[15:12]	),
        .cin	(cout_1[2]	),
        .cout	(cout		),
        .sum	(sum[15:12]	)
    );

endmodule

 这道题目作者已经给出了BCD full adder,同学们只需要调用就可以了,大家可以尝试用generate例化模块,对于更大位宽的加法器可能会节约工作时间。

3.1.4 Karnaugh Map to Circuit

3.1.4.1 3-variable(Kmap1)

module top_module(
    input a,
    input b,
    input c,
    output out  );
    
    assign out = a | b | c;

endmodule

3.1.4.2 4-variable(Kmap2)

module top_module(
    input a,
    input b,
    input c,
    input d,
    output out  ); 
    
    assign out = ~a & ~d | ~b & ~c | b & c & d | a & c & d;

endmodule

3.1.4.3 4-variable(Kmap3)

module top_module(
    input a,
    input b,
    input c,
    input d,
    output out  ); 
    
    assign out = ~b & c | a & c | a & ~d;

endmodule

3.1.4.4 4-variable(Kmap4)

module top_module(
    input a,
    input b,
    input c,
    input d,
    output out  ); 
    
    assign out = ~a & b & ~c & ~d | a & ~b & ~c & ~d | 
        		 ~a & ~b & ~c & d | a & b & ~c & d | 
        		 ~a & b & c & d | a & ~b & c & d | 
        		 ~a & ~b & c & ~d | a & b & c & ~d;

endmodule

3.1.4.5 Minimum SOP and POS(Exams/ece241 2013 q3)

module top_module (
    input a,
    input b,
    input c,
    input d,
    output out_sop,
    output out_pos
); 
    //sop:sum of product   pos:product of sum
    assign out_sop = c & d | ~a & ~b & c;
    assign out_pos = ~((~c | ~d) & (a | b | ~c));

endmodule

这道题是最大项和最小项的问题,大家要注意,我们常用的是最小项,也就是积之和,但是最大项也需要了解一下,当然笔试中一般使用最小项就好了。

3.1.4.6 Karnaugh map(Exams/m2014 q3)

module top_module (
    input [4:1] x, 
    output f );
    
    assign f = ~x[1] & x[3] | x[2] & x[4];

endmodule

这道题出现了无关项,大家要注意是否需要将无关项包含在化简逻辑中。

3.1.4.7 Karnaugh map(Exams/2012 q1g)

module top_module (
    input [4:1] x,
    output f
); 
    
    assign f = ~x[1] & x[3] | x[2] & x[3] & x[4] | ~x[2] & ~x[4];

endmodule

3.1.4.8 K-map implemented with a multiplexer(Exams/ece241 2014 q3)

module top_module (
    input c,
    input d,
    output [3:0] mux_in
);
    assign mux_in[0] = c ? 1'b1 : d;
    assign mux_in[1] = 1'b0;
    assign mux_in[2] = d ? 1'b0 : 1'b1;
    assign mux_in[3] = c ? d : 1'b0;
    
    /*
    //second way
    assign mux_in[0] = c | d;
    assign mux_in[1] = 1'b0;
    assign mux_in[2] = ~d;
    assign mux_in[3] = c & d;
    */

endmodule

结语

今天更新两个小节吧,对于卡诺图和基本的计算单元,大家一定要捻熟于心,无论是工作或是应聘,这些基础都是必须要掌握的,再大的电路模块都是通过这些小的单元搭起来的,因此不可忽视对小单元的掌握。最后如果有什么地方出现错误,欢迎大家指出来,我一定尽快改正。

HDLbits网站链接

https://hdlbits.01xz.net/wiki/Main_Page

 

你可能感兴趣的:(HDLbits答案更新系列6(3.1 Combinational logic 3.1.3 Arithmetic Circuits 3.1.4 Karnaugh Map to Circuit))