学这个也是受同学推荐,说这个学起来跟嵌入式差不多,而本人在本科时候对嵌入式就有一种复杂的感情,前期热爱,中期劝退。所以也想再试一次,闲话不多说。
那么其实这个FPGA的话跟嵌入式有点类似,因为都是硬件开发的技术。FPGA(下面简称FA)的语法还是比较简单的。
首先,源码文件的话,都以module projectname();为开头,其中括号内填写端口名称,用逗号间隔;都以endmodule为结尾。端口输入为input something;输出则output something;。他的语法个人感觉比较通俗易懂,举个例子, assign out = (sel == 0)? a:b; 这段代码的意思是,若sel为0,则将a赋值给out,反之则将b赋值给out。
例子如图:
写完源码文件后,在FPGA中不是写完源码运行没事就可以了,它还需要通过端口的输出波形去分辨所设计的功能是否实现。因此还需要编写testbench文件(以下简称tb文件),tb文件的代码格式略有不同,开头是 `timescale 1ns/1ns ,这个是仿真的时间设置,第一个是步长,第二个是精度,大概可以这样理解。那么接下来就是差不多的格式。与源码文件不同的是在tb文件中,因为我们需要基于所编写的源码文件查看相应端口的波形变化是否按照预期,那么查看波形变化需要示波器,所以首先在代码编写处,需要首先定义示波器, reg S0;这样, 关于输出, 仅需要用根线连起来即可, wire out这样。因为tb文件是基于源码文件的,因此在编写完代码后,需要引入源码文件,然后将源码文件中的输入接口...
在编写到这里的时候,我发现了问题,由于我个人是边搞科研边学习这个,所以干的事情有点多,这个就是为啥我还要写学习记录的原因,因为看了当时会了并不意味着掌握了,以下我将从标黄的地方重新表述,这就是学习的过程。
与源码文件不同的是在tb文件中,我们需要给输入端口输入信号,也就是说需要给输入端口信号,因此需要去定义输入端口信号,如 reg S0;关于输出,仅需要用根线与之连接起来便是能看到输出波形,如 wire out这样。
因为tb文件是基于源码文件的,因此在编写完输入信号后,需要引入源码文件中的端口,并将端口与我们在tb文件中设定的信号端口相连。如:
格式就如同示例。
接下来就是需要给设定的输入信号编程。其中initial begin是开始赋值的函数,而#20的意义就是上面的这段设置信号持续时间,也就是20ns。
完整的tb代码如下:
按照这样的步骤,tb文件便也完成编写,接下来就是仿真了。
可以看到,输出的波形如设想一般,完成设计。
正常来说,还需要将这个编写到板子上去进行验证。但是我个人不太想往验证方面走,因此这方面工作就不在这里赘述了,当然我也会学。