通过学习正点原子FPGA课程所整理的笔记One
一、相关简介
1.模拟电路与数字电路的区别
模拟电路:工作在模拟信号下的电子电路。
数字电路:工作在数字信号下的电子电路
模拟电路在时间和数量上的变化连续,而数字电路是离散的。
2.可编程逻辑器件(Programmable Logic Device)
(1)这是一种允许用户自行修改内部连接结构的集成电路(简称PLD)
PLD内部的电路结构可以通过写入编程数据来设置,写入PLD的编程数据还可以重写。
(2)CPLD与FPGA
本质差异:电路结构不同
CPLD:基于“乘积项”的与或逻辑阵列
FPGA:基于“查找表”的CLB阵列【可编程逻辑功能块(Configurable Logic Blocks)CLB是FPGA内的三个基本逻辑单元】
3.硬件描述语言(Haraware Description Language)
数字系统设计流程
逻辑设计(前端)——电路实现(后端)——系统验证
逻辑设计:
描述数字电路结构和功能的语言,HDL可以在不同层次对数字电路结构、功能和行为进行描述
电路实现:
HDL所描述的电路可以通过综合工具——门级电路网表——将其与某种工艺的基本逐一对应起来——通过布局布线工具——电路布线结构
常见的硬件描述语言 Verilog HDL 和 VHDL
Verilog设计方法在FPGA开发/IC设计具有主导地位
在FPGA设计中,还有原理图输入法
4.Verilog和C语言的区别
verilog作为硬件描述语言,编译下载到FPGA后,会生成电路,而且verilog是并行运行的。
c语言作为软件编程语言,编译到单片机后,是存储器的一组指令,单片机处理软件,通过取指、译码、执行,所以c语言是串行执行的。
Verilog与C语言的区别同样也是FPGA与单片机的区别,FPGA由于并行处理,处理速度非常快。
二、Verilog学习
1.逻辑值
逻辑值类型:
0:表示低电平,对应电路中的GND(地),在数字逻辑中代表逻辑假或关闭状态。
1:表示高电平,对应电路中的VCC(电源电压),在数字逻辑中代表逻辑真或开启状态。
x:表示未知状态,可能是高电平或低电平,常见于未初始化信号或总线冲突情况。
z: 表示高阻态,外部没有激励信号,为悬空状态。
重点:
(1)实际电路只有0和1,x主要用于仿真验证
(2) 组合逻辑和时序逻辑对这些值的处理不同
注意:
(1)初始化寄存器变量时应避免x状态
(2) 测试平台可用x状态检测设计响应
(3)注意组合逻辑中可能产生x状态的情况
2.Verilog的数字进制:二进制b、八进制o、十进制d、十六进制h
一般为:b、d、h
二进制:
例如4'b0101,表示4位二进制0101 其中4'代表位宽
十进制:
例如4'd2代表4位十进制2
十六进制:
4'ha代表4位十六进制数字a(1010)
3.标识符(identifier)
用于定义模块名、端口名、信号(可用字母、数字、$符号和下划线组成)
注意:
(1)不建议大小写混合使用
(2)普通内部信号建议全部小写
4.数据类型
(1)Verilog中的三大数据类型:
寄存器数据类型 | 真正对数字电路起作用 |
线网数据类型 | 真正对数字电路起作用 |
参数数据类型 |
(2)寄存器数据类型:
寄存器:一个抽象的数据存储单元 , 通过赋值语句来改变寄存器存储的值
关键字 reg ,默认初始值 为不定值x
reg类型的数据只能在always语句和initial语句中被赋值
//reg define
reg [31:0] delay_cnt;
//这里的[31:0]代表是一个32位的寄存器(从0到31为32位,高前低后)
reg key_reg;
//下面的reg没有进行赋值,默认位宽为1
注意:如果过程语句为
时序逻辑,即always语句带有时钟信号,则该寄存器变量应为触发器。
组合逻辑,即always语句不带有时钟信号,则该寄存器变量应为硬件连线。
特性 | 时序逻辑 | 组合逻辑 |
依赖信号 | 时钟边沿触发 | 输入立即变化响应 |
存储功能 | 是(触发器) | 否 |
Verilog关键字 | always @ (posedge clk) | always @ (*)或assign |
默认无驱动值 | 保持前状态 | 不适用 |
-
时序逻辑:用于设计寄存器、状态机、时序控制模块。
-
组合逻辑:用于设计算术逻辑单元(ALU)、多路选择器等。
(3)线网数据类型:
//wire define
wire key_flag;
//默认位宽为1
包括wire和tri型
常用为wire,表示单驱动信号
tri,用于多驱动信号(如总线冲突时表现为高阻态)
表示结构实体(例如门)之间的物理连线 该变量不能存储值 它的值是由驱动它的元件所决定的
驱动线网类型的变量元件有门、连接赋值语句、assign语句等
如果没有驱动元件连接到线网类型的变量上,则该变量为默认值高阻态 (z)
wire out;
assign out = sel ? a : b; //多路选择器
(4)参数数据类型
为常量 Verilog HDL中用parameter定义常量
可以一次性定义多个参数 需用逗号隔开
//parameter define 4.3'RGB LCD
parameter H_SYNC = 11'd4 //行同步
parameter H_BACK = 11'd2 //行显示后沿
parameter H_DISP = 11'd480 //行有效数据
parameter H_FRONT = 11'd2 //行显示前沿
parameter H_TOTAL = 11'd525 //行扫描周期
参数数据类型用来定义状态机的状态、数据位宽、延迟大小等
采用标识符来代表一常量可增强程序的可读性和可维护性
在模块调用时,可采用参数传递来改变调用模块中已被定义的参数
(5)Verilog的运算符 (注意优先级!)
和C语言一样Verilog有算术运算符、关系运算符、逻辑运算符、条件运算符、位运算符、移位运算符,但Verilog有特殊的拼接运算符
拼接运算符:{}
// {} define
c = {a,b[3:0]}
//将a与b拼接起来,作为一个信号
//eg
reg [3:0] a = 4'b1010;
reg [3;0] b = 4'b1100;
reg [7:0] c;
assign c = {a,b}; //位拼接 c为8'b10101100
(6)关键字及常用关键字
(7)Verilog程序框架
其基本设计单元为“模块”(block)
·描述接口
·描述逻辑功能
Verilog程序 | 端口定义 | IO说明 | 内部信号声明 | 功能定义 |
---|
内部功能定义的三种方法:
assign语句 | 描述组合逻辑 |
---|---|
always语句 | 组合/时序逻辑 |
例化实例元件 | 如and#2u1(9,a,b) |
注:在always语句中为顺序执行,但在多个always块中是并行的