Lattice Diamond如何将初始RAM值映射到EBR基元?

时间:2015-12-21 19:34:56

标签: initialization vhdl lattice-diamond

我正在从磁盘读取4 KiB(1Ki x 32位)True-Dual-Port RAM的初始RAM值。由于我的莱迪思ECP5器件只有18位宽的嵌入式Block 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

可以看出,这些价值观仍未受损 合成完成没有错误。

所以我在莱迪思钻石中开始制作地图和P& R.平面图视图显示我使用了2个嵌入式Block 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?

1 个答案:

答案 0 :(得分:0)

我找到了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);