深入理解FPGA
FPGA到底是什么,FPGA其实本身只是一个个孤立开来的器件或者模块,没有任何的联系,我们可以通过FPGA工具,例如Quartus、TD导入芯片的资料,这样就会有芯片的管脚图和一些IP核,这些IP核分为Primitive Core和Soft Core。Primitive Core就是硬核,例如SDRAM,ADC等,这是不需要代码的,因为相当于已经有一个专门用于这个功能的芯片,我们只需要直接利用就可以,把管脚对应到我们需要的管脚,例如PLL,我们直接去拿来用就可以产生非常精准的周期脉冲信号。还有一些软核Soft Core,软核是什么呢,就是比如说我们编写的每一个module其实都可以看作软核,那么为什么板卡自带的软核那么长而且我们看不懂呢,其实是因为公司为了保护自己的IP(知识产权),将这些代码加密了,一般是门级网表的形式,让我们举SD_Card作为例子。这个软核是导入板卡后自带的,那么这个软核大概起到了什么作用呢,其实就是我们将这个软核的Input和Output配置到对应的引脚上,或者说信号上,这个IP软核就会完成对应的功能,对于SD卡来说就是读操作和写操作,这些操作的具体实现就不用我们自己写了,我们只需要阅读官方的使用文档便可以直接使用这些软核。那么为什么例程里面没有用这个自带的IP软核而是自己写SD卡的Read和Write模块呢,因为首先这个软核是加密过的,你不知道他内部具体干了什么,你只能使用它最终的结果,故而不太容易改动,灵活性较差。而自己写模块的话其实也可以理解为自己设计了一个软核,而且可以满足你自己的需求,而且你看得懂,并且可以修改,故而很多程序使用的都是这种办法。
我们来到下一个问题,我们的目标是搭建Soc(片上系统),首先我们需要去官网下载Cortex-M0的软核,那么这个软核又是个什么东西呢,如果他不牛的话为什么会有那么多人用他这个软核呢。其实我们了解后我们就知道设计一个这样的软核很厉害。这个软核里面使用的是AHB总线协议,然后还有JTAG调试接口等。我们把这个软核部署到FPGA上之后(配了几个对应的管脚后),我们相当于有了一个CPU,有了一个处理器,可以对指令进行处理和传达。
相当于是这么一个东西,我们有了一个处理器,他有对应的指令集架构等。
让我们先继续说回FPGA,当我们将FPGA的代码写好后,其实我们是在重排板卡上面的各个电路器件,通过生成的bit流使板卡上的资源呈现出我们想要的效果。这个时候FPGA已经为我们所用了。
此后我们实例化顶层模块时,我们实例化那个Cortex-M0软核的时候,我们相当于给了他一个时钟、复位信号、调试信号等,然后对他的IRQ(中断向量),看门狗等做了一些设置,可以理解为我们在对CPU做一个初始化的设置。随后我们可以往AHB上挂载一些单元,然后我们可以通过一些信号来控制是哪个单元的读写存储等功能,稍微具体一点就是有一个AHBlite_Decoder可以解码看出主机选择进行通信的是哪一个单元等等信息,然后通过XXX_AHBlite和总线进行数据的传输,当然还有一个XXX的module(也可以看成一个软核),去实现我们想要的功能,除了这些。我们还需要在AHBlite_Interconnect中增添从机与主机进行通信必须用到的的地址总线,数据总线等等,我们还需要在AHBlite_SlaveMUX中添加我们所增添的从机,该模块用于选择是哪一个从机与主机进行通信。
以上所有的操作就相当于搭建好了一个完善的通信系统以及可以进行调试的系统,并且可以实现我们想要的功能。
那么接下来我们将讲如何控制这个CPU。
接下来我们来到了另一个软件,可以是Keil可以是CCS,在上面选择的是你所使用的IP软核,例如Cortex-M0,此时选择的不再是板卡型号了,因为现在我们相当于我们在使用一个CPU,所以自然和板卡的型号无关了。
那么我们是怎么控制这个CPU的呢,首先我们需要一个Startup启动文件,这个文件里存放的是一些汇编代码,大致是干了什么呢,首先是中断向量表
下面通常含的是要跳转到哪些模块等等。那么随之而来的疑问是,板卡怎么知道我的代码是控制LED灯的还是控制HDMI的呢?其实是通过地址的方式,我们看一个GPIO的流水灯例程,我们在TD软件中可以看到我们给流水灯分配的地址是0x40000000到0x4000000f,然后这个地址呢有我们写的流水灯的module,就是这个流水灯可以干什么,所以现在我们就差一个可以控制流水灯的信号。
这个信号其实就在Keil中,通过keil的一个文件来制定代码的位置(一般是一个结构体),例如我们申明了一个Waterlight结构体,结构体的起始指针指向0x40000000,然后我们就可以对板卡进行控制。可以看到结构体如下。
文章来源:https://www.toymoban.com/news/detail-859217.html
随后我们在main.c中编写代码再利用JTAG接口调试,就可以控制FPGA达到我们想要的效果。我们可以生成.hex文件来控制FPGA,只需在TD中将地址指向hex文件即可,同时我们可以通过JTAG接口进行调试。文章来源地址https://www.toymoban.com/news/detail-859217.html
到了这里,关于深入理解FPGA(Cortex-M0片上系统Soc搭载及代码编写调试)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!