数字逻辑学习笔记03

数字逻辑学习笔记03

exdoubled Lv4

组合逻辑电路输出仅仅取决于输入值,无记忆无反馈

时序逻辑电路输出取决于输入值和之前输出值,有记忆有反馈

组合电路要求:

  • 每个电路元件本身是组合电路
  • 每个电路结点或者是一个电路的输入,或者是连接到外部电路的输出端
  • 电路不包含回路

组合逻辑分析

分析步骤

  • 确认是组合电路,不是时序电路
  • 确定输出逻辑函数/真值表
    • 由电路图,从输入到输出,写出各级逻辑表达式
    • 化简/变换逻辑表达式
    • 列出真值表
    • 分析电路功能并改进

逐级电平推导法

适用于简单电路

先假设输出逻辑为0或1,然后逐级向前推,直到确定输入的逻辑值

写出布尔表达式法

适用于复杂电路

数字波形图分析法

适用于复杂电路

真值表分析法

迫不得已的方法

组合逻辑设计

组合逻辑分析是组合逻辑分析的逆过程

  • 根据电路说明,决定需要的输入、输出数目
  • 列出定义输入和输出之间关系的真值表
  • 求出输出函数的最简表达式
  • 画出逻辑电路,并验证设计的正确性

可能的约束条件

  • 门的个数
  • 一个门的输入数目
  • 信号通过门的传输时延
  • 链接的数目
  • 每个门的驱动能力

分层设计

为了处理复杂电路,电路被分为多个简单模块,模块之间互相连接构成复杂电路

下面给出一个闰年判断器的设计方式

输入:\(A_1A_2A_3A_4B_1B_2B_3B_4C_1C_2C_3C_4D_1D_2D_3D_4\)

这里 \(ABCD\) 分别代表千百十个位

输出:\(T\)\(1\) 代表是 \(0\) 代表不是

\(D_i\) 为一个十进制四位数能被 \(i\) 整除

\(T=D_4\overline{D_{100}}+D_{400}\)

设计 \(D_i\) 的逻辑

我们记 \(X_{\bold{i}}\) 为二进制四位数 \(X_1X_2X_3X_4\) 与十进制 \(i\) 相等

\(Y_奇\) 为二进制四位数 \(Y_1Y_2Y_3Y_4\) 在十进制表示下是奇数

\(Y_{奇}=Y_{\bold{1}}+Y_{\bold{3}}+Y_{\bold{5}}+Y_{\bold{7}}+Y_{\bold{9}}\)

\(Y_偶=Y_{\bold{0}}+Y_{\bold{2}}+Y_{\bold{4}}+Y_{\bold{6}}+Y_{\bold{8}}\)

\(D_4\)

需要十进制二位数 \(\overline{CD}\) 能被 \(4\) 整除

\(C\) 为奇数,\(D\) 只能为 \(2,6\)

\(C\) 为偶数 ,\(D\) 只能为 \(0,4,8\)

\(D_4=C_奇D_2+C_奇D_6+C_偶D_0+C_偶D_4+C_偶D_8\)

\(D_{100}\)

需要十进制二位数 \(\overline{CD}\) 都为\(0\)

\(D_{100}=C_0D_0\)

\(D_{400}\)

需要能被 \(100\) 整除并且高 \(2\) 位能被 \(4\) 整除

\(D_{400}=D_{100}D_{4_{AB}}\)

最后综合即可得到

延迟、竞争与冒险

延迟

信号在器件内部通过连线和逻辑单元时,都存在延迟

  • 器件延迟:经过门电路等器件产生的延迟
  • 路径延迟:在门电路等器件间传输线上的延迟

此外,还受到器件的工艺、工作电压、温度等条件的影响

同时,信号的高低电平转换也需要一定的过渡时间

传播延迟\(t_{pd}\) :当输入改变直到一个或多个输出达到它们的最终值所经历的最长时间

最小延迟\(t_{cd}\):当一个输入发生变化直到任何一个输出开始改变的最短时间

竞争

当一个逻辑门的两个输入端信号同时(但有时间差异)反向变化

  • 临界竞争:导致错误输出
  • 非临界竞争:不产生错误输出

冒险

由竞争可能产生输出干扰脉冲的现象

毛刺、冒险:输入信号的改变导致输出信号的异常改变

毛刺不会导致什么问题

冒险的判断:代数法、卡诺图法

代数法

  • 检查表达式中是否存在具备竞争条件的变量,某变量 \(X\) 同时具有原变量和反变量
  • 若有变量 \(X\) ,消去函数中其他变量,表达式是否会变为 \(X+\overline{X}\) 或者 \(X\cdot \overline{X}\)
  • 如果存在说明有冒险

