计组P0总结

本文最后更新于 2024年9月25日 早上

P0Q4:Logisim中的FSM

通过搭建Mealy状态机来实现正则表达式的检测

首先要分清Mealy状态机和Moore状态机在Logisim电路搭建中的区别

Mealy状态机与Moore状态机

Mealy状态机

Mealy状态机基本框架(同步复位)

Mealy状态机的输出由当前状态和输入两者共同决定

Moore状态机

Moore状态机框架(异步复位)

Moore状态机的输出由当前状态决定

解题步骤

对于本题Mealy状态机,我们分以下四步完成搭建.

  1. 确定状态编码,画出状态转移
  2. 搭建Mealy状态机框架,确定复位方式
  3. 实现状态转移的Logisim电路
  4. 实现输出逻辑的Logisim电路

确定状态编码,画出状态转移

编码 状态
S0 IDLE(空闲,当reset置1时回到此状态)
S1 "b"
S2 "bb"
S3 "ba","bc","bba"或"bbc"
S4 满足正则表达式的状态
状态转移图

搭建Mealy状态机框架,确定复位方式

Mealy状态机+同步复位

实现状态转移的Logisim电路

确定In与state

通过comparator联通对应的tunnel

确定输入In
确定上一个状态state
根据状态转移图搭建变换关系电路

通过与非门与multiplexer,实现变换关系.这里我们以s1为例说明,若s1与b均为1,则nxt置2,反之置为0.

S1状态可能出现的下一个状态
输出下一个状态

利用或门性质,对于这13个输入,只有其中一个是有效的,其余皆为0(我在这里还加入了一个实际上无效果的\(s4\rightarrow s0\),便于检查)

输出下一个状态

实现输出逻辑的Logisim电路

考虑输入和当前状态两者,只有它们所决定的下一个状态为s4时,output才为1,否则为0

输出逻辑

思考

1

状态存储器的复位方式包括异步复位同步复位,二者的定义分别是什么?两种复位方式在 Verilog 中可以通过什么语句句式实现?在 Logisim 中又可以通过什么样的电路框架实现?

同步复位:当时钟信号的上升沿到来时,若复位信号有效,对系统进行复位.

异步复位:当复位信号有效时,立即对系统进行复位.这一过程与时钟信号无关.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 同步复位
module synchronous_reset(
input a,
input b,
input clk,
input reset,
output c);
always @(posedge clk)begin
if (reset)begin
c <= 0;
end else begin
c <= a & b;
end
end
endmodule
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 异步复位
module asynchronous_reset(
input a,
input b,
input clk,
input areset,
output c);
always @(posedge clk or posedge areset)begin
if (areset)begin
c <= 0;
end else begin
c <= a & b;
end
end
endmodule

在Logisim中,寄存器的clear端口可以很方便地实现异步复位,而同步复位需要在信号输入D端口前加上一个multplexer,由areset决定信号不变还是置0,待下一次时钟信号上升沿输入寄存器

异步复位
同步复位

2

在 Verilog 中我们可以通过initial块对状态存储器的初值进行定义,在 Logisim 中我们可以通过哪些电路框架实现赋初值的功能?

要实现对于是否处于初始状态的判断,我们需要用到Counter和plexer,基本逻辑框架如下

使用Counter实现初始赋值

基于此,我们可以实现一个带有初始赋值功能的寄存器

带有初始赋值功能的寄存器

P0Q1:CRC 校验码计算电路的设计与测试

设计模二除法器

模二除法器端口

注:本题不需要用到D端口

模二除法器

使用四位模二除法器搭建 8 位 CRC 校验码计算电路

CRC校验码计算电路

P0Q2:实现GRF

端口

端口
功能
端口电路

主要部件

32个32位寄存器
选择器组件

问题

三态

在选择器组件中,我们必须将DMX(demultiplexer)中的three-state设置为yes

启用three-state后,会控制demultiplexer的输入输出端口进入高阻态

示例电路

先设定DMX的three-state为no,WE为1,IN为1,SEL为0,在时钟信号上升沿:

OUT1为高电平

可以看到寄存器1存储值为1,OUT1为高电平

接着再令SEL为1,在下一个时钟上升沿:

OUT1恢复为低电平,OUT2变为高电平

可以看到OUT1恢复为低电平,OUT2变为高电平,这其实并不符合我们的本意.OUT1此刻应该保持为高电平,且寄存器1不应该改变值为0.

最简便的对策就是勾选three-state,这样DMX的输出端口在未被SEL信号选中的时候会输出高阻值(X),避免对连接的寄存器和输出端口产生影响.

P0附加题:ftoi

主电路
normalize
补码器

计组P0总结
https://meteor041.git.io/2024/09/24/计组P0总结/
作者
meteor041
发布于
2024年9月24日
许可协议