学习笔记01【数字电路与逻辑设计】

第一章.逻辑设计概述及Vivado基础。
  

  • VerilogHDL语言要素和设计流程
verilog主要通过 定义模块来描述基本的硬件单元,模块内再分 端口声明、数据声明、电路功能描述等。

  • 注意事项:

  1. VerilogHDL通过定义标识符赋予对象唯一的名称。由字母、数字、下划线、和$组成。$通常时用于命名一个系统任务或者函数。第一个字符必须是字母或者下划线!
  2. 预定义的关键词不可以使用。
  3. 大小写敏感(VHDL不敏感)
  4. 空格不敏感,注释用法同C++

  • FPGA和CPLD简介。
  1. FPGA:现场可编程门阵列。
    提供丰富的可编程逻辑资源、易用的存储或运算功能模块和良好的性能
  2. CPLD:复杂可编程逻辑器件:
是一种比PLD复杂的逻辑原件,与FPGA相比CPLD提供的逻辑资源相对较少,但是经典的CPLD构架提供了非常好的组合逻辑实现能力和片内信号延时时间可预测性。


第二章.布尔代数和VerilogHDL基础


布尔代数
  • 运算律
  1. 交换律
  2. 结合律
  3. 分配律
  4. 联合律
  5. 吸收律

  • 布尔代数的基本规则
  1. 带入规则 变量代换后式子仍成立
  2. 反演规则(对偶的式子)或与互换,01互换,取反互换

  • 布尔代数化简
最大项和最小项
最简形式转化为最大项利用的公式:
AB+C=(A+C)(B+C);C~C=0;
最简式转化为最小项利用的公式:
AB=AB(C+~C);( 吸收律和分配律的结合

  • VerilogHDL语言基础
学习笔记01【数字电路与逻辑设计】_第1张图片
模块是Verilog语言的基本组成单元,模块可以用下面任何一种建模方法(或一个组合)来描述:

  1.  用实例化(instantiation)预定义基本逻辑门(primitive gates)或用户自定义的门电路进行门级建模(Gate level modeling);
学习笔记01【数字电路与逻辑设计】_第2张图片
2. 用关键字为assign的连续赋值(continuous assignment)语句进 数据流建模(Dataflow modeling);描述布尔方程(使用大量运算符用于二进制操作数来产生所需的  结果)
  • 采用连续赋值的方法,关键字是assign; 
  • 连续赋值语句是对wire型数据赋值的说明; 
  • wire型用来反映元件之间的物理连接;
学习笔记01【数字电路与逻辑设计】_第3张图片

3. 用关键字为always的过程赋值(procedural assignment)语句进 行行为建模(Behavioral modeling);
  • 行为建模:在功能 算法层次上描述数字电路 
  •  使用关键字always,主要用于描述时序电路,但也可以描述组合电路; 
  • 采用过程赋值的方法,目标输出的数据类型必须声明为reg型
学习笔记01【数字电路与逻辑设计】_第4张图片


  1. VerilogHDKL模块声明
module代表一个基本的功能单元。一个模块可以是:一个元件、低层次的模块组合……
module通过接口(输入和输出端)被高层次的模块调用(内部被封装了起来,类似与C++中的类的对象)
module被调用的时候需要创建实际的对象(实例化)【模块不能嵌套定义】
模块内部组成部分:
变量声明 
数据流语句
低层模块实例
行为语句
任务和函数(模块的排列顺序无要求)

2.VerilogHDL端口声明:
对于外部环境来说模块内部不可见,module的调用只通过端口进行。
端口的三种类型:
input 从外界读取数据的接口,模块内不可写
output 模块往外输出数据的接口,模块内不可读
inout 可读可写,数据双向流动。

端口默认为wire型,若希望输入能够保存数据,则把他声明成reg型。

(从模块内部向外看):输入端口必须是wire型。(从模块外部看,输入端口可以连接着reg或wire型)

端口与外部信号的连接
1.按顺序连接:
实例的信号必须和声明时的顺序一致。
module Top;
    reg A,B;
    reg CIN;
    wire SUM,COUNT;
    //下面实例化一个全加器,假设之前已经定义好了
    fulladder adder(A,B,CIN,SUM,COUT);
    
endmodule

module fulladder(a,b,cin,sum,cout);
    //端口声明
    input a,b,cin;
    output sum,cout;
    //端口声明结束;
    
    ……
endmodule           
2.按名字连接
在大型设计中会有许多端口,不方便记忆使用。

端口连接按任意次序出现,只要保证端口和外部信号的正确匹配即可。 

//信号按名字连接
full adder adder(.sum(SUM),.count(COUNT),.a(A),.b(B),.cin(CIN),);
  3.VerilogHDL数据类型声明
wire型 reg型 memory型 parameter型
常常用在assign中 常常用在always模块内 一个寄存器数组 定义常量,表示一个常数。
wire型和reg型的区别在于wire型需要持续的驱动,reg型保持最后一次赋值。 always中被赋值的变量必须时reg型的,数据默认值是未知的 通过扩展reg型数据的地址来达到二维数组的效果  
wire[n-1:0] a,b,c……,; reg[n-1:0] a,b,c,……,; reg[n-1:0] 存储器名 [m-1:0];  
  reg可以直接赋值,而memory则不可以直接赋值;
要给memory赋值必须要制定地址,eg:
rom[0]=2'b00……
(rom[0] 地址)
寄存器位数n,存储器含有m个寄存器,容量:m*2^n  

tips:位宽调整:高位扩展和高位截断。

 
  



数字电路学习笔记《搭建你的数字积木 数字电路与逻辑设计 Verilog HDL & Vivado版》

你可能感兴趣的:(数电)