卡诺图法

如果卡诺图之间存在相切关系,则可能存在冒险,也就是圈是断开的

消除竞争冒险的方法

增加冗余项

在输出端并联电容:利用电容对电压变化的延迟特性过滤掉宽度窄的毛刺信号但是使得输出波形的边沿加宽,降低了电路的速度

选通脉冲法:不增加任何期间,利用选通脉冲,从时间上加以控制,使得输出避开危险

复用器

将多路数据中的某一路数据传送到公共数据线上,实现数据选择功能的逻辑电路

二选一复用器

比如添加一个选择的输入 \(s\)\(s\)\(0\) 时根据 \(a\) 判断,否则根据 \(b\) 判断

\(y = \overline{s}a + sb\)

\(verilog\) 中,我们有四种实现方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
module MUX21a(
input logic a,
input logic b,
input logic s,
output logic y
);

assign y = ~s & a | s & b;
// 4位二选一改为 {4{~s}} & a {4{s}} & b
endmodule

module MUX21b(
input logic a,
input logic b,
input logic s,
output logic y
);

always @(a,b,s) // always @(*) 中的 * 可以防止遗漏敏感信号
if(s == 0)
y = a;
else
y = b;
endmodule

module MUX21c(
input logic a,
input logic b,
input logic s,
output logic y
);

always_comb
case(s)
0:y=a;
1:y=b;
endcase
endmodule

module MUX21d(
input logic a,
input logic b,
input logic s,
output logic y
);

assign y = s ? a : b;
endmodule

四选一复用器

\(y = \overline{s_1}\overline{s_2}A_1+\overline{s_1}s_2A_2+s_1\overline{s_2}A_3+s_1s_2A_4\)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
module mux41_case(
input logic [3:0] in,
input logic [1:0] s,
output logic out
);

always @(*)
case(s)
0: out = in[0];
1: out = in[1];
2: out = in[2];
3: out = in[3];
default: out = in[0];
endcase
endmodule

使用二选一复用器实现四选一复用器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
module mux41(
input logic [3:0] in,
input logic [1:0] s,
output logic out
);

logic v;
logic w;

mux21 M1(
.a(c[0]),
.b(c[1]),
.s(s[0]),
.y(v)
);

mux21 M2(
.a(c[2]),
.b(c[3]),
.s(s[0]),
.y(w)
);
mux21 M3(
.a(u),
.b(v),
.s(s[1]),
.y(out)
);
endmodule

用复用器实现任意一个布尔函数

  • 根据函数式列出真值表
  • 真值表前 \(n-1\) 个变量用作数据选择器的选择输入
  • 将函数输出 \(F\) 当作最后一个变量的函数,\(F\) 可能是全 \(0\) 可能是全 \(1\) 可能是原变量,可能是反变量

分配器

将公共数据线上的数据根据需要送到不同的通道上,实现数据分配功能的逻辑电路

译码器、编码器

译码器:将具有特定含义的二进制码转换成对应输出信号的逻辑电路

编码器:用一个二进制代码表示特定含义信息的逻辑电路

\(2:4\) 译码器

\(y_0=\overline{a_1}\overline{a_0}\)

\(y_1=\overline{a_1}a_0\)

\(y_2=a_1\overline{a_0}\)

\(y_4=a_1a_2\)

1
2
3
4
5
6
7
8
9
10
11
module Decoder24Logic(
input logic [1:0] a,
output logic [3:0] y
);

assign y[0] = ~a[0] & ~a[1];
assign y[1] = ~a[0] & a[1];
assign y[2] = a[0] & ~a[1];
assign y[3] = a[0] & a[1];

endmodule

带使能端的 译码器

1
2
3
4
5
6
7
8
9
10
11
12
module Decoder24Logic(
input logic [1:0] a,
input logic enable,
output logic [3:0] y
);

assign y[0] = ~(~enable & ~a[0] & ~a[1]);
assign y[1] = ~(~enable & ~a[0] & a[1]);;
assign y[2] = ~(~enable & a[0] & ~a[1]);
assign y[3] = ~(~enable & a[0] & a[1]);

endmodule

参数化的 \(N : 2^N\) 译码器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
module Decoder24N
#(parameter N = 3)
(
input logic [N-1:0] a,
output logic [2**N-1:0] y
);

always_comb
begin
y = 0;
y[a] = 1;
end

endmodule

\(3:8\) 译码器同理

可以使用 \(3:8\) 译码器实现全加器

\(74LS38\)

74LS138_百度百科

\(4\times 16\) 译码器

可以使用两个 \(3\times 8\) 译码器或者两个 \(74LS138\) 实现

