取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
Highlighted
Observer
Observer
898 次查看
注册日期: ‎01-22-2019

在不同位宽的RAM间移动数据

跳至解决方案

DDR的可选位宽只有16或者32位,而Block RAM则可以设置跟高的位宽,那么数据在他们之间怎么移动呢?

比如DDR到64位的BRAM,是不是高位填0?

那么从64位BRAM到32位DDR呢?

0 项奖励
1 解答

已接受的解答
Highlighted
Xilinx Employee
Xilinx Employee
746 次查看
注册日期: ‎06-02-2017

Hi @kane06 

AXI Interconnect系统里数据是以byte为基本单位的,数据位宽转换和地址位宽会同步重新排列。不会存在补0或者丢数的情况。

比如32-bit DDR里存的数据(从user interface的角度):

0: 04030201

4: 08070605

8: 0C0B0A09

如果转移到16-bit的设备中,

0:0201

2:0403

4:0605

6:0807

8:0A09

A:0C0B

 

PS DDR配置中的effective data address为实际外部连接的器件DQ的宽度,和用户侧的位宽并不一致。比如32bit的DQ,用户侧位宽可能为32*8=256bit。

在原帖中查看解决方案

0 项奖励
10 回复数
Highlighted
Xilinx Employee
Xilinx Employee
889 次查看
注册日期: ‎06-02-2017

Hi @kane06 

你这里提到的DDR的位宽是指DDR物理接口的位宽(DQ宽度)吗?

另外你的设计是纯逻辑设计还是基于Block Design的IPI设计?

0 项奖励
Highlighted
Scholar
Scholar
887 次查看
注册日期: ‎05-29-2018

用AXI Data Width Converter 转换位宽 ,不过最低位宽32位,BRAM 用AXI Bram Control 控制器 ,16位要自己写Code了。

0 项奖励
Highlighted
Xilinx Employee
Xilinx Employee
868 次查看
注册日期: ‎06-02-2017

Hi @junhawk 

其实可以不用的,DDR的MIG控制器和AXI BRAM Controller挂载载同一个axi interconnect的两个master接口下。

数据的搬移可以在axi interconnect的slave端口连接一个CDMA来实现。

不需要写对MIG和BRAM来HDL代码,但是要对CDMA进行控制,建议用一个软核Microblaze来实现,也可以直接写一个axi lite的控制逻辑。

0 项奖励
Highlighted
Scholar
Scholar
861 次查看
注册日期: ‎05-29-2018
位宽转换不自己手动设,Interconnect 会自己生成一个,这个IP肯定是要用到的,这个应用肯定用软核方便啊,都是AXI总线
0 项奖励
Highlighted
Observer
Observer
760 次查看
注册日期: ‎01-22-2019

感谢,其实我想问的主要是内存数据的结构。

举个例子,比如在16位ddr里面数据是这样的:

addr   data

0        aaaa

1         bbbb

2         cccc

现在要用DMA搬运到32位block ram里面,那么结构是这样(高位填0):

addr   data

0        0000_aaaaa

1         0000_bbbb

2        0000_cccc

还是这样(拼接):

addr   data

0         aaaa_bbbb

1          cccc_0000

同理,从32到16位是舍弃高位?还是拆分成两个数据?

0 项奖励
Highlighted
Observer
Observer
756 次查看
注册日期: ‎01-22-2019

@lettertu 

对了,之前说的那个ddr32位是我看到processing system里面ddr设定的effective dram bus width, 不知道存储单元里面是不是一致的

0 项奖励
Highlighted
Xilinx Employee
Xilinx Employee
747 次查看
注册日期: ‎06-02-2017

Hi @kane06 

AXI Interconnect系统里数据是以byte为基本单位的,数据位宽转换和地址位宽会同步重新排列。不会存在补0或者丢数的情况。

比如32-bit DDR里存的数据(从user interface的角度):

0: 04030201

4: 08070605

8: 0C0B0A09

如果转移到16-bit的设备中,

0:0201

2:0403

4:0605

6:0807

8:0A09

A:0C0B

 

PS DDR配置中的effective data address为实际外部连接的器件DQ的宽度,和用户侧的位宽并不一致。比如32bit的DQ,用户侧位宽可能为32*8=256bit。

在原帖中查看解决方案

0 项奖励
Highlighted
Observer
Observer
718 次查看
注册日期: ‎01-22-2019

@lettertu 原来如此,明白了。

还有个几个问题请教一下,列如我有个32位block ram,数据跟你的例子一样:

0: 04030201

4: 08070605

8: 0C0B0A09

要是这个时候我写入或者读取地址异常,比如1,2,会发生什么?

以及从block ram的角度看,他的地址是不是一定从000...0开始?推广到普通的片上sram是否也成立?

感谢!

0 项奖励
Highlighted
Xilinx Employee
Xilinx Employee
711 次查看
注册日期: ‎06-02-2017

Hi @kane06 

读写1/2之类的地址,返回的数据应该也是04030201,你可以实际验证一下。

地址不一定从0开始?你是指CPU访问外设的地址吗?

如果是,这些地址是Interconnect用于区分不同设备,经过Interconnect之后,地址依然是从0开始。

0 项奖励
Highlighted
Observer
Observer
706 次查看
注册日期: ‎01-22-2019

@lettertu 

明白了,谢谢 :)

0 项奖励