跳转至

数字电路实验

verilator + gtkwave

  • 如何在 代码里 里设置 top.v 生成的双控开关, 如何加载 元器件。

  • 为什么 git 提交不会自动同步到 tracer 分支

    由于使用zsh运行的makefile,zsh中的配置文件没有 $(NEMU) 环境变量的定义, 所以调用 git-commit 函数失效

  • 运行 NVBoard 后一段时间,程序无响应是正常现象吗

  • 需要研究 nvboard 中的 Makefile, 再尝试将我们的双控开关接入到 NVboard 实例工程有几大模块

    • 15-8: 流水灯
    • 0-7 : 开关控制亮灭
    • 数码管
    • VGA 显示屏

    constr/top.nxdc 这个文件是引脚的描述文件,之后基于这个脚本文件,生成对应的 cpp 代码

    Makefile 使用 verilator 和 cpp 源文件、verilog 源文件、生成的 auto_bind.cpp 以及 nvboard 的静态链接库文件 生成 可执行文件

    cpp 文件主要是加载 auto_bind.cpp 里的函数

  • 绑定引脚成功,但是led灯的输出不受开关的控制

    没有使用 clk pin 同步时钟

Lab01 选择器

DDCA ch02

组合逻辑电路与时序逻辑电路

  • 组合逻辑电路的输出仅取决于输入
  • 时序逻辑电路的输出不仅取决于当前的输入,还取决于过去的输入状态。(或者说输入序列)

组合逻辑电路满足什么样的条件?

  1. 组成电路的每一个电路本身是组合的
  2. 每一个节点要么是输入,要么是输出
  3. 没有环路

卡诺图

  • Grey code: 00 01 11 10

左右相接

  • 用最少的圆包含所有的 1
  • 圆内的项必须是 1
  • 圆内包含的项的个数必须是 \(2^n\)
  • 每一个圆越大越好 (可重叠 因为 同一性)

列真值表

选择器实现

  • NR_KEY: 键值对的数量
  • KEY_LEN: 选择信号(key)的宽度
  • DATA_LEN: (value) 值的宽度

Lab02 译码器和编码器

译码器: 将输入信息转化为特定输出信息

e.g. 根据输入,输出 8 个 二极管的电路状态

编码器: 给多个输入信号编号 (多个输入,哪一个输入有信号,就显示这个输入的编码)

verilog, casez 的 entry 可以使用 z 表示 0/1 都行

Lab3 ALU

选择器,输入,输出,各种标志位

区分进位和溢出

  • 进位 正数+正数 还是正数
  • 溢出 正数加正数 变成负数;负数加负数 变成 正数

一个运算中,可能会触发进位和借位

Lab6 线性移位寄存器

Lab7 矩阵键盘检测

What Have You Learnt ?

  • 如何比较两个有符号数的大小关系。

    \(\text{less} = \text{OF} \oplus \text{results[} n - 1\text{]}\)

  • 设计 Soc 过程中,所使用到的软件和技术是什么。

  • 什么是硬件编程,什么是软件编程。
    • 硬件编程:通过 硬件描述语言(HDL)来定义硬件结构。(比如使用 vivado 编写 verilog)
    • 软件编程:通过 高级语言生成 .hex 文件,加载到硬件的 ROM 中,操控硬件完成任务 (比如使用 keil 写 c 语言) Modelsim 仿真软件。可将编写的 hex 文件内容加载到 HDL 所描述的硬件中去。
  • 熟悉 verilog 语法, 更深刻的理解了 硬件描述语言的含意

  • 目前编写的 alu 效率太低,考虑之后进行优化

颜色主题调整

评论区~