当前位置 : 主页 > 编程语言 > 其它开发 >

数字逻辑实践6

来源:互联网 收集:自由互联 发布时间:2022-05-20
数字逻辑是计算机组成与体系结构的前导课,两者之间我想需要一个衔接,主要内容为回顾数字逻辑基础知识与逻辑元件的代码打包。 00 一些前言 数字逻辑是计算机组成与体系结构的
数字逻辑实践6-> 从数字逻辑到计算机组成 | 逻辑元件总结与注意事项 数字逻辑是计算机组成与体系结构的前导课,两者之间我想需要一个衔接,主要内容为回顾数字逻辑基础知识与逻辑元件的代码打包。 00 一些前言

数字逻辑是计算机组成与体系结构的前导课,但是在两者的衔接之间并没有那么流畅,比如对面向硬件电路的设计思路缺乏。这篇总结是在数字逻辑和计组体系结构的衔接阶段进行的。

虽然这篇文是两门课的交接,也算是两个系列的一种过渡,但不代表我的数字逻辑部分就已经完成,这个系列后续会继续更新FPGA的小项目记录,以及阅读笔记等等。

本文主要是对于这个视频的笔记,我觉得很有用,加之此前我的实验报告由于课程关系不好直接往网上发,所以在这里整理一部分代码留作黑箱子。后续还会根据课程老师的要求对本文进行补充和优化:

从数字逻辑到计算机组成原理

01 前提准备
  1. 工具:仿真、综合工具的熟练Vivado和编辑器
  2. 面向硬件电路的设计思路
  3. 要学会造CPU,而不是只会背课本。所以我打算加入试点班。
02 回顾数字逻辑 02-1 数值表示 | 原码补码 | 逻辑门 | 布尔代数
  • 数值和数制:
    • 重点是二进制、十六进制;
  • 数值的原码表示和补码表示:
    • 有符号数和无符号数
    • 加减溢出问题;
  • 基本逻辑门:
    • 与或非、NAND;
    • 以及CMOS门电路;
  • 布尔代数:
    • 逻辑表达式;
    • 真值表;
    • 逻辑运算律;
    • 卡诺图;
02-2 译码器等器件

这部分基本上涵盖了上学期数字逻辑的所有实验,所以是数字逻辑里比较重要的部分。

  • n-2n译码器Decoder;
  • 数据选择器MUX;
  • 一位全加器,串行进位多位全加器;
  • 锁存器和触发器;
  • 传并行加载转换器等;
  • 触发器的时序分析、延迟分析;
  • 计数器;
  • 移位寄存器;
  • 状态机设计;
02-3 原理部分
  • 组合逻辑电路和时序逻辑电路的原理
  • 只读存储器ROM基本原理
  • 随机存储器RAM基本原理
  • 动态存储器DRAM基本原理
  • 现场可编程门阵列FPGA基本原理

这部分我的数字逻辑课程是没有讲解的,但后续我会继续了解,毕竟是课程相关的东西。

03 主要过渡内容 03-1 Verilog

这是一个硬件语言,我此前也写过数字逻辑实践4->面向硬件电路的设计思维--FPGA设计总述,就是在描述Verilog与高级语言软件思路的不同。

03-1-1 怎么学
  • 采用RTL(Register Transfer Level,寄存器传输级)设计;
  • 使用限制的可综合子集
  • 将自己实现的代码和参考代码对比思考
03-1-2 面向硬件电路的设计思路
  • 谨记这不是在写代码,而是在设计电路(并行);
  • 先进行(设想)电路结构设计,再进行Verilog代码编写;
  • 遵循自顶向下、模块划分、逐层细化的设计步骤;
  • 不要写一点、试一下、改一点、再试一下,这样效率很低;
⭐03-1-3 可综合代码Verilog(限制版)

在写CPU时,主要使用以下语法,其他的尽量不要使用:

  • 模块声明module endmodule
  • 端口声明input output inout
  • 线网数据类型 wire
  • 变量数据类型 reg,integer
  • 参数常量 (parameter constants)
  • 整型数 (literal integer numbers)
  • 模块实例化
  • 连续赋值语句assgin
  • always结构化语句
  • begin...end块
  • 阻塞赋值=和非阻塞赋值<=
  • 条件判断语句if,if...else,case
  • for循环
  • 组合逻辑敏感列表的 @*
  • 多维数组(寄存器堆)
  • generate表达式
03-1-4 代码风格建议(要求)
  1. 数据通路上的组合逻辑用assign写,禁止用always写;controller中可以用,datapath不可以。

  2. 用always写组合逻辑的时候,只允许出现在生成状态机的next state的时候,且该语句中只能出现阻塞赋值=;

  3. 写时序逻辑的时候,always语句中,只允许出现非阻塞赋值(<=);

  4. 寄存器堆封装成单独的模块,以实例化的方式使用;

  5. case语句在任何情况下都要有default

    • 这一点在上一篇文章也提到过;保证了安全性和没实现指令的放置;
  6. 模块实例化时候的参数和端口只允许用名字相关的方式进行赋值和连接;

    就是实例化的时候用名字对应的方式来确保实例化不会错位;

    即这种方式

上一篇:在java的继承中你是否有这样的疑惑?
下一篇:没有了
网友评论