Skip to content

P3

实验内容

实验一 :计数器实验

  • 构建 4 位同步二进制计数器 CNTR4U子电路。

整体方案设计

输入输出引脚
  • CLK:时钟脉冲
  • D0~D3:用于装载的数据
  • LD:装载标志,即标志是否从D进行装置
  • CLR:重置标志,表示是否将Q置0
  • ENT、ENP:控制是否锁定计数器,即是否自增
  • Q:4位输出
  • RCO:是否已达最大值,即Q是否全为1

电路图

  • image-20231104173932779
  • image-20231104174322435

仿真测试

  • 首先进行自增测试,测试enp、ent=1时能否实现每次时钟脉冲结果加1
  • image-20231104174702277
  • clr测试,将clr置为1,再进行一次时钟脉冲
  • image-20231104174749800
  • LD测试,将LD设置为true,测试从D进行装载
  • image-20231104175004283
  • 测试使用ENP、ENT锁定
  • image-20231104175057558

错误现象及分析

  • 在完成实验的过程中,没有遇到任何错误。

实验二 :数字时钟实验

  • 显示时分秒 6 个 BCD 码数字,到 23:59:59 后清零,同时蜂鸣 1 秒,到整点时点亮 LED 灯 1 秒,可设置 BCD 码格式的初始时间。

整体方案设计

输入输出引脚
  • CLK:时钟脉冲
  • LD:读取
  • hh-sl:输入的初始时间
  • h1-s0:当前的时间

电路图

  • 主电路
  • image-20231104234208395

  • 设计思路

  • 采用同步设计,即时钟脉冲直接连接到了全部6个计数器
  • 但是不是每次没冲所有位都需要加1,只有秒的个位每次加以,其他变化都是由进位造成的。使用比较模块判断一位及之前是否已经全部最大,即将要发生进位,如果发生,则将自身的CLR置为1,即进位后清零,将下一位的ENT置为1,使得在下一次脉冲中下一位会加以即进位
  • LD直接连接到所有计数器,但LD置为1时,在下一次脉冲时会将时间进行赋值
  • 此外当除了小时之外全部是0时led亮起;小时也为0时喇叭也响起

  • 比较模块(用于比较两个4位数是否相同)

  • image-20231104234335308

仿真测试

  • 23:59:59进位测试:
  • image-20231104235457485
  • image-20231104235510228
  • image-20231104235523363
  • 整点测试:
  • image-20231104235937979
  • image-20231104235953191

错误现象及分析

  • 在完成实验的过程中,没有遇到任何错误。

实验三 :移位寄存器实验

  • 构建 4 位通用移位寄存器SHRG4U 子电路

整体方案设计

输入输出引脚
  • CLK:时钟脉冲
  • LIN/RIN:左移/右移的移入位
  • CLR:清0标志位
  • ABCD:要装载的值
  • QA-QD:输出结果
  • S1S0:运算模式的选择

电路图

  • image-20231105105314761
  • 二进制随机生成器
  • image-20231105105359030

仿真测试

  • 生成的二进制序列

  • 序号 序列
    1 1000
    2 0100
    3 0010
    4 1001
    5 1100
    6 0110
    7 1011
    8 0101
    9 1010
    10 1101
    11 1110
    12 1111
    13 0111
    14 0011
    15 0001
    16 1000
    17 0111
    18 0010
    19 1001
    20 1100

错误现象及分析

  • 在完成实验的过程中,没有遇到任何错误。

实验四 :4 位无符号数乘法器

  • 实现两个四位二进制无符号数相乘的功能

整体方案设计

输入输出引脚
  • XY:乘数和被乘数
  • Z:计算结果
  • RST:重置电路,并加载新的乘数和被乘数

电路图

  • 设计思路

  • 与实现时钟的思路类似,使用cmp模块用于给计数器的ENT赋值进而控制计算(移位次数)
  • 时钟信号负责控制寄存器,寄存器会存储上次的运算结果用于本次运算
  • 每次运算需要取低位判断是否要i加上一个乘数,之后再进行移动操作

仿真测试

  • 3*5=15
  • image-20231105163527936
  • 9*7=63
  • image-20231105163606134

错误现象及分析

  • 最初没有考虑加法进位的问题,计算较大的数如13*13会出现错误。
  • 改进:增加一个选择器,发生进位时移入1
  • image-20231105185307597

实验五 :寄存器堆实验

  • 实现具有读写功能的寄存器堆电路

整体方案设计

输入输出引脚
  • RW:指示要写入的寄存器,经过译码器
  • CLK:时钟脉冲
  • RA:要读取的寄存器A
  • RB:要读取的寄存器B
  • RDA:寄存器A的读取结果
  • RDB:寄存器B的读取结果
  • Din:要写入的数据
  • WE:是否开启写入

电路图

  • image-20231105122213223
  • 连接测试电路
  • image-20231105122556994

仿真测试

  • 将7写入寄存器2,13写入寄存器22,并读取进行验证
  • image-20231105122927802
  • image-20231105123021059
  • image-20231105123010638

错误现象及分析

  • 在完成实验的过程中,没有遇到任何错误。

思考题

实现闹钟功能

  • image-20231104234241626
  • 如图所示增加一个闹钟模块,thh-tsl时设定的闹钟时间,当到达时间之后会将sound2置为1,喇叭响起;之后只需点击两下off,就会将sound2重新置为0,关闭闹钟
  • 到达时间后闹钟响起
    • image-20231104235104911
  • 使用off关闭闹钟
    • image-20231104235259779

实现 4 位 Booth 乘法器的功能

  • 电路图
  • 思路:
  • 在无符号乘法器上修改,主要修改右侧的部分
  • 首先增添一个寄存器存储\(y_{-1}\)的值,并使用时钟脉冲控制更新
  • 使用比较器比较\(y_{-1}\)\(y_0\)再经过编码后传递给选择器,对应\(+-X\)以及不变三种情况
  • 测试
  • \(-7*4=-28\)
  • \(-8*-8=64\)

实现4 位无符号数除法器

  • 电路图
  • 实现思路
  • 左侧复用乘法的计数器,但是除法要多做一次(n+1)
  • 右侧使用加减交替法,根据最高位判断是+y还是-y
  • 测试
  • \(5/2=2\dots1\)
    • image-20231106012928081
  • \(7/3=2\dots1\)

    • image-20231106012857816
  • 遇到的问题,5/2这个一直算不对,仔细阅读ppt发现

  • 最后一次上商为“0”的话,需要“纠余”处理,即把试商时被减掉的除数加回去,恢复真正的余数。(为1则不需要)
  • 添加右下角电路后解决