数字电路实验
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
组合逻辑电路与时序逻辑电路
- 组合逻辑电路的输出仅取决于输入
- 时序逻辑电路的输出不仅取决于当前的输入,还取决于过去的输入状态。(或者说输入序列)
组合逻辑电路满足什么样的条件?
- 组成电路的每一个电路本身是组合的
- 每一个节点要么是输入,要么是输出
- 没有环路
卡诺图
- 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 效率太低,考虑之后进行优化