时间:2024-07-30 来源:网络搜集 关于我们 0
2024年
FPGA数字电路学习之路
IC半导体芯片学习
01
数字电路之组合电路学习
01
组合逻辑电路的分析
3.1
组合逻辑电路的分析
02
组合逻辑电路的设计
3.2
组合逻辑电路的设计
03
竞争与冒险现象消除
3.3
竞争与冒险现象消除
04
常见的组合逻辑电路
3.4
常见的组合逻辑电路
3.4.1编码器
①普通编码器(8-3线编码器)
按照3.2的设计步骤,走一遍流程:
功能需求:
输入是,满足约束关系,输出
(1)输入输出关系已经有了,根据输入输出关系列出真值表
(2)根据真值表,得出函数关系
(3)并用卡诺图或者公式法进行化简得到
(4)画出最后的电路图
根据这个电路图,其实也很容易理解,就是如果要使最低位出现1,只有位为1时,才会出现,换句话说输入的下标数字,输入是的下标001,011,101,111的时候才会有输出为1,其他同理。
最终得到八线三线编码器的封装图如下图所示:
Verilog 代码:
module encoder83(input I0,input I1,input I2,input I3,input I4,input I5,input I6,input I7,output reg [2:0] Y);always @(*)beginY=3b0; case(1b1) I0:Y=3b000; I1:Y=3b001; I2:Y=3b010; I3:Y=3b011; I4:Y=3b100; I5:Y=3b101; I6:Y=3b110; I7:Y=3b111; default:; endcaseendendmoduleVerilog 仿真代码:
module tb_encoder83();//信号的定义 由于信号I在initial行为级语句中,所以是reg型reg I0;reg I1;reg I2;reg I3;reg I4;reg I5;reg I6;reg I7;wire [2:0] Y;//信号激励的产生initial begin I0=0; I1=0; I2=0; I3=1; I4=0; I5=0; I6=0; I7=0; end//模块元件列化encoder83 encoder83_th(.I0(I0),.I1(I1),.I2(I2),.I3(I3),.I4(I4),.I5(I5),.I6(I6),.I7(I7),.Y(Y));endmodule所设计生成的符号文件为:
仿真结果如下:
可以看到的是,当I3输入为1的时候输出为3,也就是011
②优先编码器
八线三线优先编码器74HC148,十线四线优先编码器74LS147。特别解释一下,优先编码器,一般是优先级越高,输出数越低,这是由于对偶导致的,通常如果假设输入是高点平有效,那么是正向输出,如果输入是低电平有效,将其对偶过去,就会输出数越低。
(1)八线三线优先编码器74HC148
把数字组合电路的设计流程走一遍:
第一步,列出功能需求,确定输入输出
功能需求:
输入是,其中的优先级最高,输出,当优先级最高的时候,输出为000,即输出数字越小,优先级越高,当没有输入的时候,默认为输出111,特别注意的是为了更好的扩展,加入了,其中表述电路是否工作,称为使能端或者选通端,称为使能输出端或者选通输出端,表示的是电路工作,无输入,即=1,其中表示的电路工作,有输入,这个端口通常用来进行芯片的扩展的高位。
第二步,根据功能,画出真值表
第三步,根据真值表写出函数表达式
最后一步,根据电路函数表达式画出电路图
(2)十线四线优先编码器74LS147
实质上将十进制数转换成四位二进制BCD码。
设计分析和八线三线优先编码器一样,具体分析过程参考上面,这里只给出它的真值表。
3.4.2译码器
①三线八线译码器
功能需求:
最典型的就是74HC138,输入是三位二进制的数,输出是0到7下标的输出对应的低电平,也就是输入是高电平有效,输出是低电平有效。其中且,那么这个时候电路就是正常的译码状态。
组合逻辑电路的分析过程走一遍:
(1)根据功能需求,列出输入输出端口
(2)根据功能需求,列出输入输出的真值表
(3)根据真值表,列出输出函数表达式,并用卡诺图化简
(4)根据函数表达式,画出对应的电路图
Verilog代码:
module decoder38(input s1,input s_2,input s_3,input [2:0] data,output reg [7:0] Y);//开始输入数据,74HC138,输入是高电平有效,输出是低电平有效parameter outdata=8b11111110;always @(*)if (!(s1==1&&s_2==0&&s_3==0)) Y[7:0]=8b11111111;else if(data==3d000) Y[7:0]=outdata;else if(data==3d001) Y[7:0]=~((~outdata)<<3d1);else if(data==3d002) Y[7:0]=~((~outdata)<<3d2);else if(data==3d003) Y[7:0]=~((~outdata)<<3d3);else if(data==3d004) Y[7:0]=~((~outdata)<<3d4);else if(data==3d005) Y[7:0]=~((~outdata)<<3d5);else if(data==3d006) Y[7:0]=~((~outdata)<<3d6);else if(data==3d007) Y[7:0]=~((~outdata)<<3d7);endmoduleVerilog仿真代码:
`timescale 1ns / 1psmodule tb_decoder38();reg s1;reg s_2;reg s_3;wire [7:0] Y;reg [2:0] data; //激励信号的产生initial begin s1<=1; s_2<=0; s_3=0; endinitial begin data<=3d0; #10 data<=3d1; #10 data<=3d2; #10 data<=3d3; #10 data<=3d4; #10 data<=3d5; #10 data<=3d6; #10 data<=3d7; #10 data<=3d0; end//元件列化decoder38 #(.outdata(8b11111110))decoder38(.s1(s1), .s_2(s_2),.s_3(s_3),.Y(Y),.data(data));endmodule仿真波形:
②四线八线译码器
四线十线译码器分析与以上相同,下面只给出74HC42的真值表:
③数码管七段译码器
七段数码管译码器较为简单,给出对应的图形以及真值表,具体过程可以参考3线八线译码器74HC138:
3.4.3数据选择器
接下来对中规模集成电路双四选一数据选择器74HC153进行分析,并对其扩展进行讨论。
①双四选一数据选择器原理分析
按照对组合逻辑电路的分析思路,走一遍流程:
(1)对电路图进行分析
(2)根据电路图,画出对应的真值表,别列出函数表达式
由于这里面变量数比较多,请读者自己前去列出。这里只给出输出端Y1的表达式,由于Y2与Y1完全对称,会分析Y1就会分析Y2,Y1的函数表达式为:
这表明了,S1高电平,输入地址端二进制数据为00,选择数据D10端,其他同理,确实达到了数据选择的效果。
②双四选一数据选择器扩展成八选一数据选择器
③八选一数据选择器中规模集成电路74HC151
④例题补充
问题分析:
我们来思考这个问题,要构成一个八选一数据选择器,应该要有什么,一个是八个数据输入端,这在双四选一数据选择器74HC153已经具备;八个数据端应该对应三个地址选择端,但是在双四选一数据选择器74HC153中,只有两个地址段A1,A0,还有两个无用的使能端,能不能将两个无用的使能端组成最高位地址段是这个题目的关键。
画出双四选一数据选择器74HC153的顶层图,尝试在上面思考:
分析思维图:
最后不难得出
①一位加法器
(1)半加器
根据组合电路的设计流程走一遍:
1.列出功能需求,确定输入输出,由于设计的是半加器,不考虑下位的进位相加,即不考虑进位输入,且是一位加法器,输入是A,B,输出和是S,以及进位输出CO
2.根据半加器的功能,画出真值表
3.根据真值表,确定对应的输出的函数表达式
4.画出电路图
5.分析验证,对于二进制相加而言,异或相当于相加,进位输出是当两者输入A,B都为1的时候,输出才是进位1.
Verilog 代码:
module half_add(input A,input B,output S,output CO);assign S=A^B;assign CO=A&B;endmoduleVerilog 仿真代码:
`timescale 1ns/1ps//最小单位是1ns,精度是1psmodule tb_half_add();//信号的定义reg A;reg B;wire S;wire CO;//激励信号A,B的产生initial begin A<=0;B<=0; #10 A<=0;B<=1; #10 A<=1;B<=0; #10 A<=1;B<=1; #10; end//模块的列化half_add half_add1(.A(A),.B(B),.S(S),.CO(CO));endmodule仿真波形:
综合的RTL图:
(2)全加器
(1)按照组合电路的设计流程走一遍,首先进行功能需求的分析,由于是全加器,输入A,B,C,输出是CO与S。
(2)根据功能需求列出真值表
(3)根据真值表,列出输出函数表达式
(4)画出电路图
Verilog 代码:
module add(input A,input B,input Cl,output S,output CO);assign S=A^B^Cl;assign CO=A&B+A&Cl+B&Cl;endmoduleVerilog 仿真代码:
`timescale 1ns/1psmodule tb_add();reg A;reg B;reg Cl;//激励的产生initial begin A<=0;B<=0;Cl<=0; #10 A<=0;B<=0;Cl<=1; #10 A<=0;B<=1;Cl<=0; #10 A<=0;B<=1;Cl<=1; #10 A<=1;B<=0;Cl<=0; #10 A<=1;B<=0;Cl<=1; #10 A<=1;B<=1;Cl<=0; #10 A<=1;B<=1;Cl<=1; #10; end//模块的初始化add add1(.A(A),.B(B),.Cl(Cl),.S(S),.CO(CO));endmodule仿真图:
RTL综合图:
②多位加法器
(1)串行加法器
串行加法器存在的一个缺陷是各级的延时比较严重,每次的CO需要等到下面的进位输入CI才能确定。
(2)超前进位加法器
超前进位加法器,根据每次的进位输入CI可以由前面的数字Ai,Bi确定,这样每次就能直接通过关系确定CO,而不用等下级的CI确定。
四位超前进位加法器74LS283
①一位数值比较器
②多位数值比较器
芯片·半导体
长按扫码关注