Как Lattice Diamond отображает начальные значения ОЗУ примитивам EBR?
Я читаю начальные значения ОЗУ для True-Dual-Port RAM объемом 4 КиБ (1 КБ x 32-бит) с диска. Поскольку мои устройства Lattice ECP5 имеют только 18-разрядные ОЗУ со встроенными блоками (EBR), 2 ОЗУ объединяются, чтобы соответствовать размеру слова 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 в Lattice Diamond. В плане этажа показано 2 использованных встроенных блока оперативной памяти - это и предназначено. Но когда я нажимаю на 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.
- Как начальное значение отображается в ОЗУ?
1 ответ
Я нашел шаблон отображения ОЗУ...
Значения от 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
Оперативная память организована следующим образом:
- строк памяти: 64
- слов в строке: 64
- бит на слово: 18 (кодируется как 5 шестнадцатеричных цифр)
DataIn / DataOut для отображения внутренней памяти:
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);