目录
前言
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网站链接
今天更新两个小节内容,都是相对基础的内容,但又不缺乏深度, 卡诺图化简,看波形写逻辑也是招聘经常考察的内容,希望大家能够掌握,下面我们就开始吧。
module top_module(
input a, b,
output cout, sum );
assign cout = a & b;
assign sum = a ^ b;
endmodule
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是相同的。
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中一定要是常量,因为我们在设计硬件电路,不是软件语言。
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
方法二直接使用行为级描述了,博主的方法一按照图中的电路结构写的麻烦一些,现实中直接使用方法二就可以了。
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,那就证明溢出了,两个数都是正数同理。
module top_module(
input [99:0] a, b,
input cin,
output cout,
output [99:0] sum );
assign {cout, sum} = a + b + cin;
endmodule
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例化模块,对于更大位宽的加法器可能会节约工作时间。
module top_module(
input a,
input b,
input c,
output out );
assign out = a | b | c;
endmodule
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
module top_module(
input a,
input b,
input c,
input d,
output out );
assign out = ~b & c | a & c | a & ~d;
endmodule
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
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
这道题是最大项和最小项的问题,大家要注意,我们常用的是最小项,也就是积之和,但是最大项也需要了解一下,当然笔试中一般使用最小项就好了。
module top_module (
input [4:1] x,
output f );
assign f = ~x[1] & x[3] | x[2] & x[4];
endmodule
这道题出现了无关项,大家要注意是否需要将无关项包含在化简逻辑中。
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
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
今天更新两个小节吧,对于卡诺图和基本的计算单元,大家一定要捻熟于心,无论是工作或是应聘,这些基础都是必须要掌握的,再大的电路模块都是通过这些小的单元搭起来的,因此不可忽视对小单元的掌握。最后如果有什么地方出现错误,欢迎大家指出来,我一定尽快改正。
https://hdlbits.01xz.net/wiki/Main_Page