Tengo una entidad que tiene un tipo de matriz como se muestra a continuación:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
Entity LCD_Memory is
port (CLK, Reset, WR : IN std_logic;
I : IN std_logic_vector(7 Downto 0);
Addr : IN std_logic_vector(7 Downto 0);
O : OUT std_logic_vector(7 Downto 0));
End LCD_Memory;
Architecture Behavier of LCD_Memory is
Type LCD_Memory_Array is Array(1 to 200) of std_logic_vector(7 Downto 0);
Signal LCDMem : LCD_Memory_Array :=
("01010000", "01010010", "01001111", "01000111", "01010010", "01000001", "01001101", "00100000", -- Line_PK - 1
"10110000", "00100000", "01001011", "01000101", "01011001", "00100000", "00111010", "00100000", -- Line_PK - 9
"01000101", "01001110", "01010100", "01000101", "01010010", "00100000", "01010010", "01010101", -- Line_GM - 17
"01001110", "00100000", "01001101", "01001111", "01000100", "01000101", "00100000", "00111010", -- Line_GM - 25
"01000101", "01001110", "01010100", "01000101", "01010010", "00100000", "01010010", "01010101", -- Line_GD - 33
"01001110", "00100000", "01000100", "01000101", "01001100", "01000001", "01011001", "00111010", -- Line_GD - 41
"01010010", "01010101", "01001110", "10110000", "01000100", "00100000", "00100000", "00100000", -- Line_RD - 49
"01010010", "01010101", "01001110", "10110000", "01001110", "00100000", "00100000", "00100000", -- Line_RN - 57
"01000100", "01001111", "01001110", "01000101", "00100000", "00100000", "00100000", "00100000", -- Line_DN - 65
"01001101", "01000101", "01001101", "01001111", "01010010", "01011001", "00100000", "00111010", -- Line_Mem - 73
"01000001", "01000011", "00100000", "00111010", "00100000", "00100000", "00100000", "00100000", -- Line_AC - 81
"01000100", "01010010", "00100000", "00111010", "00100000", "00100000", "00100000", "00100000", -- Line_DR - 89
"01001001", "01010010", "00100000", "00111010", "00100000", "00100000", "00100000", "00100000", -- Line_IR - 97
"01010100", "01010010", "00100000", "00111010", "00100000", "00100000", "00100000", "00100000", -- Line_TR - 105
"01000001", "01010010", "00100000", "00111010", "00100000", "00100000", "00100000", "00100000", -- Line_AR - 113
"01001001", "01001110", "01010000", "01010010", "00100000", "00111010", "00100000", "00100000", -- Line_INPR - 121
"01001111", "01010101", "01010100", "01010010", "00100000", "00111010", "00100000", "00100000", -- Line_OUTR - 129
"01001001", "00100000", "00111010", "00100000", "00100000", "00100000", "00100000", "00100000", -- Line_I - 137
"01010011", "00100000", "00111010", "00100000", "00100000", "00100000", "00100000", "00100000", -- Line_S - 145
"01000101", "00100000", "00111010", "00100000", "00100000", "00100000", "00100000", "00100000", -- Line_E - 153
"01010010", "00100000", "00111010", "00100000", "00100000", "00100000", "00100000", "00100000", -- Line_R - 161
"01001001", "01000101", "01001110", "00100000", "00111010", "00100000", "00100000", "00100000", -- Line_IEN - 169
"01000110", "01000111", "01001001", "00100000", "00111010", "00100000", "00100000", "00100000", -- Line_FGI - 177
"01000110", "01000111", "01001111", "00100000", "00111010", "00100000", "00100000", "00100000", -- Line_FGO - 185
"00100000", "00100000", "00100000", "00100000", "00100000", "00100000", "00100000", "00100000"); -- Null_1 - 193
-- "00100000", "00100000", "00100000", "00100000", "00100000", "00100000", "00100000", "00100000"); -- Null_2 - 201
attribute ram_style : string;
attribute ram_style of LCDMem : signal is "block";
begin
Process(CLK)
begin
if (CLK'Event and CLK = '1') then
if Reset = '0' then
if WR = '1' then
LCDMem(conv_integer(Addr)) <= I;
O <= I;
else
O <= LCDMem(conv_integer(Addr));
end if;
end if;
end if;
end Process;
end Behavier;
Quiero poner esta matriz en una RAM de bloque para reducir las LUT utilizadas, pero cuando sintetizo este código, XST no puede inferir una RAM de bloque y muestra esta advertencia:
INFO: Xst - HDL ADVISOR - No se puede extraer una RAM de bloque para la señal . La sincronización de lectura / escritura parece ser READ_FIRST y no está disponible para la familia seleccionada. Por lo general, se creará una memoria RAM distribuida. Tomar ventaja de los recursos de memoria RAM del bloque, es posible que desee revisar su RAM sincronizar o verificar las familias de dispositivos disponibles.
¡Pero este código está en modo de escritura primero! Tengo otra memoria que es exactamente igual a esta y XST extrajo un Block Ram para ello.
Esta RAM debe ser de solo lectura (como una ROM), por lo que he mapeado las señales de Restablecer, WR e I a '0'. ¿Es la razón?
Estoy usando XIlinx Spartan 2 XC2S50 Chip FPGA, es compatible con el modo Write-First para Block Rams. ¿Qué cambios debo hacer en mi entidad para obtener trabajo?
Editar :
Cuando configuro esta entidad como un módulo superior, XST la implementa como una RAM de bloque. Creo que no hay problema en la entidad, el problema es que Reset
, WR
y I
están asignados a '0', ahora la pregunta es cómo usar una RAM de bloque como una ROM de bloque en Write- ¿Primer modo?