xilinxFPGA-初学FPGA必知【代码含义,模块例化(如同C语言中调用子函数),代码仿真,固化文件(下载并保存文件,掉电不丢失)】(基于 verilog)
代码含义
首先,我们要知道,在 PFGA 中没有函数的含义,在 FPGA 中是以模块的定义,相当于 C 语言中的函数。
//重点强调:代码规范!!!
//规范的代码可以大大的增强可读性!!!!!
·timescale 1ns / 1ps //时间精度在FPGA中 #20.25; 这种语句叫做延时延时时间就是在这儿规定,时间单位为1ns,精度为1ps,所以可以延时 20.25ns 的时间,如果 1ns / 1ns 那么 #20.25 就是错误的,因为精度只有1ns,所以不能低于精度的延时。
module led( //模块头部的定义,led为模块名称。
//在这儿定义模块之中将会使用到的输入输出口。
);
//模块内部具体实现功能。
endmodule //模块尾部的定义。
在这儿,就能很清楚的看到一个模块的具体框架了,接下来我们分析输入输出端口。
input a, //定义一个输入口a,默认为reg类型。
input b, //定义一个输出口b。
//这儿我们定义了两个输出口,每个输出口占1个位宽,一共占两个位宽,所以,我们可以定义为 input [1:0]a, 这样就是定义了一个2位宽的输入口,可以拿一位作为a,拿一位作为b。
output reg c, //定义了一个输出端口,输出端口位1位宽,reg(相当于储存单元)是类型,output默认为wire(相当于物理连线)类型。
//wire只能在assgin(后面会讲到)连续赋值。
//reg只能在initial和always(后面会讲到)中赋值。
output d //定义一个输出端口,最后一个端口末尾不需要加逗号。
对于 FPGA 模块中的输入输出口也定义好了,现在我们开始来写具体实现功能代码。
assign d = (1 > 2) ? a : b; //在assign语句中,可以对wire变量进行复制,当1>2为真时,输出口d输出输入口a的值,反之输入b的值。
//assign的功能可以归纳为:(1)持续复制;(2)连线;(3)对wire变量进行赋值。(这儿不做详解,以后会慢慢讲到。)。
//这儿要记住,FPGA里面的这些代码是并行执行的,除了在时序语句里面,其他语句的先后顺序并不影响程序效果。
initial begin //initial模块在整个程序运行中,只执行一次。begin和end就相当于C语言的{}。
a = 0; //把a立刻赋值为0,当这条语句结束后,立马等于0。
b = 0;
#20 a <= 1'b1; //延时20ns,a赋值1,但是不是立刻赋值,当initial运行完了之后才运行,这条语句过完了之后a还是0,不会立刻赋值。
//1'b1,在这个语句中第一个1代表数据位宽,'b代表二进制,最后面的是数据大小,这儿是表示二进制的1。
#20 b <= a; //延时20ns后将a的值赋值给b,,因为上面a没有立即赋值为1,所以此时b会赋值为a以