SoC第一讲——Vivado的Block Design 的使用

SoC第一讲——Vivado的Block Design 的使用

前言

近期刚接触SoC的学习,通过Xilinx的Vivado软件和ZYNQ系列的器件芯片学习SOC,特此在学习的过程中做些总结,以帮助自己能有收获。

一、ZYNQ的架构

ZYNQ 可以读zinc,与锌的英文读音类似。ZYNQ由PL(Programmable Logic)PS(Processing System) 两个部分组成。
在这里插入图片描述

PL即为FPGA部分的资源。而PS集成了两颗Cortex-A9 双ARM集成的硬核。两者主要通过AXI总线协议来进行数据交互。上图黄色的就是PL部分,其他为PS部分。

Cortex A9 ARM周围有很多固定的外设,例如QSPI,IIC,GPIO,等硬件控制器,都已集成在PS部分的ARM的端口,通过IO接口可以引到PS的IO PIN脚上。PL部分同样也有很多IO,与ARM的IO相比,FPGA(PL部分)的IO较为灵活,可以自定义,可扩展,而ARM的IO已经是固定死的,不能自定义。这就是ARM和FPGA结合在一起的显著优点。

PS的外设(如QSPI,IIC,GPIO)和内部ARM内核通过AMBA总线(AMBA Switches)进行互联。同时AMBA可以和PL端进行通信,四个GP接口(两路主机、两路从机,主要传输慢速信号)。并且PL端可以通过AXI总线协议在AMBA总线上访问上边的memory的控制器,同时可以访问DDR的内存(如图的箭头所示)。

PL与ARM的交互一般是通过DMA(直接内存访问,即从外设不通过CPU的处理直接访问内存)的方式来进行的。与之相对应的通道是HP0-3(0、1是一组,2、3是一组)。通过HP可以直接访问DDR。ACP的接口是FPGA直接连至ARM的cache,这样可以在直接访问内存DDR的同时,CPU会及时更新数据,同步cache中的数据。

二、I/O 的架构

I/O的架构如下图所示:
在这里插入图片描述
I/O是研发过程中比较重要的部分。ARM侧的I/O一共有54个MIO。还有EMIO,可以与FPGA测,包括GPIO等,总共64根线,并且是双向的端口。MIO的编号为0-53,EMIO的编号为54-117
SPI,IIC,GPIO等外设都可以通过EMIO引入到FPGA一侧,即可以作为FPGA一侧的管脚的输入输出,来驱动ARM的工作(可以在ARM中写C程序进行驱动FPGA内的逻辑设计的电路)。
具体的IO需要根据自己开发板的原理图查看了解进行设计。
下面是一张更具详细的ZYNQ的原理架构,包括IO,AXI总线等。
在这里插入图片描述

三、BOOT的具体流程

由于我们后续的设计需要固化到ZYNQ中,因此,需要对于boot上电的过程需要清楚了解。
传统FPGA上电的流程:在FPGA中,有外部存储器的控制器,当上电的时候,会读这个控制器里的配置数据。
当加入ARM PS这一部分时,有很多的方式。通用的方式是通过SD卡或者是Flash加载。下面是这种BOOT的方式。
在这里插入图片描述
在上述过程中,第stage 0,在MIO中有配置的管脚,可以配置芯片加载的模式。
如是SD卡的加载模式,则上电时,会从SD卡中读取配置文件,配置文件中一般是FSBL(first boot load)第一启动项,可以让ARM跑起来,用于加载bit文件,或者加载第二boot文件。
在此过程中,bit流文件并不是必须的(此时只是用到ARM的部分,只有PS部分工作)。
然后就是load裸机的应用程序,通过FSBL加载,或者跑操作系统需要SSBL(Uboot),然后再去load OS。

四、Block Design (BD)的工程的搭建

BD的创建类似于视图的创建,即在视图中中可以拖动我们的BLOCK。
在这里插入图片描述
然后主要对ZYNQ进行配置,包括DDR,MIO,PS-PL 之间的外设。

具体的配置连接需要根据自己开发板的原理图,这一点特别重要。

我自己用的是米联客的MZ7020开发板,
1)外设接口
对于UART:
在这里插入图片描述
我的开发板是MIO48、49,所以选择UART1 MIO48、49。有的开发板是46、47,所以在使用前请查阅自己的开发板接口。对于其他的外设接口也是类似,查找自己的原理图接口。
SD卡:选择MIO 40-45
还有一点重点是bank电压的选择。如bank0(bank500)是3.3V;bank1 (bank501) 是1.8V。
EMIO:分配两个管脚(在GPIO中设置)
2)PS时钟的配置
PS输入时钟为 33.33333MHz
CPU PLL时钟为 666.66666MHz (对于7020最大可设置776MHz)
PL Fbbric Clock 为100MHz。是ARM的IO的PLL生成一个时钟来给PL端使用,即给FPGA一侧充当时钟来使用,即使FPGA一侧不集成时钟,也能使用外设提供的时钟。

