【问题标题】:How does Lattice Diamond map initial RAM values to the EBR primitives?Lattice Diamond 如何将初始 RAM 值映射到 EBR 原语?
【发布时间】:2015-12-21 19:34:55
【问题描述】:

我正在从磁盘读取 4 KiB(1Ki x 32 位)True-Dual-Port RAM 的初始 RAM 值。因为我的 Lattice ECP5 设备只有 18 位宽的嵌入式块 RAM (EBR),所以将 2 个 RAM 组合起来以匹配 32 位的字长。

我的ocram.mem 文件有 4 条数据线,每条线有 8 个十六进制数字(=> 32 位字线)。
该文件如下所示:

@000
44332211
88776655
CCBBAA99
00FFEEDD

我的读取函数在 LSE 日志中报告了这些行:

INFO - synthesis: d:/git/poc/src/mem/mem.pkg.vhdl(144): Note: "44332211". VHDL-1533
INFO - synthesis: d:/git/poc/src/mem/mem.pkg.vhdl(144): Note: "88776655". VHDL-1533
INFO - synthesis: d:/git/poc/src/mem/mem.pkg.vhdl(144): Note: "CCBBAA99". VHDL-1533
INFO - synthesis: d:/git/poc/src/mem/mem.pkg.vhdl(144): Note: "00FFEEDD". VHDL-1533

因此,第一行按预期跳过,以下行字符串也可以。在行读取和 char 到 std_logic_vector 的转换之后,我再次将我的 2D STD_LOGIC 矩阵输出到 LSE 日志中:

INFO - synthesis: d:/git/poc/src/mem/ocram/ocram_tdp.vhdl(123): Note: "Memory: => 
0100 0100 0011 0011 0010 0010 0001 0001
1000 1000 0111 0111 0110 0110 0101 0101
1100 1100 1011 1011 1010 1010 1001 1001
0000 0000 1111 1111 1110 1110 1101 1101
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 00   ....   000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
". VHDL-1533

正如我们所看到的,这些值仍然没有受到影响。
合成完成,没有错误。

所以我开始在 Lattice Diamond 中进行地图和 P&R。平面图视图向我展示了 2 个使用过的嵌入式块 RAM - 这是预期的。但是当我点击 RAM 时,INIT 值看起来很奇怪。

RAM0 INITVAL_00 = 0x0000...000000000000003FF332EE221DD110CC
RAM0 INITVAL_01 = 0x0000...00000000000000000000000000000000
RAM0 INITVAL_.. = 0x.......................................
RAM0 INITVAL_3F = 0x0000...00000000000000000000000000000000

RAM1 INITVAL_00 = 0x0000...00000000000002EDD02A990265502211
RAM1 INITVAL_01 = 0x0000...00000000000000000000000000000000
RAM1 INITVAL_.. = 0x.......................................
RAM1 INITVAL_3F = 0x0000...00000000000000000000000000000000

我承认我的一些价值观,但不是全部。我在 EBR 或 ECP5 文档中没有找到任何线索。

  • 初始值如何映射到 RAM 中?

【问题讨论】:

  • 我不了解 Lattice 技术,但 BlockRams 拥有灵活的内部组织是正常的,x1、x2、x4、x8、x9、x18 等宽。因此,INIT 约束可能已从您选择的数据格式重新打包为实际的内部格式。您需要详细了解吗?
  • 我认为最简单的方法是找到一些文档进行查找。否则,当我按下按钮时,我必须构建一个完整的设计,逐字读取 RAM 内容:( 或者我需要一个 UART(可能是下一个错误源)来在终端中显示内容。目前我没有ECP5 设备,我要订购一个,这不是那么容易,除非我愿意为美国进口支付双倍的价格……美国价格:99 美元 => 欧盟价格:193 欧元
  • 回到主题:我想到了一个 1024x (16+16) 和一个 1024x (14 + 18) 的组织。有 INITVAL_00 到 3F 常量......所以 64 个值,每个 80 个十六进制数字。当我将一个常数分成 16 个字时,每个 5 位数字......给出 1024 个字
  • 如果您计算“1”位的数量,您的原始数据和两个 RAM 都显示 61 位,从而证实了 Brian 的观察。
  • 出于好奇,知道答案有什么价值?

标签: initialization vhdl lattice-diamond


【解决方案1】:

我找到了 RAM 映射模式...

来自 Lattice Diamond Floorplaner 的值:

RAM 0
.....    ..................
00000 => 000000000000000000
02EDD => 000010111011011101
02A99 => 000010101010011001
02655 => 000010011001010101
02211 => 000010001000010001

RAM 1
.....    ..................
00000 => 000000000000000000
003FF => 000000001111111111
332EE => 110011001011101110
221DD => 100010000111011101
110CC => 010001000011001100

当我把这两部分结合起来,引入新的分隔符后,就可以解码成原来的内容了:

RAM 1 RAM 0          RAM 1 (17:0)             RAM 0 (13:0)      original
00000 00000 => 0000.0000.0000.0000.00 --.--00.0000.0000.0000 ~> 0000-0000
003FF 02EDD => 0000.0000.1111.1111.11 --.--10.1110.1101.1101 ~> 00FF-EEDD
332EE 02A99 => 1100.1100.1011.1011.10 --.--10.1010.1001.1001 ~> CCDD-AA99
221DD 02655 => 1000.1000.0111.0111.01 --.--10.0110.0101.0101 ~> 8877-6655
110CC 02211 => 0100.0100.0011.0011.00 --.--10.0010.0001.0001 ~> 4433-2211

RAM 的组织方式如下:

  • 内存行:64
  • 每行字数:64
  • 每个字的位数:18(编码为 5 个十六进制数字)

DataIn/DataOut 到内部 RAM 的映射:

ram0(13 downto 0) <= DataIn(13 downto 0);
ram1(17 downto 0) <= DataIn(31 downto 14);

DataOut(13 downto 0)  <= rom0(13 downto 0);
DataOut(31 downto 14) <= rom1(17 downto 0);

【讨论】:

  • 我想这些对齐方式可能会受到其他布局约束。例如,设计规划文档在其中一个图中显示了内存对齐以承载链。
猜你喜欢
  • 1970-01-01
  • 2016-03-15
  • 2012-03-27
  • 2010-11-12
  • 2023-03-12
  • 1970-01-01
  • 2017-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多