Zynq学习笔记:02 HDL和Vivado框图

视频:Combining my own HDL with the Vivado block diagram!

From this image you can see that this is what it's like before which is basically just the block diagram. And Vivado has this wrapper file that it creates and it is forwarding these internal signals out to the outside of the device. This is what we currently have.(从这张图中上半部分你可以看到,这就是之前的样子,基本上只是框图。Vivado创建了这个wrapper文件,并将这些内部信号转发到设备外部。这就是我们目前所拥有的。)

Zynq学习笔记:02 HDL和Vivado框图_第1张图片

Today what I'm going to be doing is I'm going to be adding my own top level code because I want to add in my own logic to this so this is My Logic on this side, I want to add my own top level so that I can have both modules side by side and the way I'm going to interact with the block diagram is I'm going to have these internal signals that I'm creating that our signals that go from the block diagram to my code and that's what I'm going to be using to interface with the block diagram. And we still have these signals that go out that are external signals.(今天我要做的是,我将添加我自己的顶级代码,我想添加我自己的顶层,这样我就可以将两个模块并排放置,我将与框图交互的方式是:创建内部信号,这些信号从框图传递到我的代码,这就是我将用于与框图接口的信号。)

The purple ones are the ones that are leaving the FPGA and going to the outside world. And the red ones are the ones that I'm using to interface with the block diagram. And I'm going to be showing you how I put this together today and the first thing I'm going to be doing today is creating these signals that go out of the block diagram to my code.(紫色的是那些离开FPGA并走向外部的信号。红色的是我用来与框图接口的那些。我今天将向大家展示我是如何把这些放在一起的,我今天要做的第一件事是创建这些信号,这些信号从框图中输出到我的代码中。)

Zynq学习笔记:02 HDL和Vivado框图_第2张图片

通常从fabric获得时钟信号和reset信号,但由于Zynq有处理器,处理器会给fabric提供时钟信号,所以我们将使用那个时钟。

在框图上选择FCLK_CLK0接口,右键选择创建端口:

Zynq学习笔记:02 HDL和Vivado框图_第3张图片

Zynq学习笔记:02 HDL和Vivado框图_第4张图片

同样也给peripheral_aresetn[0:0]创建一个端口:

Zynq学习笔记:02 HDL和Vivado框图_第5张图片

如图,已经创建好了两个外部端口:

Zynq学习笔记:02 HDL和Vivado框图_第6张图片

接下来创建一个额外的BRAM端口:

Zynq学习笔记:02 HDL和Vivado框图_第7张图片

这个BRAM的地址长度是32比特:

The addressing is for AXI addressing because it's connected to an AXI controller which is byte addressing. So every byte on this RAM is going to have a different address , the bottom 2 bits are the byte address within the word. (寻址采用AXI寻址,因为它连接到AXI控制器,该控制器是字节寻址。因此,这个RAM上的每个字节都将有一个不同的地址,底部的2位是字中的字节地址。)

We must remember that because usually when you're working with block memory the address is for the word itself the entire word. (我们必须记住这一点,通常使用块内存时,地址就是这个word本身。)

Zynq学习笔记:02 HDL和Vivado框图_第8张图片

创建外部端口:

Zynq学习笔记:02 HDL和Vivado框图_第9张图片

重新布局后可以看到我们新创建的3个外部端口:

Zynq学习笔记:02 HDL和Vivado框图_第10张图片

下面添加已经写好的源代码:

Zynq学习笔记:02 HDL和Vivado框图_第11张图片

Zynq学习笔记:02 HDL和Vivado框图_第12张图片

因为已经添加了3个新的外部端口,所以需要重新打包:

Zynq学习笔记:02 HDL和Vivado框图_第13张图片

Zynq学习笔记:02 HDL和Vivado框图_第14张图片

打包完成后可以看到之前我们新添加的端口已经包含在module里了:

Zynq学习笔记:02 HDL和Vivado框图_第15张图片

在顶层文件中,可以看到在实例化wrapper时端口被分为内部端口和外部端口,外部端口是在顶层向外输出的端口,而内部端口是将与我们的code(fibonacci sequence generator斐波那契序列生成器)对话;的端口:

Zynq学习笔记:02 HDL和Vivado框图_第16张图片

左下角菜单:生成比特流 → 编译

代码描述:

这是一个和BRAM端口相接的斐波那契序列生成器(Fibonacci sequence generator),其中BRAM_en=1时,BRAM_addr的数据会被写进BRAM_dout;当BRAM_we=1时,BRAM_din会被写进地址对应的memory中。

Zynq学习笔记:02 HDL和Vivado框图_第17张图片

这里有一个斐波那契序列生成器,每当get_next_number增加的时候,这个生成器就会产生斐波那契数:

当get_next_number增加时,一个新的斐波那契数会被生成,并且seq_valid会变为高电平。

Zynq学习笔记:02 HDL和Vivado框图_第18张图片

Zynq学习笔记:02 HDL和Vivado框图_第19张图片

每当seq_valid为真时,address递增1:

Zynq学习笔记:02 HDL和Vivado框图_第20张图片

这是一个计数到COUNTER_MAX的计数器,每当counter是1的时候,我们得到一个新的斐波那契数(因为此时get_next_number=1了)。这个计数器控制把数写进memory的频率,在这个例子中频率为每半秒钟写一个斐波那契数。

Zynq学习笔记:02 HDL和Vivado框图_第21张图片

这里BRAM_addr左移2位是因为地址是字节地址byte address,而想要寻址的word是4 bytes,因此需要移位2位。BRAM_we长度是4乘上seq_valid:

Zynq学习笔记:02 HDL和Vivado框图_第22张图片

这是一段非常简单的代码,只有一个向上计数的计数器去跟踪得到新斐波那契数的频率,还有跟踪这个数写在哪里的地址。

查看产生斐波那契数的代码:当get_next_number是高电平时,会通过之前生成的两数之和计算出一个新的斐波那契数:

Zynq学习笔记:02 HDL和Vivado框图_第23张图片

左上角导出hardware,include bitstream,导出xsa文件:

Zynq学习笔记:02 HDL和Vivado框图_第24张图片

之后打开Vitis,更新硬件规范,选择导出的xsa文件:

Zynq学习笔记:02 HDL和Vivado框图_第25张图片

下面验证memory:

这段代码是从FPGA读取BRAM,频率是每秒一次:

因为斐波那契数每秒更新两次,所以这个例子中每秒应该看到2个斐波那契数才正确:

编译后执行:

Zynq学习笔记:02 HDL和Vivado框图_第26张图片

Zynq学习笔记:02 HDL和Vivado框图_第27张图片

从结果中可以看到,每秒更新两个寄存器的值,说明验证成功:

Zynq学习笔记:02 HDL和Vivado框图_第28张图片

你可能感兴趣的:(Zynq学习笔记,学习,笔记,fpga开发,fpga)