ARM Cortex-M0的一些特性

Introduction

  • 基于ARMv6-M架构
  • 三级流水线
  • 基于Thumb指令集架构,使用Thumb ISA的一个子集
  • 32位寻址空间
  • 总线接口AHB-Lite
  • 具有嵌套向量中断控制器(NVIC)

Architecture

image

ARM Cortex M0中断

image

中断向量表

image

ARM Cortex M0启动流程

image

AMBA3 AHB-Lite NONSEQ时序

  • 基本读操作
  • 基本写操作
  • 具有等待的读操作
  • 具有等待的写操作

AMBA3 AHB_Lite 流水线传输

  • 总线流水

image

即在基本的读写操作中,把A与B看作两次传输,A的数据位(data phase)即为B的地址位(address phase)

AMBA3 AHB-Lite 拓展外设

首先我们看到AHB-Lite总线架构如图

image

其中Decoder放大了看,如图

image

从基本的读写操作interface上看,如图

image

如上图所示,要加外设其实就是如下几步:

  1. 扩展Decoder
  2. 在interface上增加Slave Port
  3. 在Interface中将新增的Slave Port与拓展的Decoder HSEL信号以及Slave Mux连接
  4. 顶层连接外设、外设接口、总线
  5. C语言中编写外设接口结构体

SoC base on M0

  • 总线互联

image

DMA:直接存储器访问

BRAM(Block Memory):存储单元

DRAM:分布式随机访问存储器

type BRAM DRAM
输出 需要时钟 给出地址即可输出数据
空间占用 较大的存储空间,fpga定制的ram资源 逻辑单元拼出来的,浪费LUT资源
使用 1. 较大的存储应用
2. 产生大的FIFO或timing要求较高
3. FPGA中资源位置是固定的,BRAM是一列一列分布的
造成用户逻辑和BRAM之间的route延时比较长。
1.零星的小ram
2.可以加上register,变成有时钟的ram
  • 设计流程

image

fpga软件(vivado、quartus、td)负责将硬件描述语言所描述的SoC编译、综合、实现,将fpga内部本身无序的各种逻辑资源(LUT、触发器、RAM等)配置成有序的电路,从而实现SoC功能。

keil负责将编写的软件描述语言(C/Assembler)编译成为机器码十六进制文件,在modelsim中将机器码作为Verilog描述的RAM的初始化内容,即可看到仿真,即SoC工作时各个信号的波形。

然后将机器码下载进FPGA实现的SoC中,那么就可以让SoC执行编写的程序,通过开发板看到结果。

  • 软硬件开发层次

image

从下往上看(从硬件到软件),FPGA被配置成SoC,SoC的工作依赖于一条条指令(ISA),这些指令由对应的汇编代码生成,最后汇编代码来源于编译器将高层次编程语言编译而来。

从上往下看(从软件到硬件),如果想要运行编译好的软件,首先需要利用编译器将代码编译为汇编代码,然后将汇编代码与指令集对应生成机器码,接着将机器码存入SoC的存储器中,这个时候SoC就能根据指令开始执行,其中SoC由FPGA搭建。

Memory Map 与总线拓展

SoC的memory map举例如下

image

处理器核通过地址编码访问外设,所有的外设在处理器核看来都是memory map上的一块连续区域,访问这块区域就是访问对应的外设。例如处理器核通过AHB总线发出的任何一个总线操作,只要地址总线上的值在0x00000000-0x0000ffff之间,都是认为处理器核在向RAMCODE提出总线 操作。

当SoC具有多个外设,处理器核只有一个Master总线接口的情况下,就需要用到总线拓展模块(Decoder和Slave MUX),使得处理器核可以访问到多个外设。

以Decoder为例,其为地址译码器,生成对应外设的选择信号,如果地址总线编码为0x00000000-0x0000ffff,那么只要地址总线HADDR的高16位bit为0x0000,那么地址总线的值必定位于RAMCODE的地址编码区域中,则判定为处理器核对RAMCODE提起的一次总线操作,因此RAMCODE对应的选择信号HSEL被置位有效。

每一个外设,在Decoder中都需要一个比较器用于产生相应的选择信号。

image

  • 这里需要注意一下,不同的外设,Decoder利用地址总线生成的选择信号HSEL所需要的宽度是不一样的。例如RAMCODE的地址编码为0x00000000-0x0000ffff,其有效长度为0x0000-0xffff,那么RAMCODE对于选择信号(HSEL_RAMCODE)需要对HADDR的高16bit进行译码;而上图的WaterLight地址编码为0x40000000-0x4000000f,其有效长度为0x0-0xf,所以WaterLight对于选择信号(HSEL_WaterLight)需要对高28bit位进行译码。

还有一个是Slave MUX ,其作用是选择一个外设,将外设返回的读取数据(HRDATA)、响应信号(HRESP)、反馈信号(HREADYOUT)保证返回给Master。例如当前总线操作是读取RAMCODE的数据,那么所有外设的选择信号中只有'RAMCODE'对应的选择信号为1,其他外设的选择信号都为0,那么Slave MUX根据这些选择信号选中RAMCODE返回的数据,保证处理器核能正确读取。

posted @ 2022-03-23 18:38  heart-z  阅读(917)  评论(0)    收藏  举报