ZYNQ是一个fpga用来硬件编程,外加一个软件编程
FPGA是可通过编程来修改其逻辑功能的数字集成电路
第三篇语法篇
第七章 verilog HDL语法
Verilog的简介
可编程逻辑电路:允许用户自行修改内部连接的集成电路,其内部的电路结构可以通过编程数据来设置,写入的编程数据还可以擦除
FPGA是基于查找表的CLB阵列
数字系统设计流程
Verilog和c的区别
Verilog是硬件描述语言,在下载到FPGA中后会生成电路,是并行运行的
c语言下载到单片机中之后,是存储器中的一组指令,而单片机处理软件指令是需要取指、译码、执行这个过程是串行执行
FPGA的特点就是运行速度特别快,要有硬件设计的思想
程序框架
Verilog的逻辑值
逻辑0:表示低电平,也就是电路的GND
逻辑1:表示高电平,也就是电路的vcc
逻辑x:表示未知,有可能是高电平,也有可能是低电平
逻辑z:表示高阻态,表示外部没有激励信号是一个悬空的状态
没有输入驱动
verilogd的标识符
书写规范:
1、用有意义的有效的名字如 sum、cpu_addr 等。
2、用下划线区分词语组合,如 cpu_addr。
3、采用一些前缀或后缀,比如:时钟采用 clk 前缀:clk_50m,clk_cpu;低电平采用_n 后缀: enable_n;
4、统一缩写,如全局复位信号 rst。
5、同一信号在不同层次保持一致性,如同一时钟信号必须在各模块保持一致。
6、自定义的标识符不能与保留字(关键词)同名。
7、参数统一采用大写,如定义参数使用 SIZE。
进制
二进制
二进制表示如下:4’b0101 表示 4 位二进制数字 0101;
十进制
4’d2 表示 4 位十进制数字 2(二进制 0010)
十六进制
4’ha 表示 4 位十六进制数字 a(二进制 1010)········
要是没有标识默认位宽就是32位,位宽就是一次可以传输多少位二进制数
默认10进制数
数组类型
1、寄存器类型
寄存器类型是表示一个抽象的数据存储单元,它只能在always和initial语句中被赋值,并且它的值从一个赋值到另一个赋值过程中被保存下来。如果该过程语句描述的是时序逻辑,即 always 语句带有时钟 信号,则该寄存器变量对应为寄存器;如果该过程语句描述的是组合逻辑,即 always 语句不带有时钟信 号,则该寄存器变量对应为硬件连线;寄存器类型的缺省值是 x(未知状态)。 寄存器数据类型有很多种,如 reg、integer、real 等,其中最常用的就是 reg 类型,它的使用方法如 :
//reg define
reg [31:0] delay_cnt; //延时计数器
reg key_flag ; //按键标志
2、线网类型
线网表示 Verilog 结构化元件间的物理连线。它的值由驱动元件的值决定,例如连续赋值或门的输 出。如果没有驱动元件连接到线网,线网的缺省值为 z(高阻态)。线网类型同寄存器类型一样也是有很 多种,如 tri 和 wire 等,其中最常用的就是 wire 类型,它的使用方法如下
//wire define
wire data_en; //数据使能信号
wire [7:0] data ; //数据
3、参数类型
我们再来看下参数类型,参数其实就是一个常量,常被用于定义状态机的状态、数据位宽和延迟大小 等,由于它可以在编译时修改参数的值,因此它又常被用于一些参数可调的模块中,使用户在实例化模块 时,可以根据需要配置参数。在定义参数时,我们可以一次定义多个参数,参数与参数之间需要用逗号隔 开。这里我们需要注意的是参数的定义是局部的,只在当前模块中有效。它的使用方法如下
//parameter define
parameter DATA_WIDTH = 8; //数据位宽为8位
运算符
逻辑运算符与位运算符的差别
逻辑运算符
位运算符
不同位宽的数据进行位运算会将位小的用0补齐 ,
一个数据位宽为4,表示这个数据由4位数组成
拼接运算符
Verilog程序框架
关键字(小写)
module 模块开始定义
input 输入端口定义
output 输出端口定义
inout 双向端口定义
parameter 信号的参数定义
wire wire信号定义
reg reg信号定义
always 产生reg信号语句的关键字
assign 产生wire信号的关键字
begin 语句的起始标志
end 语句的结束标志
posedge/negedeg 时序电路的标志
case case语句的起始标志
default case语句的默认·分支标志
endcase case语句结束标志
if if/else语句标记
else if/else语句标志
for for语句标记
endmodule 模块结束定义
Verilog 高级知识点
模块的结构
每个程序都由4个部分组成
端口定义、io说明、内部信号声明、功能定义
第一行给出了所有端口,第二、三行说明了端口的io功能,5、6是功能定义
模块的调用(函数的调用)