学习板:ZYNQ7020
一、可编程逻辑器件
1、概念
对于常见的89C51、STM32、Arduino等等单片机来讲,内部电路连接是固定的,即内部的逻辑功能是固定不变的,要想改变它们的逻辑功能,就必须重新设计电路,改变内部各单元电路的连接。
而对于可编程逻辑器件(Programmable Logic Device)(PLD),用户可以自行修改内部连接,这种PLD内部电路结构可以通过写入编程数据来设置,当然写入后也可以擦除重写。用户可以根据自己的需求来设置内部电路的逻辑功能。
2、常见的可编程逻辑器件
常见的可编程逻辑器件有:
(1)CPLD
复杂可编程逻辑器件(Complex Programmable Logic Device)
(2)FPGA
现场可编辑门阵列(Field Programmable Gate Array)
俩者的差异本质差异在于电路结构不同:
CPLD:基于乘积项的与或逻辑阵列
FPGA:基于“查找表”的CLB阵列
3、FPGA与单片机的区别
FPGA是一种可通过编程来改变其逻辑功能的数字集成电路;而对单片机编程并不能改变其电路结构。
通过FPGA编程后,生成电路,通过逻辑功能达到我们的目的;而对单片机编程后,会转换指令,单片机处理软件指令:取指、译码、执行…取指、译码、执行…一步步执行下去
4、HDL
HDL(Hardware Description Language),硬件描述语言。用于描述数字电路结构和功能的语言。
HDL 可以在不同的层次对数字电路的结构、功能和行为进行描述。它所描述的电路可以通过综合工具(如Vivado软件)将其转换为门级电路网表,然后将门级电路网表与基本元件一一对应起来,再通过布局布线工具转换为电路布线结构。
5、Verilog与C的区别
Verilog语言是硬件描述语言,编译下载到FPGA后,会生成电路,而不同模块的电路执行可以独立执行,所以可以说verilog语言是并行执行的。
C语言是软件编程语言,编译下载到单片机后,生成的是指令。单片机必须通过:取指、译码、执行…取指、译码、执行…来完成功能,所以可以理解为是串行执行。
即可以说Verilog语言是并行执行,也可以说FPGA是并行执行;既可以C语言是串行执行,也可以说单片机是串行执行。这既是Verilog与C的区别,也是FPGA与单片机的区别。
二、逻辑值
逻辑 0:表示低电平,也就是对应我们电路的 GND;
逻辑 1:表示高电平,也就是对应我们电路的 VCC;
逻辑 X:表示未知,有可能是高电平,也有可能是低电平;
逻辑 Z:表示高阻态,外部没有激励信号时是一个悬空状态。
三、符号
Verilog程序由各种符号流构成,这些符号包括:空白符(White Space)、运算符(Operator)、数字(Number)、字符串(String)、注释(Comment)、标识符(Identifier)、关键字(Key Word)等
1、空白符(White Space)
Verilog语言中的空白符包括:空格、Tab、换行符
verilog语言可以不分行,例如:
initial begin ina=3'b001;inb=3'b011;inc=3'b111;end
等效为:
initial
begin
ina=3'b001;
inb=3'b011;
inc=3'b111;
end
空白符只是为了使代码错落有致,阅读起来更加方便,在代码被综合时空白符会被忽略。
2、注释(Comment)
注释与c语言一样:
(1)单行注释
以“//”开始,到本行结束
(2)多行注释
以“/*”开始,到 “ */”结束
3、标识符(Identifier)
标识符用于用户在编程时给Verilog对象、模块、端口和实例起名字
标识符由 字母、数字、“$”、和"_"(下划线)组成。并且第一个字符必须是字母或者下划线。标识符最长可包含1023个字符 。
还有一种标识符为转义标识符,它与C语言的转义标识符一样,以反斜杠“\”开头,空白符结尾。
4、关键字(Key Word)
Verilog的关键字有很多,1995年发布标准后,在2001年又进行了修订,目前最常见关键字有
关键字 | 含义 |
---|---|
module | 模块开始定义 |
input | 输入端口定义 |
output | 输出端口定义 |
inout | 双向端口定义 |
parameter | 信号的参数定义 |
wire | 线性变量定义 |
reg | 寄存器型数据定义 |
always | 产生reg信号语句的关键字 |
assign | 产生wire信号语句的关键字 |
begin | 语句的起始标志 |
posedge/negedge | 时序电路的标志 |
case | Case语句起始标记 |
default | Case语句的默认分支标志 |
endcase | Case语句结束标记 |
if/else | if/else语句标记 |
for | for语句标记 |
end | 语句的结束标志 |
endmodule | 模块结束定义 |
5、运算符(Operator)
与C语言类似(本博八中详细总结)
四、常量
Verilog的常量主要有三种:整数、实数、字符串
1、整数(Integer)
整数的书写格式:
(+或-)(位宽)’(进制符)(值)
进制符与C语言一致:
①二进制:b或B
②八进制:o或O
③十进制:d或D
④十六进制:h或H
例如:
8'b11000111 //位宽为8的二进制数11000111
8'Hd5 //位宽为8的十六进制数d5 变为二进制:11010101
5'O23 //位宽为5的八进制数23 变为二进制:10011
5'd6 //位宽为5的十进制数6,变为二进制:00110
在位宽 与 '之间、进制数与数值之间允许出现空格,格式:
(+或-)(位宽)<空格>’(进制符)<空格>(值)
例如上面的例子,中间插了空格
8 'b 11000111 //位宽为8的二进制数11000111
8 'H d5 //位宽为8的十六进制数d5 变为二进制:11010101
5 'O 23 //位宽为5的八进制数23 变为二进制:10011
5 'd 6 //位宽为5的十进制数6,变为二进制:00110
其它地方出现空格是非法的!
书写整型变量时,注意以下几条规则:
(1)较长的数值可以用下划线分开,不要求每隔4位加一个下划线,可以任意加在某几个位置,它本身没有意义,只是为了代码的可读性(注意第一位不能是下划线)。例:
16'B 1001_1011_1111_0000
13'b 1_0011_0100_1110
13'b 1_001_101_001_110
(2)如果没有定义位宽,则默认为32位,例:
'b 111 //为二进制 0000 0000 0000 0000 0000 0000 0000 0111
'd 123 //10进制数,变为二进制 0000 0000 0000 0000 0000 0000 0111 1011
(3)如果定义的位宽比数值的长度长,需要在前面补零。例:
5'b 111 //为二进制 00111
10'd 123 //为二进制 00 0111 1011
(4)如果定义的位宽比数值长度短,则左边的部分被截掉。例:
5'b 101_1111 //为二进制 11111
3'd123 //为二进制 011
(5)未知态x、高阻态z在二进制中代表1位x或z;在八进制中代表三位x或z;在16进制中代表四位x或z。例:
5'b111zz //为二进制111zz
8'O23z