3)DDR的配置
可以不进行配置,即使用内部的256K的on chip memory,但只能写一些简单的程序,所以一般需要挂载DDR。
根据自己板卡的类型选择DDR的型号。
在这里插入图片描述
上面包含了一路时钟复位、时钟输入、固定IO、挂载的DDR、EMIO(GPIO引入到FPGA一侧)
对于EMIO需要说明的是GPIO有三个接口。GPIO_I是输入,GPIO_O是输出端口,GPIO_T表示三态门的buff用于控制门的开关,可以设置为输出或输入。
这里我们使用简单的设计,讲GPIO作为FPGA逻辑的输入:
GPIO[0] 可用于FPGA管脚的输出(如控制LED灯)
GPIO[1] 可用于可以作为FPGA的一个输入信号,作为使能端标记信号(如作为计数器的使能端,控制计数器产生振荡信号,从而在驱动LED灯)

需要自己编写verilog代码来进行逻辑设计。

module gpio_led(
input 	clk_i,				//from zynp clk io
input 	rst_n_i,
input 	[1:0] 		gpio_i, //from zynp gpio
output 	[1:0]		led_o 	//connet to fpga led_pin
	);

reg [2:0] div_cnt_ctrl;	//avoid meta-state of goio_i[1]
reg [26:0] div_cnt;  //clk_i count
reg led_pulse;

//connect fpga pin directly gpio_i[0]
assign led_o[0] = gpio_i[0];
assign led_o[1] = led_pulse;

always @(posedge clk_i) begin
	div_cnt_ctrl <= {div_cnt_ctrl[1:0],gpio_i[1]};		//打拍操作不用复位,移位寄存器的方式,gpio信号跨时钟域
end

//count
always @(posedge clk_i) begin
 	if (! rst_n_i) begin
 		div_cnt <= 27'b0;
 	end
    else if (div_cnt_ctrl[2] == 1'b1)begin
        if (div_cnt[26] == 1'b1) begin
 	    	div_cnt <= 27'b0;
 	    end
  	    else begin
 	    	div_cnt <= div_cnt + 1'b1;
    	end
    end
    else begin
            div_cnt <= 27'b0;
    end
end

//led_pulse 
always @(posedge clk_i)
begin
        if (! rst_n_i)begin
            pulse_led <= 1'b0;
        end
        else if (div_cnt[26] == 1'b1) begin
            pulse_led <= ~ pulse_led;
        end
        else
            pulse_led <= pulse_led;
end

endmodule

完成代码编写后,需要添加至vivado自定义的IP中,可以在tools>creat and package new IP添加刚才新建的 .v文件。会弹出一个新的窗口。

随便提一下,可以加入在线逻辑分析仪 ILA,进行在线debug调试。具体参考我之前的写的博客:
https://blog.csdn.net/vivid117/article/details/97549702
最后生成的block 如下,然后需要对其生成一个顶层文件 create HDL wrapper
在这里插入图片描述
顶层文件如下:
在这里插入图片描述
然后对led的管脚进行电平约束及引脚绑定。
最后对创建的工程进行综合、编译和产生bit文件。

接着需要在SDK中进行软件:
File>export>export hardware>include bitstream
File>launch SDK

在SDK中新建一个应用程序。如hello world 的程序。
在这里插入图片描述
具体过程可以参考另外一篇博客。

五、软核、硬核的区别

介绍一下zynq核和MB软核以及A家NIOSII核(Altera),三者区别和一些共性。

共性:把一些通用的驱动或者一些简单的C语言的计算的代码,直接引入到FPGA开发环境中。

区别:1,ZYNQ A9 双核硬核 性能、效率高
2,MB 和NIOS都是软核,性能差别很大,而且占用FPGA逻辑资源,数据互联或数据访问效率比较低。

六、一些问题
  1. 数字IC跨时钟域的处理办法
    跨时钟域主要带来的问题就是亚稳态的问题,具体关于亚稳态可以参考我写的博客:
    https://blog.csdn.net/vivid117/article/details/91175138
    主要原因:建立时间或者保持时间不够。
  2. 处理方法–同步器:
    单比特信号
    通过打两-三拍(对目标时钟域的时钟打拍),只能减小发生的概率。
    多比特信号
    1)时钟采样速率很慢(10M以下) 可以保持多个时钟周期时,也可以打两拍处理;
    或者对多比特信号进行格雷码编码(相邻两个数变化最少),编码之后进行打拍操作,如:
    000
    001
    011
    010
    110
    111
    101
    100
    2)既不同频又不同域使用fifo或者是异步双口ram进行数据的处理,涉及到RAM和FIFO的深度计算,位宽的转换。
  • 62
    点赞
  • 303
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摆渡沧桑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值