数电学习9.17
门电路
半导体二极管门电路
存在正负二极管压降0.7V 略
TTL(双晶体管)门电路
标准TTL与非门
中间级:是共射组态基本电路,增强输出级的驱动能力
TTL与非门的电压传输特性
分截止区,线性区,过度区,饱和区
一般规定低电平最大值不超过截止区,高电平最大值大于饱和区
扇出系数
定义:指在不超过额定电流值的情况下,逻辑门电路输出端能够连接同种类型逻辑门电路的个数。负载能力 一般来说TTL门电路扇出系数为10
静态功耗
PD =0.5(ICCL + ICCH)VCC
其中:ICCL ,ICCH分别为输出低电平电源电流,和高电平—
TTL集电极开路门(open collector) OC门
电路符号(略)
需要在输出与集电极输出之间加上拉电阻,因此具有较大驱动能力,
线与方式输出
OC门允许输出端并联,这样就可以实现线与的关系,如果是OC的与非门实现线与,那么就可以实现与非门,注意:只需要在线与之间加一个Ri上拉电阻就可以满足,而且还能降低功耗
Ri的计算应该尽量去贴近的最小值,因为Ri越大驱动能力越差,工作速度会降低的
TTL三态门
可以出现高阻态,多出一个使能端en,控制输出的传输方向,通过两个三态门可以构造处双向数据传输的结构,也可以通过通过对总线上各个门使能控制,一个门开,其余门关,且总线成高阻态,这样能把数据挂到总线上来
EN值的高低,决定二极管的通断,进而决定VT5是截止还是饱和,最终决定数据的走向
COMS门电路
特点
coms反相器
- 静态功耗低
- 开关速度快
- 电压电压低
coms传输门
符号:TG
功能:双向传输
coms反相器可以构造与非(与逻辑串联)和或非门(并联)
CMOS与TTL比较
- COMS 为单晶体,TTL为双晶体
- COMS不允许输入悬空,因为输入电阻大,栅极电荷不易泄放
- COMS静态功耗很小,动态功耗随着工作速度增加而增加
- COMS适合做大规模集成电路,抗干扰强,热稳定性好
总线缓冲器
作用:当使能有效时,将输入数据不加改变传输到输出端,
无效时,他在输入设备和总线之间起到隔离作用
1.单项总线缓冲器,如图
双向总线控制器如图
双向RTL实现代码
// 双向总线控制器
module RTL_dir_bus(
input DIR,
input OE_n,
inout A,
inout B
);
wire s1,s2; //三态门控制端
assign s1 = DIR &(!OE_n);
assign s2 = (~DIR)&(!OE_n);
wire A1,B1; //三态门输出端
assign B = s1?A:1'bz;
assign A = s2?B:1'bz;
endmodule
vivado综合后生成 IOBUF 原语:双向缓冲(Primitive: Bi-Directional Buffer)
设计元素是双向单端I / O缓冲器,用于将内部逻辑连接到外部双向引脚。
仿真注意
- 因为是双向端口,仿真模块设计时必须保证当被测试模块为输出时,仿真对接端口为高阻态,被测端口为高阻态时,仿真端口为输出。**即两个模块同时只有一个高阻态接收数据 **
测试代码如下
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2019/09/17 10:06:34
// Design Name:
// Module Name: test_csdn
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module test_csdn(
);
reg clk;
reg rst_n;
reg DIR;
reg OE_n;
reg A;
reg B;
wire A_r;
wire B_r;
assign A_r = ~DIR&&(~OE_n)?1'bz:A;
assign B_r = DIR&&(~OE_n)?1'bz:B;
parameter clk_period=50;
parameter clk_half_period=clk_period/2;
// 初始化
initial
begin
clk=1;
DIR =0;
OE_n=0;
A=1;
B=0;
#100
DIR =1;
OE_n=0;
A=1;
B=0;
#100
DIR =1;
OE_n=1;
A=1;
B=0;
end
always
#clk_half_period clk=~clk;
RTL_dir_bus a1(
.DIR(DIR),
.OE_n(OE_n),
.A(A_r),
.B(B_r)
);
endmodule
有关双向端口我还没用过,这里不便说太多。
5 组合逻辑电路
特点和功能描述
- 不存在反馈线
- 当前输入决定输出
设计与分析
组合逻辑电路分析
- 判断电路性质,组合电路只有逻辑门,也无反馈线
- 写出电路表达式,从输入到输出逐级写出
- 根据表达式化简和变换
- 列出真值表(或根据真值表求出最简表达式,用与,或,非门,mux画出电路)
- 根据真值表说明电路功能
逻辑图,逻辑表达式,真值表,卡诺图是描述的四种方式,可以等价替换
逻辑函数的变换
1.常用的五种逻辑函数表达式:与或型,或与型,与非与非型,或非或非型。与或非型
转换方式如下
组合逻辑电路设计
1.一直实际问题进行逻辑抽象,确定输入,输出变量,并进行逻辑赋值
2.根据情况列出真值表(这是最为关键的环节,真值表正确代表功能最后的正确)
3.写出逻辑表达式,根据函数进行化简和变换(使用什么门)
4选择合适期间,画出电路逻辑图。
其中:在2,3,4阶段都可以编写RTL代码生成电路,但如果使用触发器的情况最好还是使用电路逻辑图简单
always@(*)//代表后面所有输入变量都是电平敏感的,直接case生成真值表
例题1:一灯两控制,真值表跟格雷码类似,开关只有1bit变化。
加法器
1位半加器:
input A,B
ouput C,//进位 C=AB
output S //个位 S=A^B
全加器
input A,B
input Ci-1 //前进位
ouput Ci, //进位 Ci = AB +(A^B)Ci-1
output S //个位 S=A^B ^Ci-1
真值表略
集成4位加法器(实际中使用超前进位全加器)
- 可以不必等待由地位全加器逐级计算的输出输出信号,进一步提高工作频率
编码器
1.二进制(格雷,独热码)编码器:正常编码,没有编码完全的直接回直接生成锁存器
2.优先编码器: 带有梯度的编码方式
优先编码器是一种能将多个二进制输入压缩成更少数目输出的电路或算法。其输出是序数0到输入最高有效位的二进制表示。优先编码器常用于在处理最高优先级请求时控制中断请求。
RTL代码
always@(*)
begin
casez (in1,in2,in3,in4)
4'b0001: clzres[1:0] <= 2'b11;
4'b001?: clzres[1:0] <= 2'b10;
4'b01??: clzres[1:0] <= 2'b01;
default: clzres[1:0] <= 2'b00;
endcase
end
//其中优先级从最高位一次向下递减,机in1优先级最高,in4优先级最低
译码器
略
数据选择器(mux)
数据选择器的应用
数据选择器可以实现任意组合的逻辑函数设计
1.输入变量全部最小项和mux的输入数据端口一样
2.输入变量全部最小项大于mux的输入数据端口个数,则把多余变量分离出来买家到输入数据端口
数码比较器
浮点数,补码比较,方法有很多就要延迟低和面积小的那个
竞争与冒险
重中之重
竞争概念:某个门电路的2个输入信号同时发生跳变的现象,可能存在竞争
assign B1= A&~A; 与门两端同时变化 1态冒险
assign B2 =A| ~A; 或门两端同时变化 0态冒险
冒险概念:竞争结果
竞争冒险的判别
- 门电路存在延迟
- 信号见的竞争
判别条件:
1.线判断逻辑式中同时存在某个变量的原变量和反变量
2.其次逻辑是否转化为 !A +A 或者A&!A ,转化条件为把其余变量置为特定的值0或者1.
消除办法
1.加入冗余项
2.RTL直接在逻辑输出端加寄存器,消除毛刺
触发器(FF)和锁存器(Latch)
RS触发器
时钟触发器
时钟RS触发器
可以写成表达式
D触发器(满足单端的需要)
QN+1=D,边沿触发产品居多
JK触发器
QN+1 =J(!QN)+(!K)QN ;
T触发器(翻转)
QN+1 = (!QN)
T=1时,每来一个时钟翻转一次
T=0时,保持
不同触发器之间的转换
转换方法: 对比两者之间的特性方程,进行连接
小结
注意是上升沿还是下降沿,极性指示符的含义
时序逻辑电路
特点和功能
1.分为输入信号,输出信号,状态信号
2.分为输出方程,驱动方程,状态方程
3.分类:按触发器是否同步分为 同步和异步
4.时序逻辑电路可以有逻辑表达式,逻辑图,状态转换表(图)和时序图来描述,也可以相互转换,其中后三项更为直观
同步时序电路分析
1.根据时序逻辑电路画出逻辑图,写出时钟方程,驱动方程(触发器输入信号的逻辑表达式),电路输出方程(输出信号的逻辑表达式)。
2.将触发器驱动方程带入相应触发器特征方程中一般(D触发器QN+1=D,)求出个触发器的次态输出逻辑表达式
3.设置电路输出变量和触发器输出的初态(一般触发器为0),不断计算次态输出,知道出现循环。计算全部结果列表,就得到电路状态转换图
4.由表画状态转换图
5.由表画时序图,确定电路功能
7.检查电路是否能自启动,循环之外无效状态设为初态,如果能进入循环就能自启动
同步时序电路设计(RTL直接描述就完事了)
1.根据状态确定使用多少个触发器log2 N
2.画出次态卡诺图,并且次态卡诺图分解,进而得到状态方程
3.将状态方程和触发器特征方程,进而得到驱动方程,根据驱动方程画出电路
例题
随便找了个电路
//JK触发器,下降呀
module JK_FF(
input clk,
input J,
input K,
output reg Q=0 ,
output Q_n
);
always @ (negedge clk)
begin
Q <= (J&Q_n) + ((~K)&Q);
end
assign Q_n = !Q;
endmodule
// 异步状态机
module RTL_FSM(
input clk,
output Q1,
output Q2,
output Q3,
output [2:0] Q
);
wire Q1,Q2,Q3;
assign Q = {Q3,Q2,Q1};
//驱动方程
wire J1,J2,J3;
wire K1,K2,K3;
assign J1 =!Q3;
assign J2 =1;
assign J3 =Q1&Q2;
assign K1 = 1;
assign K2 =1;
assign K3 =1;
wire Q1_n,Q2_n,Q3_n;
//状态方程
JK_FF FF0(
.clk(clk),
.J(J1),
.K(K1),
.Q(Q1),
.Q_n(Q1_n)
);
JK_FF FF1(
.clk(Q1),
.J(J2),
.K(K2),
.Q(Q2),
.Q_n(Q2_n)
);
JK_FF FF2(
.clk(clk),
.J(J3),
.K(K3),
.Q(Q3),
.Q_n(Q3_n)
);
endmodule
//整理后的写法
//JK触发器
module JK_FF(
input clk,
input J,
input K,
output reg Q=0 ,
output Q_n
);
always @ (negedge clk)
begin
Q <= (J&Q_n) + ((~K)&Q);
end
assign Q_n = !Q;
endmodule
module RTL_FSM #(
parameter DATA_WITHE = 3
)
(
input clk,
output [DATA_WITHE-1:0] Q
);
//驱动方程
wire [DATA_WITHE -1 :0] J;
wire [DATA_WITHE -1 :0] K;
assign J[0] =!Q[2];
assign J[1] =1;
assign J[2] =Q[0]&Q[1];
assign K[0] = 1;
assign K[1] =1;
assign K[2] =1;
wire [DATA_WITHE -1 :0] Q_n;
//状态方程
generate
genvar i;
for (i=0;i<DATA_WITHE;i=i+2)
begin
JK_FF FF0(
.clk(clk),
.J(J[i]),
.K(K[i]),
.Q(Q[i]),
.Q_n(Q_n[i])
);
end
endgenerate
JK_FF m2(
.clk(Q[0]),
.J(J[1]),
.K(K[1]),
.Q(Q[1]),
.Q_n(Q_n[1])
);
endmodule
其中JK初值仿真时一直不对,原来是仿真文件最开始时钟电平为0不对,改为1后没有问题了
移位寄存器
构造的二进制串行加法器