数字系统设计基础是电子工程、计算机科学及相关专业的重要课程内容,涵盖从布尔代数到复杂时序逻辑系统的完整设计流程。其目标是使用数字逻辑器件(如门电路、触发器、寄存器等)实现特定功能的系统,例如计数器、状态机、运算单元等。
一、数字系统的基本组成
-
组合逻辑电路
- 输出仅取决于当前输入。
- 常见模块:加法器、多路选择器(MUX)、译码器、编码器、比较器。
- 设计方法:真值表 → 卡诺图化简 → 逻辑表达式 → 门级实现。
-
时序逻辑电路
- 输出依赖于当前输入和历史状态(具有记忆功能)。
- 核心元件:触发器(D、JK、T、SR)、寄存器、计数器。
- 分类:
- 同步时序系统:统一时钟驱动。
- 异步时序系统:无全局时钟,靠信号变化触发。
-
存储单元
- RAM、ROM、FIFO 等用于数据暂存或程序存储。
-
控制单元与数据通路
- 控制单元产生控制信号,指挥数据通路中的操作(如 ALU 运算、寄存器传输)。
二、数字系统设计流程
| 步骤 | 内容 |
|---|---|
| 1. 需求分析 | 明确系统功能(如“设计一个自动售货机控制器”) |
| 2. 系统建模 | 使用状态图、ASM 图、流程图描述行为 |
| 3. 模块划分 | 将系统分解为控制单元 + 数据通路 |
| 4. 组合与时序逻辑设计 | 设计各子模块(如用 D 触发器构建寄存器) |
| 5. 状态分配与编码 | 给每个状态赋予二进制码(优先使用格雷码减少竞争) |
| 6. 求驱动方程与输出方程 | 利用卡诺图化简激励函数(如 D = f(Q, X)) |
| 7. 逻辑实现 | 用门电路、触发器、中规模集成电路(MSI)搭建电路 |
| 8. 仿真验证 | 使用工具(如 ModelSim、Logisim)测试功能正确性 |
| 9. 综合与实现(FPGA/CPLD) | 转换为硬件可编程语言(Verilog/VHDL)并下载 |
三、关键理论与技术
1. 布尔代数与逻辑化简
- 基本定律:交换律、结合律、分配律、德摩根定律。
- 化简方法:
- 公式法
- 卡诺图(适合变量 ≤ 4)
- Q-M 法(Quine-McCluskey,适用于自动化)
2. 编码方式
- 二进制编码:高效但可能引起多位跳变。
- 格雷码:相邻状态仅一位不同,降低竞争风险。
- One-hot 编码:每状态对应一位,速度快但资源消耗大。
3. 触发器及其应用
| 类型 | 特性 | 应用场景 |
|---|---|---|
| D 触发器 | Q⁺ = D | 最常用,适合同步设计 |
| JK 触发器 | 功能全,可翻转 | 复杂状态机 |
| T 触发器 | Q⁺ = Q ⊕ T | 计数器 |
| SR 触发器 | 简单锁存 | 异步控制 |
4. 有限状态机(FSM)
- Moore 型:输出只与状态有关。
- Mealy 型:输出与状态和输入都相关。
- 设计步骤:
- 建立状态图
- 构造状态表
- 状态化简
- 状态编码
- 求驱动方程
- 实现电路
5. 数据通路设计
- 包括:
- 寄存器组
- 算术逻辑单元(ALU)
- 总线结构
- 移位器、乘法器等
- 支持寄存器传输语言(RTL)描述操作,如:
if (start) R3 <= R1 + R2;
6. 控制器设计
- 微程序控制 or 硬连线控制
- 使用状态机生成控制信号序列。
四、典型设计实例:模5计数器
// 使用三个 D 触发器实现模5计数器(0→1→2→3→4→0)
module mod5_counter (
input clk, reset,
output reg [2:0] Q
);
always @(posedge clk or posedge reset) begin
if (reset)
Q <= 3'b000;
else case (Q)
3'b000: Q <= 3'b001;
3'b001: Q <= 3'b010;
3'b010: Q <= 3'b011;
3'b011: Q <= 3'b100;
3'b100: Q <= 3'b000;
default: Q <= 3'b000;
endcase
end
endmodule
可通过卡诺图化简得到驱动方程,再用门电路实现。
五、现代实现平台
| 平台 | 特点 |
|---|---|
| FPGA(现场可编程门阵列) | 高灵活性,支持大规模集成 |
| CPLD(复杂可编程逻辑器件) | 中小规模,非易失性 |
| ASIC(专用集成电路) | 高性能、低成本量产,开发周期长 |
| EDA 工具 | Quartus、Vivado、ModelSim、Logisim(教学) |
在数字系统设计中,当多个输出逻辑函数共享相同的输入变量时,可以利用卡诺图进行联合化简(也称多输出最小化),以提取公共项、减少重复逻辑门,从而优化整体电路的面积和功耗。
一、基本思想
传统的单输出卡诺图化简只关注一个函数的最小化。而联合化简考虑多个输出函数之间的共性,允许牺牲某个函数的“最简”形式,换取整体逻辑更优。
目标:不是每个输出都达到最简,而是整体门数最少、共享乘积项最多。
二、联合化简步骤
-
为每个输出画独立的卡诺图
- 所有函数使用相同的输入变量排列。
- 标出每个函数的“1”格和无关项(×)。
-
识别各个函数的质蕴涵项(Prime Implicants)
- 分别找出每个函数的所有最大圈(即质蕴涵项)。
-
寻找公共质蕴涵项(Common Prime Implicants)
- 检查不同函数之间是否有重叠的“1”格区域。
- 若某乘积项同时出现在多个函数中,则可被共享。
-
构造合并卡诺图或列表分析
- 使用表格法(如Q-M扩展)辅助判断哪些项应优先选取。
- 考虑:
- 是否覆盖所有“1”
- 是否能复用已有逻辑
- 是否引入冗余成本更低
-
选择最优覆盖集(考虑共享代价)
- 优先选择能够服务于多个输出的乘积项。
- 即使某个函数单独看不是最简,但若节省了总门数则更优。
-
写出最终表达式并实现电路
- 共享项只需实现一次,通过连线分配给多个输出。
三、示例:两个输出函数的联合化简
设输入为 A, B, C,有两个输出函数:
- F₁(A,B,C) = Σm(0,1,2,4)
- F₂(A,B,C) = Σm(0,1,3,5)
步骤 1:分别画出卡诺图
BC
A 00 01 11 10
---------------
0 | 1 1 0 1 ← F₁
1 | 1 1 0 0
BC
A 00 01 11 10
---------------
0 | 1 1 1 0 ← F₂
1 | 1 1 1 0
步骤 2:单独化简
- F₁ = A’B’ + A’C’ (或 B’C’)
- F₂ = A’B + AB’ + A’C’?不!实际:
- 更好方式:F₂ = B
→ 实际上 F₂ 的卡诺图显示其值仅取决于 B:当 B=1 时输出为1(除了A=1,B=1,C=0未定义),但注意 m3 和 m5 是1 → 实际上是 F₂ = B
再检查:
m0=000 → B=0 ❌ 不符合
错误!重新分析:
F₂ = Σm(0,1,3,5) = A’B’C’ + A’B’C + A’BC + AB’C
分组:
- A’B’C’ + A’B’C = A’B’
- A’B’C + A’BC = A’C
- A’BC + AB’C = BC? 不连续
正确化简:
- 圈 (0,1): A’B’
- 圈 (1,3): A’C
- 圈 (3,5): BC? 但位置不对 → 只能圈竖直对:m1+m3=A’C;m5 单独?
更好方法:
F₂ 卡诺图中:
- 第0列全为1(BC=00)→ A’B’C’ 和 AB’C’ → 得 B’C’
- 第1列前两个为1(A’B’C 和 A’BC)→ A’C
所以 F₂ = B’C’ + A’C
但观察发现:m0,m1,m3,m5 → 实际上是 F₂ = A’ + B’C’
验证:
- A’=1 → 输出1 ✅
- A=1 且 B’C’=1 → 即 ABC=100 → m4,不在集合 ❌
修正:列出真值表更清晰。
| A B C | F₁ | F₂ |
|---|---|---|
| 0 0 0 | 1 | 1 → m0 |
| 0 0 1 | 1 | 1 → m1 |
| 0 1 0 | 1 | 0 → m2 |
| 0 1 1 | 0 | 1 → m3 |
| 1 0 0 | 1 | 0 → m4 |
| 1 0 1 | 0 | 1 → m5 |
| 1 1 0 | 0 | 0 |
| 1 1 1 | 0 | 0 |
现在重画卡诺图:
F₁:
BC
A 00 01 11 10
----------
0 | 1 1 0 1
1 | 1 0 0 0
→ F₁ = A'B'C' + A'B'C + A'BC' + AB'C' = A'C' + B'C' (因为前三项含C',最后AB'C')
→ 化简得:F₁ = C' + A'B (错误)
正确圈法:
- 横圈 m0,m1: A'B'
- 竖圈 m0,m4: B'C'
- m2 单独:A'B C'
→ 最佳:F₁ = A'B' + B'C' + A'BC'
但可进一步:m0,m1,m2 → A'(只要A'=1且C≠11)→ A'(B'+C')?
标准答案:F₁ = A'B' + A'C' + B'C'?存在冗余。
实际最小化:F₁ = A'C' + B'C' + A'B'C → 不简洁。
使用卡诺图圈最大项:
- 圈左上四格?不行(m3=0)
- 可圈 m0,m1,m4 → 不相邻
最终:F₁ = A'B' + A'C' + B'C'?测试 m4=1 → AB'C'=1 → 包含在 B'C' 中 ✅
m2=A'BC'=1 → 包含在 A'C' 中 ✅
所以:**F₁ = A'B' + B'C'**?m1=A'B'C=1 → 在 A'B' 中 ✅
但 m2 不在其中 → A'B'C'?m2 是 A'BC' → 需要 A'C'
→ 正确结果:**F₁ = A'C' + B'C' + A'B'C**?太复杂
最佳:**F₁ = A'C' + B'C'**
验证:
- m0: A'C'=1 ✅
- m1: A'C'=1 ✅
- m2: A'C'=1 ✅
- m4: B'C'=1 ✅
→ 全部满足!
所以 **F₁ = A'C' + B'C'**
同理 F₂ = Σm(0,1,3,5)
卡诺图:
BC
A 00 01 11 10
----------
0 | 1 1 1 0
1 | 0 1 0 0
→ m0,m1,m3: A’(第一行前三列)→ A’
→ m1,m5: B’C?但 m5=101 → B’C=1 → yes
→ 实际:m1 和 m5 是 B’C,但不连通
圈法:
- 第一行前三项:A’B’ + A’B = A’(覆盖 m0,m1,m3)
- 加上 m5: AB’C → 单独一项
→ F₂ = A’ + AB’C
但 AB’C = B’C(因A=1)
所以 F₂ = A’ + B’C
验证:
- m0: A’=1 ✅
- m1: A’=1 ✅
- m3: A’=1 ✅
- m5: B’C=1 (B=0,C=1) ✅
→ 成立!
所以:
- F₁ = A’C’ + B’C’
- F₂ = A’ + B’C
现在进行联合化简分析:
- 公共项?A’ 出现在两者中吗?
- F₁ 含 A’C’ → 子集于 A’
- F₂ 含 A’
- 但没有完全相同的乘积项。
然而我们可以考虑是否让 F₁ 使用 A’ 来替代部分项?不可行,因为 A’ 太宽。
但注意到:
- F₁ 中的 B’C’ 和 F₂ 中的 B’C 不能共享。
- A’C’ 和 A’ 也无法直接共享。
→ 无直接共享项
但如果我们在电路上先生成 A’ 信号,则可用于两个函数中的相关项,减少反相器数量。
此外,若将 F₁ 改写为:F₁ = C’(A’ + B’)
F₂ = A’ + B’C
仍无显著共享。
结论:此例中无法通过联合化简显著减少逻辑门数,但可通过预计算 A’、B’、C’ 等信号实现资源共享。
四、提高共享性的技巧
- 引入中间信号
- 如预先生成 A’, AB, B+C 等常用组合。
- 使用与非-与非结构统一实现
- 将所有函数转换为 NAND 形式,便于集成。
- 采用多级逻辑综合工具
- 如 Espresso、ABC 工具自动识别共享项。
- 状态编码优化
- 在 FSM 设计中选择有利于输出共享的状态编码。


90

被折叠的 条评论
为什么被折叠?



