第9,10讲 组合逻辑电路设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
比较器(方法一)
assign A_gt_B=(A[3]&~B[3]) | (X[3]&A[2]&~B[2]) | (X[3]&X[2]&A[1]&~B[1]) | (X[3]&X[2]&X[1]&A[0]&~B[0]), A_it_B=(~A[3]&B[3]) | (X[3]&~A[2]&B[2]) | (X[3]&X[2]&~A[1]&B[1]) | (X[3]&X[2]&X[1]&~A[0]&B[0]), A_eq_B=X[3]&X[2]&X[1]&X[0]; endmodule
else outtemp=4'b1000;
end endmodule
用函数定义的8-3 优先编码器
module code8_3(in,out); output[2:0] out; input[7:0] in; function[2:0] codeout; input[7:0] codein; If (codein[7]) codeout=3’d7; else if (codein[6]) codeout=3’d6; else if (codein[5]) codeout=3’d5; else if (codein[4]) codeout=3’d4; else if (codein[3]) codeout=3’d3; else if (codein[2]) codeout=3’d2; else if (codein[1]) codeout=3’d1; else codeout=3’d0; endfunction assign out=codeout(in); end endmodule
module encoder (in,out); input [7:0] in; output [2:0] out;reg [2:0] out; always @(in) case(in) 8'b00000001 : out = 3’b000; // in[0]为1时输出编码000 8'b00000010 : out = 3’b001; // in[1]为1时输出编码001 8'b00000100 : out = 3’b010; // in[2]为1时输出编码010 8'b00001000 : out = 3’b011; // in[3]为1时输出编码011 8'b00010000 : out = 3’b100; // in[4]为1时输出编码100 8'b00100000 : out = 3’b101; // in[5]为1时输出编码101 8'b01000000 : out = 3’b110; // in[6]为1时输出编码110 8'b10000000 : out = 3’b111; // in[7]为1时输出编码111 default:out=3’bxxx; endcase endmodule
case (Ain) 3'b000 : Yout = 8'b00000001; //0 3'b001 : Yout = 8'b00000010; //1 3'b010 : Yout = 8'b00000100; //2 3'b011 : Yout = 8'b00001000; //3 3'b100 : Yout = 8'b00010000; //4 3'b101 : Yout = 8'b00100000; //5 3'b110 : Yout = 8'b01000000; //6 3'b111 : Yout = 8'b10000000; //7 default : Yout = 8'b00000000; //default项 endcase end endmodule
else if(A<B)begin A_gt_B<=0; A_it_B<=1;A_eq_B<=0; end else begin A_gt_B<=0;A_it_B<=0;A_eq_B<=0;end end endmodule
else if(A==B) begin A_gt_B<=0;A_it_B<=0;A_eq_B<=1; end
要求: Ain取000~111 时,分别代表 Yout[0]~Yout[7] 有效
3-8解码器
module decoder (Ain, En, Yout); input En;input [2:0] Ain; output [7:0] Yout; reg [7:0] Yout; always @ (En or Ain) begin if (!En) Yout = 8'b0; //使能信号无效时会把输出置0 else
一个四位大小比较器的输入是两个四位数A和B,我们 可以将它们写成下面的形式,最左边的为最高有效位: A=A(3)A(2)A(1)A(0) B=B(3)B(2)B(1)B(0)
两个数的比较规则:从最高有效位开始, 逐位进行。如果两个 位不相等,则该位值为0的数为较小的数。为了用逻辑等式实现 这个功能,我们需要定义一个中间变量X。
编码器
编码器是指能实现用二进制对输入信号进行编码的 电路,对于每一路输入信号将输出唯一的二进制代 码数。 编码器又分为一般编码器和优先编码器两种,一般 编码器一次只能输入一个信号,优先编码器一次允 许输入多个信号。
下图所示是一个8-3编码器,其中in[7]~in[0]是8位 数据输入端,out[2]~out[0]是3位编码输出端。
组合逻辑电路设计
◆ 基本门电路
◆ 加法器
主要 内容
◆ 比较器
◆ 编码器 ◆ 译码器 ◆ 多路数据选择器 ◆ 其它组合电路设计
1.基本门电路设计 //门级结构描述 module gate1(F,A,B,C,D); input A,B,C,D; output F; nand(F1,A,B); //调用门元件 and(F2,B,C,D); or(F,F1,F2); endmodule
3-8解码器
和8-3编码器工作过程恰恰相反,3-8解码器的 工作是把已编码成3位的二进制数转换成相应 的未编码前的8位二进制串。
与8-3编码器不同的是,解码器多了一个使能端 En,只有在使能端有效的时候,解码器才能工 作。
wk.baidu.com
3-8解码器
下图所示是一个一般解码器——3-8解码器,其中 Ain[2]~Ain[0]是数据输入端,Yout[7]~Yout[0]是 解码输出端,En是使能控制端。
8-3编码器
若输入端每次有且只有一个是有效的(高电平),那么用一个 8位的二进制串表示该输入信号是很浪费的(如用00010000表 示in[4]端口有效的输入信号),可以把这个二进制串用一个3 位的二进制数表示 (000~111分别表示in[0]~in[7]是有效的),这就是8-3编码 器。
8-3编码器case语句实现
加法器
4位全加器 module adder4(cout,sum,ina,inb,cin); output[3:0] sum; output cout; input[3:0] ina,inb; input cin; assign {cout,sum}=ina+inb+cin; endmodule
比较器
比较器(方法二)
module comp2(A,B,A_gt_B,A_it_B,A_eq_B); input [3:0] A,B; output A_gt_B,A_it_B,A_eq_B; assign A_gt_B=(A>B); assign A_it_B=(A<B); assign A_eq_B=(A==B); endmodule
F1
F2
1.基本门电路设计
数据流描述 module gate2(F,A,B,C,D); input A,B,C,D; output F; assign F=(~(A&B))|(B&C&D); //assign持续赋值 endmodule
基本门电路设计
行为描述 module gate3(F,A,B,C,D); input A,B,C,D; output F; reg F; always @(A or B or C or D) //过程赋值 begin F=(~(A&B))|(B&C&D); end endmodule
If-else是一个有优先级的条件执行语句结构,排在 前面的判断条件优先级高,所以只要排在最前面的 判断条件满足,就执行那个分支语句,把后面的分 支全部忽略。在本程序中,4个输入端c、d、e、f 优先级依次降低,建模程序如下:
比较器(方法三)
module comp3(A,B,A_gt_B,A_it_B,A_eq_B);
input [3:0] A,B; output A_gt_B,A_it_B,A_eq_B; reg A_gt_B,A_it_B,A_eq_B;
always @(A or B)
begin
if(A>B) begin A_gt_B<=1;A_it_B<=0;A_eq_B<=0;end
注意下面实现的是同或的功能: X(i)=A(i)B(i)+A(i)’B(i)’
比较器
大小比较器的三个输出为:A_gt_B ,A_it_B和A_eq_B 。 当A>B时, A_gt_B=1; 当A<B时, A_it_B=1; 当A=B时, A_eq_B=1; 其计算公式为: A_gt_B=(A[3]&~B[3]) | (X[3]&A[2]&~B[2]) | (X[3]&X[2]&A[1]&~B[1]) | (X[3]&X[2]&X[1]&A[0]&~B[0]), A_it_B=(~A[3]&B[3]) | (X[3]&~A[2]&B[2]) | (X[3]&X[2]&~A[1]&B[1]) | (X[3]&X[2]&X[1]&~A[0]&B[0]), A_eq_B=X[3]&X[2]&X[1]&X[0];
多路数据选择器
多路数据选择器是一种应用广泛的通用逻辑器件, 它能够根据按需要从多个输入信号中选择一个送到 输出端。
用if-else构造的4选1选择器
下图所示是一个用if-else语句构造的有优先级的选 择器,c、d、e、f是4个数据输入端,pout是数据 输出端,s是选择信号输入端。
S取00时,pout=c S取01时,pout=d S取10时,pout=e S取其它值,pout=f
8-3 优先编码器 if语句实现
要求优先级依次为:h->a; 000~111分别表示a~ h是有效的,若a~h没有一个信号有效时none_on取 值为1,其它情况none_on取值为0;
8-3 优先编码器 if语句实现
module encoder8_3(none_on,out,a,b,c,d,e,f,g,h); output none_on; output[2:0] out; input a,b,c,d,e,f,g,h; reg[3:0] outtemp; assign {none_on,out}=outtemp; always @(a or b or c or d or e or f or g or h) begin if(h) outtemp=4'b0111; else if(g) outtemp=4'b0110; else if(f) outtemp=4'b0101; else if(e) outtemp=4'b0100; else if(d) outtemp=4'b0011; else if(c) outtemp=4'b0010; else if(b) outtemp=4'b0001; else if(a) outtemp=4'b0000;
比较器(方法一)
module comp1(A,B,A_gt_B,A_it_B,A_eq_B); input [3:0] A,B; output A_gt_B,A_it_B,A_eq_B; wire [3:0] X; assign X[0]=(A[0]&B[0]) | (~A[0]&~B[0]), X[1]=(A[1]&B[1]) | (~A[1]&~B[1]), X[2]=(A[2]&B[2]) | (~A[2]&~B[2]), X[3]=(A[3]&B[3]) | (~A[3]&~B[3]);