精华内容
下载资源
问答
  • 地址对齐

    2019-11-20 11:12:05
    地址对齐与芯片位宽有关, 对于8bit 位宽的芯片,地址对齐为1即每次地址增加必须为1的倍数,一次读写的最小单位为1个字节,发送0x0 读取零地址的一个字节数据,发送0x1 读取0x1地址的数据; 16bit 位宽的芯片, ...

    地址对齐与芯片位宽有关,

    对于8bit 位宽的芯片,地址对齐为1 即每次地址增加必须为1的倍数,一次读写的最小单位为1个字节,发送0x0 读取零地址的一个字节数据,发送0x1 读取0x1地址的数据;

    16bit 位宽的芯片, 地址对齐为2 即每次地址增加必须为2的倍数,一次读写的最小单位为2个字节,发送0000B 读取零地址的0-1 两个字节数据,发送0010B 读取芯片上的2-3  2个字节数据; 所以最低位必须为0。

    32bit 位宽的芯,地址对齐为4 即每次地址增加必须为4的倍数,一次读写的最小单位为4个字节,发送0x0 读取零地址的4个字节数据,发送0x4 读取芯片上的第二个4字节数据; 所以最低两位必须为00

    这是因为对于8位地址宽度的芯片cpu地址总线A0,A1,A2... 分别与芯片的a0,a1,a2相连接,

    对于16位地址宽度的芯片cpu地址总线A0,A1,A2... 分别与芯片的a1,a2,a3相连接,cpu的A0不与芯片相连,因此CPU A0 为0,当CPU发送 0010B 地址,芯片接收到的地址位001,随即芯片取出地址位为1的 2字节数据发送给主机控制器。

    对于32位地址宽度的芯片cpu地址总线A0,A1,A2... 分别与芯片的a2,a3,a4相连接,cpu的A0,A1不与芯片相连,因此A0,A1都为0,当CPU发送 0100B 地址,芯片接收到的地址位01,随即芯片取出地址位为1的 4字节数据发送给主机控制器。

    展开全文
  • Cache地址对齐

    2019-12-24 19:13:04
    Cache是高速缓冲存储器,对Cache进行操作都要通过地址,因此掌握地址的对齐方式显得尤为重要,文中介绍了Cache地址的字节对齐方式以及地址对齐对burst操作的影响。

    Cache是高速缓冲存储器,如果将Cache想象成一栋楼房,那么每个存储块就相当于一个房间,而地址就是每个房间的门牌号,可以通过地址对对应的存储块进行读写操作。

    AXI是一种接口协议,规定地址是字节对齐的。字节对齐的意思是:每个地址代表的存储块位宽为1个字节(byte),这里设1byte=8bit。

    假设顶层设计的地址是字节对齐的,且地址位宽为32bit,那么Cache的容量为8bit*2^32,如果底层设计的Cache地址是128bit对齐的,即底层设计的每个地址代表的存储块位宽为128bit,那么底层的地址位宽应该为{log_{2}}(8bit*{2^{32}}/128bit)=28bit。为了与顶层通信,将底层设计的地址位宽扩展为32bit,如果想保证地址128bit对齐,就要求Addr[3:0]=4'b0000,如果Addr[3:0]≠4'b0000,我们就说本次对Cache进行的读写操作是非对齐的。

    Cache的地址映射图如图1所示。

    图1.Cache的地址映射图
    • Burst操作

    burst操作是指只需给出一个地址(Addr0)及操作长度(Length),在进行读写时以后的地址会在Addr0的基础上依次加1个Length单位。

    例如:对上述顶层Cache(地址是字节对齐的)进行burst操作,地址Addr0=0x0000,Length=16,设Length以字节为单位,那么本次burst操作访问了地址Addr0~Addr15=0x000f,而对于底层Cache(地址是128bit对齐的)而言,只需一次操作即可访问16个字节。

    如果Addr1=0x0001(即进行的burst操作是非对齐的),Length=16,那么本次burst操作访问了地址Addr1~Addr16=0x0010,尽管仍然是访问128bit,但由于底层Cache的地址是128bit对齐的,因此第一次访问最多访问到Addr15,而本次burst要求访问Addr16,因此共需两次操作。

    展开全文
  • 地址对齐相关

    2021-01-15 17:28:07
    1.什么是地址对齐 1、所谓对齐bai就是数据在存du储器中存放的规则,32位系统中一般zhi有字节对齐(dao8bit)、半字对zhuan齐(16bit)、字对齐(32bit)三种方式,分别对齐到连续地址、偶数地址、被4整除的地址。 2、...

    1.什么是地址对齐

    1、所谓对齐bai就是数据在存du储器中存放的规则,32位系统中一般zhi有字节对齐(dao8bit)、半字对zhuan齐(16bit)、字对齐(32bit)三种方式,分别对齐到连续地址、偶数地址、被4整除的地址。
    2、arm体系结构中有ARM指令集和Thumb指令集2种,其中ARM指令为32位指令,按照4字节对齐存储,一条指令必须从4的整数倍地址来取;Thumb指令为16位指令,按2字节对齐存储,一条指令必须从偶数地址来取。
    3、数据的存储:字符型数据一般为字节对齐存储、短整型按照双字节对齐存储、整型/浮点型按照4字节对齐存储。


    2.为什么要地址对齐

      地址对齐其实就是CPU设计中的一个时空权衡,这里采用的是空间换时间的。主要的解决问题是如何能过快速的读取给定的一个变量。

      目前的主流计算机有32位,64位这是地址线,一般数据线与地址线条数相同。

      如果放置数据时不考虑地址对齐,32位的CPU读取一个4字节的int最少需要一次内存访问,最多需要2次访问内存。下图中左面,取一个int要两次内存访问,而右边的只需要一次内存访问。


    3.AXIZ中的地址对齐

    在AXI中,主要是三种猝发模式,FIXED,INCR,WRAP。前两种比较容易理解,第三种的边界计算如下。

    WRAP猝发类似于INCR猝发。在WRAP中,地址将根据SiZE递增,但是达到地址上限时,地址将换到地址下限。
    在WRAP地址计算过程中有两个注意事项,

    1. 计算WRAP的地址上限
    2. 低位地址回旋到WRAP

     

    WRAP突发有限制:

    • 起始地址必须与每次传输的大小对齐
    • 突发长度必须为2、4、8或16个传输

    起始地址一定是和size对齐的,比如size是2(每次传输2^2bytes),那么起始地址就不能是0x32,只能是0x34,0x38这些

    如果size是3,则是2^3=8bytes=64bits(64的位宽),则地址要是0x30,0x38这些,

    计算方式如下:

    地址下界:

    地址上界:

    Ex1:

    AxADDR = 0x04, AxLEN = 3, AxSIZE = 2, AxBURST = 3。

    Start_Address = 0x04
    Burst_Length = 4
    Number_Bytes = 2^2=4
    因此地址下界
    = (0x04/(4x4)) x (4x4)
    = 0
    地址上界
    = 0 + (4 x 4)
    = 16

    Address_0 = 4
    Address_1 = Address_0 + Number_Bytes = 4 + 4 = 8
    Address_2 = Address_1 + Number_Bytes = 8 + 4 = 12
    Address_3 = Address_2 + Number_Bytes = 12 + 4 = 16

    因为上界为16,因此地址Address_3 = 0。

    因此地址为4,8,12,0。

     

    Ex2:

    AxADDR = 0x38, AxLEN = 3, AxSIZE = 2, AxBURST = 3。
    Start_Address = 0x38
    Burst_Length = 4
    Number_Bytes = 2^2=4
    因此地址下界
    = (0x38/(4x4)) x (4x4)
    = 0x30
    地址上界
    = 0x30 + (4 x 4)
    = 0x40

    Address_0 = 0x38
    Address_1 = Address_0 + Number_Bytes = 0x38 + 0x4 = 0x3C
    Address_2 = Address_1 + Number_Bytes = 0x3C + 0x4 = 0x40
    因为Address_2 == 0x40, 达到上边界,因此Address_2 = 0x30
    Address_3 = Address_2 + Number_Bytes = 0x30 + 0x4 = 0x34
    因此地址为 0x38, 0x3C, 0x30, 0x34。

     

    Ex3:

    AxADDR = 0x34, AxLEN = 7, AxSIZE = 2, AxBURST = 3。
    Start_Address = 0x34
    Burst_Length = 8
    Number_Bytes = 2^2=4

    因此地址下界
    = (0x34/(4x8)) x (4x8)
    = 0x20
    地址上界
    = 0x20 + (4 x 8)
    = 0x40

    Address_0 = 0x34
    Address_1 = Address_0 + Number_Bytes = 0x34 + 4 = 0x38
    Address_2 = Address_1 + Number_Bytes = 0x38 + 4 = 0x3C
    Address_3 = Address_2 + Number_Bytes = 0x3C + 4 = 0x40
    因为Address_3 == 0x40,达到上边界,因此 Address_3 = 0x20
    Address_4 = Address_3 + Number_Bytes = 0x20 + 4 = 0x24
    Address_5 = Address_4 + Number_Bytes = 0x24 + 4 = 0x28
    Address_6 = Address_5 + Number_Bytes = 0x28 + 4 = 0x2C
    Address_7 = Address_6 + Number_Bytes = 0x2C + 4 = 0x30
    因此地址为 0x34, 0x38, 0x3C, 0x20, 0x24, 0x28, 0x2C, 0x30

    展开全文
  • 如果使用静态地址对齐(每个寄存器在Avalon总线上占4个字节的地址) 设置IP使用静态地址对齐的方式为,在hw.tcl脚本里加上一局话:set_interface_property as addressAlignment {NATIVE} 在软件编程时 可以使用IOWR...

    如果使用静态地址对齐(每个寄存器在Avalon总线上占4个字节的地址)
    设置IP使用静态地址对齐的方式为,在hw.tcl脚本里加上一局话:set_interface_property as addressAlignment {NATIVE}
    在软件编程时
    可以使用IOWR(基地址,寄存器编号(n),数据)对自定义IP的第n个寄存器进行写入操作
    可以使用IORD(基地址,寄存器编号(n)) 对自定义IP的第n个寄存器进行读出操作

    如果使用动态地址对齐,(每个寄存器在Avalon总线上占 数据位宽/8个字节的地址)(默认)
    在软件编程时,使用IOWR_32DIRECT(数据位宽为32位)、IOWR_16DIRECT(数据位宽为16位)、IOWR_8DIRECT(数据位宽为8位)进行写操作
    在软件编程时,使用IORD_32DIRECT(数据位宽为32位)、IORD_16DIRECT(数据位宽为16位)、IOWR_RDIRECT(数据位宽为8位)进行写操作

    IOWR_8DIRECT(基地址、地址偏移量、数据),地址偏移量 = 寄存器编号*1
    IOWR_16DIRECT(基地址、地址偏移量、数据),地址偏移量 = 寄存器编号*2
    IOWR_32DIRECT(基地址、地址偏移量、数据),地址偏移量 = 寄存器编号*4

    IORD_8DIRECT(基地址、地址偏移量),地址偏移量 = 寄存器编号*1
    IORD_16DIRECT(基地址、地址偏移量),地址偏移量 = 寄存器编号*2
    IORD_32DIRECT(基地址、地址偏移量),地址偏移量 = 寄存器编号*4

     

    在SOPC Builder 8.0版本以前,地址对齐中有动态对齐(dynamic)和静态对齐(Native)的两个选项,但是现在它不推荐使用静态对齐的方式。

    因为静态对齐可能会有副作用(this coding could have negative side-effects)。

     

    但是11.0等等新的版本中仍然有这个选项,只是放在deprecated(不推荐)中,而且默认为dynamic的。

     

    所以,总结是:

    如果,自定义外设需要的数据位宽不是32bit,如8bit,那么推荐两种方式搞定

      1.writedata,readdata为8bit,自定义外设中,配置为Native方式。

      2.writedata,readdata为32bit,只是高24bit无用,自定义外设中,配置为dynamic(优选)或者Native方式。

      在写软件时,IOWR均可正常使用。

    展开全文
  • 内存地址对齐

    2020-05-14 19:49:09
    内存地址对齐,是一种在计算机内存中排列数据、访问数据的一种方式,包含了两种相互独立又相互关联的部分:基本数据对齐和结构体数据对齐。当今的计算机在计算机内存中读写数据时都是按字(word)大小块来进行操作的...
  • C语言地址对齐

    千次阅读 2019-02-28 15:56:28
    1、地址对齐的目的:为了效率,以空间来换时间。 1.1.1、为了提高效率,计算机从内存中取数据是按照一个固定长度的。以32位机为例,它每次取32个位,也就是4个字节(每字节8个位,计算机基础知识,别说不知道)。...
  • 尽管看了不少资料,但是一直对 Avalon slave 的动态地址对齐和静态地址对齐的理解不是很透彻。前两天自己做了一个SOPC的自定义组件,通过Deprecated这个选项的不同选取,一下子就理解了Avalon slave的两种地址对齐...
  • 本文和设计代码由FPGA爱好者小梅哥编写,未经作者许可...设置IP使用静态地址对齐的方式为,在hw.tcl脚本里加上一局话:set_interface_property as addressAlignment {NATIVE} 在软件编程时 可以使用IOWR(基地址,寄...
  • 数据地址对齐

    千次阅读 2016-12-04 10:20:31
    数据地址对齐是从C语言映射到机器语言时,C语言隐含做的事情。这一点值得理解。 我们先看看数据: C声明 Intel数据类型 汇编代码后缀 x86-64大小(字节) IA32大小 char 字节 b 1 1 short 字 w 2 2 ...
  • 数据结构内存地址对齐方法对于不是很了解内存地址对齐的人来说很有帮助 通过规则和实例进行说明
  • 地址对齐浅析

    2012-12-14 21:36:51
    在定义一个结构体时,在用.align伪指令时,就有地址对齐的问题,为什么要对齐,请往下看: 这一切都来自CPU的引脚,相关引脚有AD(address data bus),它是分时复用的,总线周期T1状态表示地址总线,剩下来的T2~...
  • 通信协议中的地址对齐地址对齐数这个东西,实际上并不陌生了,在接触struct结构体的时候就遇到了,在这里也不多赘述,主要聊聊在通信协议中因为地址对齐数遇到的问题。 对于UDP/TCP通信,除了可以传递“行文本”...
  • 一般情况下,当我们定义一个变量,编译器会按照默认的地址对齐方式,来给该变量分配一个存储空间地址。如果该变量是一个 int 型数据,那么编译器就会按4字节或4字节的整数倍对齐;如果该变量是一个 short 型数据,...
  • 浅谈MIPS地址对齐问题

    2016-07-08 15:14:00
    1.什么叫地址对齐? RISC 下使用访存指令读取或写入数据单元时,目标地址必须是所访问之数据单元字节数的整数倍,这个叫做地址对齐。 2.计算机主要的架构分哪两类?及其地址对齐在两者的区别? 计算机主要的架构...
  • 内存地址对齐,是一种在计算机内存中排列数据、访问数据的一种方式,包含了两种相互独立又相互关联的部分:基本数据对齐和结构体数据对齐。当今的计算机在计算机内存中读写数据时都是按字(word)大小块来进行操作的...
  • S3C2440 NOR FLASH 地址对齐

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,453
精华内容 3,781
关键字:

地址对齐