硬件架构的艺术(七)处理字节顺序

由于所有计算机系统并不是都是按同样的字节顺序设计,所以就需要处理字节顺序的问题(字节顺序定义数据在计算机系统中的存储格式,描述地址的最高有效位MSB和最低有效位LSB的位置:

  • 大端模式(Big Endian):将MSB保存在最低存储器地址处
  • 小端模式(Little Endian):将LSB保存在最低存储器地址处

( 对于要将字节或16位半字映射到系统存储器中32位字的系统,字节顺序不匹配就会影响数据完整性)

小端模式:因为最低位字节偏移值为0,并首先访问,访问1、2、4或更长字节数的汇编语言指令能按同样方式处理所有格式,而且由于地址偏移量与字节数1:1的关系,多精度的数学程序也相对容易编写。

大端模式:因为先访问高阶字节,所以很容易通过查看偏移量为0的字节来判断数值的正负,所以无须接收所有字节包就能知道符号信息。由于数字同时也以打印的次序保存,所以对从二进制转化为十进制的程序有效。
例如:以两种不同形式保存十六进制数0x12345678
在这里插入图片描述
大多数位图图像(显示和内存安排)映射成“MSB在左侧”的方案即大端方式,可以使体系结构能够自然地移动和存储大于一个字节的图像元素。
在这里插入图片描述
在这里插入图片描述
处理字节顺序不匹配的问题:
在两台设备通信时,每个处理器和每种通信协议必须选择一种字节顺序,如果需要通过存储器通信,两种不同字节顺序的处理器就会产生冲突。例如:小端模式处理器访问大端模式网络时需要用软件对字节重新排序。
(而TCP/IP所有的协议层都定义为大端模式,即如(IP地址、包或校验和)必须首先发送或接收最高有效字节),所以即使各终端计算机都是小端模式,之间所传输的数据必须先转化为大端模式,然后在接受端转化为小端模式。

方法:
(1)处理字节顺序不匹配最简单的方法就是为系统选择一种“字节顺序类型”,并将全部其他不同字节顺序的模块转化为目标“字节顺序类型”。而字节顺序类型由CPU体系结构的实现决定,所以在对第三方IP选型时要考虑是否支持“双字节顺序”结构,方便编程为“大端模式”或“小端模式”。
(2)保持数据完整性(数据不变,改变地址)
域左边为MSB,右边为LSB。即如果用16位域表示整数并进行加操作,会对LSB加1,并且所有进位从LSB向MSB进行,大端或小端地址体系结构是相同的。
首先接收到连续帧的头部,然后是帧的其余部分
在这里插入图片描述
接收到的连续帧以“Type”、“H2"、”H1"和“H0"的顺序保存在外设存储器中。帧中的域可能跨多个字节并不在字节边界终止。
在这里插入图片描述
需要对访问外设RAM的存储器的地址进行修改,对地址的改动基于传送数据的大小。
在这里插入图片描述
在这里插入图片描述
所以即对地址总线最后两位LSB取反,数据不变

assign le_ram_addr[31:0] = (size = 8-bits) ?
											{ram_addr[31:2],~ram_addr[1],~ram_addr[0]}:
											(size = 16-bits)?
											...
assign le_ram_data[31:0] = data[31:0];

使用上面的方案可以使字节顺序转换对软件透明,并能确保数据完整性在字节顺序转换过程中不会被破坏
该方法的数据流:
1、DMA发出对外设存储器的读字节操作
2、此时系统产生的地址为0x00,但是小端模式设备所看到的地址为0x03
3、设备存储器对该地址解码,访问位31:24
4、DMA对系统的大端模式存储器发出按字节方式的写操作
5、产生0x00地址(字节访问)
6、大端模式存储器将该访问解码为写入位31:24
7、由于来自于小端模式存储器的数据处于同样的字节区域,所以可以保持数据的完整性。

(3)保持相同的地址区间(地址不变,改变数据)
某些应用程序或系统不需要数据保持特定的次序,但是需要在字节顺序转换后数据字节保持在同样的地址区域,这时需要使用地址不变的字节顺序转换。
对于地址不变的系统,访问字节”Type“的地址偏移量永远是0x3,而如果使用上一节的方法,访问该字节需要使用不同的地址偏移量。需要修改或交换从外设RAM存储器中读到的数据值。

assign le_ram_addr[31:0] = ram_addr;
assign le_ram_data[31:0] = data[0:31];//但实际不允许有这种操作,可以使用for语句reserve

在这里插入图片描述
数据流:
1、DMA发出对外设存储器的读字节操作
2、其中系统产生的地址为0x00,地址不变的实现使地址值始终相同
3、外设RAM对该地址解码,访问位7:0
4、数据发生改变,reserve
5、数据写入大端存储器

(4)软件字节交换

  • 交换汇编指令
  • 用于交换字节的软件库宏
  • 协议特定的交换函数
  • 制定的交换函数
发布了54 篇原创文章 · 获赞 4 · 访问量 1024

猜你喜欢

转载自blog.csdn.net/buzhiquxiang/article/details/103729898