\(4:10\) 译码器:二进制-十进制译码器

将4位BCD码的10组代码翻译成10个与十进制数字符号对应的输出

\(74HC4511\) 七段数字显示译码器


\(42\) 优先编码器

优先编码器:当多个输入同时有效时,只对优先级最高的输入进行编码

真值表:

输入 D₃ D₂ D₁ D₀输出 x y V
0 0 0 0X X 0
1 0 0 00 0 1
X 1 0 00 1 1
X X 1 01 0 1
X X X 11 1 1

逻辑表达式:

  • $x = D_2 + D_3 $
  • $ y = D_3 + D_1 {D}_2 $
  • $V = D_0 + D_1 + D_2 + D_3 $

当 ( V = 0 ) 时,表示没有有效输入

1
2
3
4
5
6
7
8
9
10
11
module PriorityEncoder42(
input logic [3:0] D,
output logic [1:0] xy,
output logic V
);

assign xy[1] = D[3] | D[2];
assign xy[0] = D[3] | (D[1] & ~D[2]);
assign V = D[0] | D[1] | D[2] | D[3];

endmodule

\(74LS147\)

8421BCD码优先编码器,输入端和输出端都是低电平有效

特性:

  • 当某一个输入端为低电平0时,输出端以低电平输出对应的8421BCD编码
  • 当9个输入全为1时,4个输出也全为1,代表输入十进制数0的8421BCD反码输出

编码表:

输入十进制输出BCD码 D₃ D₂ D₁ D₀
I₀00 0 0 0
I₁10 0 0 1
I₂20 0 1 0
I₃30 0 1 1
I₄40 1 0 0
I₅50 1 0 1
I₆60 1 1 0
I₇70 1 1 1
I₈81 0 0 0
I₉91 0 0 1

逻辑表达式:

  • $ D_3 = I_8 + I_9 $
  • $ D_2 = I_4 + I_5 + I_6 + I_7 $
  • $ D_1 = I_2 + I_3 + I_6 + I_7 $
  • $ D_0 = I_1 + I_3 + I_5 + I_7 + I_9 $
1
2
3
4
5
6
7
8
9
10
11
12
module PriorityEncoder83(
input logic [9:0] I, // I[9:1]对应I9-I1,I[0]不使用
output logic [3:0] D // 输出BCD码
);

// 注意:输入低电平有效,这里假设I为低电平有效
assign D[3] = ~I[8] | ~I[9]; // I8 + I9
assign D[2] = ~I[4] | ~I[5] | ~I[6] | ~I[7]; // I4 + I5 + I6 + I7
assign D[1] = ~I[2] | ~I[3] | ~I[6] | ~I[7]; // I2 + I3 + I6 + I7
assign D[0] = ~I[1] | ~I[3] | ~I[5] | ~I[7] | ~I[9]; // I1 + I3 + I5 + I7 + I9

endmodule

移位器

二进制移位:相当于完成2幂的乘法(左移)或除法(右移)

移位类型: - 逻辑移位:左移或右移,以0填充空位 - 例:11001 LSR 1 = 01100 - 循环移位:从一端移出的位填充到另一端的空位上 - 例:11001 ROR 1 = 11100 - 算术左移位:与逻辑左移一样 - 例:11001 ASL 1 = 10010 - 算术右移位:将原来数据的最高有效位填充到新数据的最高有效位上 - 例:11001 ASR 1 = 11100(对于有符号数的乘法或除法有用)

4位移位器功能表:

s₂ s₁ s₀操作描述
000noShift无移位
001shr右移一位,左侧补0
010shl左移一位,右侧补0
011ror循环右移一位
100rol循环左移一位
101asr算术右移一位,符号位不变
110rof2循环右移两位
111noShift无移位
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 4位移位器
module Shift4(
input logic [3:0] d,
input logic [2:0] s,
output logic [3:0] y
);

always_comb
case(s)
3'b000: y = d; // noShift
3'b001: y = {1'b0, d[3:1]}; // shr
3'b010: y = {d[2:0], 1'b0}; // shl
3'b011: y = {d[0], d[3:1]}; // ror
3'b100: y = {d[2:0], d[3]}; // rol
3'b101: y = {d[3], d[3:1]}; // asr
3'b110: y = {d[1:0], d[3:2]}; // rof2
3'b111: y = d; // noShift
default: y = d;
endcase

endmodule
  • Title: 数字逻辑学习笔记03
  • Author: exdoubled
  • Created at : 2025-10-22 08:00:00
  • Updated at : 2025-12-02 09:00:16
  • Link: https://github.com/exdoubled/exdoubled.github.io.git/szlj/szlj03/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments