基于Xilinx7 xc7a35t 的FPGA开发日记(四)
没想到在短短几天之内我的博客访问量就近千了,感谢大家的支持。接下来我会将更多的经验和技术分享给大家。但其实我也是入门级选手,所以如果有错误请大家不吝赐教,谢谢!
我们来进行实战开发前的最后一课:Verilog硬件语言的学习。
这节课先将一些基础知识和数据类型,下节课会将运算符和赋值语句。
Verilog HDL 语言是目前最流行的两种硬件语言之一,因为设计这门语言很大程度上参考了C语言的思路,所以之前学习过C语言的同学可以轻松掌握这门语言。
首先,在Verilog开发环境中一共有以上四种逻辑状态。
在Verilog中表示数字的方法有三种:
1.<位宽>’<进制><数字>
2.<进制><数字> (这种方式缺位宽,此时至少有32位)
3.<数字> (这种方式默认为十进制,位宽32位)
任何一门语言都有数据类型,Verilog的数据类型分为:
线网型(net) 和 变量型。
一、线网型
顾名思义,实际上就是在FPGA内部以线(“与”逻辑运算)连接的量。例如我配置一个D触发器的输出为Q1,然后我定义一个线网型变量A等于Q1,于是A就一直随着Q1的值变化。
线网型数据有两个关键词,第一个是wire,意思就是线,他代表的就是定义一个量,在接下一直随着另一个量的变化而变化,比如说
wire clk_out;
assign clk_out = c_out; //这里的assign是一个赋值语句,后面会说
这两行代码的意思就是定义一个线网型变量 clk_out ,它的值等于c_out变量,并且随着c_out 的变化而变化。
第二个关键词是parameter,它的作用是定义一个标识符,也就是常量,类似于c语言的宏定义。parameter 是可以重定义的。
parameter width = 3;
//这行代码的意思就是定义一个常量等于3,也就是说接下来代码中出现 width,程序就会自动将它替换成3。
二、变量
变量一共只有一个关键字reg,对应着我们能够完成时序电路功能的寄存器,所以reg也被称为寄存器型。
存储器的标准定义形式是:
reg [msb:lsb] memory [upper:lower]
例如:
reg[3:0] memory1[63:0]
//定义memory1 为64个4位寄存器数组
而常用的也有:
reg[4:0] dog ; //没有说明个数,默认一个,也就是定义了一个5位寄存器dog。
数据类型的介绍就到这里,在下节课讲述运算符和赋值语句之前,我们还需要说一些Verilog语言中的注意事项:
- Verilog程序由模块构成,每个模块嵌套在module 和 endmodule的声明之中。
- 每个source file 只能有一个顶层模块。
- 每个模块要进行端口定义,例如 module A (input b,outout c) //定义一个模块A,它有一个输入量b,一个输出量c。
- 时序部分在always块内,在其中只能对寄存器变量赋值。
- 对线网型变量只能在always块外赋值。
- Verilog程序格式自由,一行可以书写多个语句,一个语句也可以分多行书写。
- 除了endmodule、begin、end、fork、join外,每个语句和数据定义最后要有分号。
- 可用/…/ 和 / /…进行注释。
本节课的学习就到这里,很快我们会更新下节课结束verilog的学习,并且进入实战环节。如果想进行实战操作的同学请到Xlinx网站下载Vivado(版本至少2017)并且注册免费获得lisence。
谢谢观看!