I am working with Spartan 2 XC2S50 FPGA Chip on Xilinx board
There is a problem on my design that increases number of used LUTs
and this is the Utility Library :
library IEEE;
use IEEE.STD_LOGIC_1164.all;
package Utility is
Type Char_Array is array(natural range <>) of std_logic_vector(7 DownTo 0);
Constant CharArray : Char_Array(0 to 38) := (
"00110000", -- 0
"00110001", -- 1
"00110010", -- 2
"00110011", -- 3
"00110100", -- 4
"00110101", -- 5
"00110110", -- 6
"00110111", -- 7
"00111000", -- 8
"00111001", -- 9
"01000001", -- 10 : A
"01000010", -- 11 : B
"01000011", -- 12 : C
"01000100", -- 13 : D
"01000101", -- 14 : E
"01000110", -- 15 : F
"01000111", -- 16 : G
"01001000", -- 17 : H
"01001001", -- 18 : I
"01001010", -- 19 : J
"01001011", -- 20 : K
"01001100", -- 21 : L
"01001101", -- 22 : M
"01001110", -- 23 : N
"01001111", -- 24 : O
"01010000", -- 25 : P
"01010001", -- 26 : Q
"01010010", -- 27 : R
"01010011", -- 28 : S
"01010100", -- 29 : T
"01010101", -- 30 : U
"01010110", -- 31 : V
"01010111", -- 32 : W
"01011000", -- 33 : X
"01011001", -- 34 : Y
"01011010", -- 35 : Z
"00111010", -- 36 : ":"
"00100000", -- 37 : Space
"10110000"); -- 38 : -
-- Type LCD_Text is Array(natural range <>) of std_logic_vector(7 Downto 0);
-- SubType LCD_Line is LCD_Text(1 to 16);
function reverse_vector(a : IN std_logic_vector) return std_logic_vector;
function StdCharNum(I : std_logic) return std_logic_vector;
end Utility;
package body Utility is
function reverse_vector(a : IN std_logic_vector) return std_logic_vector is
variable result: std_logic_vector(a'RANGE);
alias aa: std_logic_vector(a'REVERSE_RANGE) is a;
begin
for i in aa'RANGE loop
result(i) := aa(i);
end loop;
return result;
end;
function StdCharNum(I : std_logic) return std_logic_vector is
begin
Case I IS
when '0' =>
return CharArray(0);
when '1' =>
return CharArray(1);
when others =>
return CharArray(37);
end case;
end;
end Utility;
I think the output of Multiplexer increases the used LUTs, How can I change Multiplexer to decrease used LUTs ?
I have tried many ways, but no chance to decrease enough LUTs.
changing std_logic_vector to bit_vector for port types may be helpful or not ?!
Edit :
I changed design to this :
library ieee ;
...
Entity Main IS
PORT(CLOCK : IN STD_LOGIC;
Kb_RK : IN STD_LOGIC_VECTOR(3 DOWNTO 1);
LCDSelector : IN STD_LOGIC_VECTOR(3 Downto 0);
MemAddr : IN STD_LOGIC_VECTOR(11 Downto 0);
DE : OUT STD_LOGIC_VECTOR(3 DOWNTO 1);
Seg_Out : OUT STD_LOGIC_VECTOR(7 Downto 0);
LED_Row : OUT STD_LOGIC_VECTOR(7 Downto 0);
LED_Col : OUT STD_LOGIC_VECTOR(7 Downto 0);
Buz_Out : OUT STD_LOGIC;
LCD_RW, LCD_RS, LCD_EN : OUT STD_LOGIC;
LCD_Data : OUT STD_LOGIC_VECTOR(7 Downto 0));
END Main;
Architecture Structure OF Main IS
Component Base_Com is
Port(CLK : IN std_logic;
Reset_In : IN std_logic;
INPR_In : IN std_logic_vector(7 Downto 0);
Instruction : IN std_logic_vector(15 Downto 0);
RunMode : IN std_logic; -- 0 = Normal 1 = Debug;
RunDelay : IN std_logic_vector(2 Downto 0);
MemDispAddr : IN std_logic_vector(11 Downto 0);
Start, Step : IN std_logic := '0';
State : OUT std_logic_vector(2 Downto 0);
AC_Out, DR_Out, IR_Out, TR_Out : OUT std_logic_vector(15 Downto 0);
AR_Out, PC_Out : OUT std_logic_vector(11 Downto 0);
INPR_Out, OUTR_Out : OUT std_logic_vector(7 Downto 0);
Mem_Out : OUT std_logic_vector(15 Downto 0);
Flag_I, Flag_S, Flag_E, Flag_R,
Flag_IEN, Flag_FGI, Flag_FGO : OUT std_logic);
End Component;
Component Keyboard IS
PORT(Clock : IN STD_LOGIC;
Reset : IN STD_LOGIC;
BCState : IN STD_LOGIC_VECTOR(2 Downto 0);
RK : IN STD_LOGIC_VECTOR(3 DOWNTO 1);
DE : OUT STD_LOGIC_VECTOR(3 DOWNTO 1);
Invalid_Key : OUT STD_LOGIC;
IC : OUT STD_LOGIC_VECTOR(7 Downto 0);
PC : OUT STD_LOGIC_VECTOR(7 Downto 0);
ProgState : OUT STD_LOGIC_VECTOR(1 Downto 0);
Key : OUT STD_LOGIC_VECTOR(16 Downto 1);
Ins : OUT STD_LOGIC_VECTOR(15 Downto 0);
BCRunMode : OUT STD_LOGIC;
BCRunDelay : OUT STD_LOGIC_VECTOR(2 Downto 0);
BCStart, BCStep, BCReset : OUT STD_LOGIC);
End Component;
Component Buzzer Is
...
End Component;
Component LEDMatrix is
...
end Component;
Component LCD_Controller is
Port(Clk : IN STD_LOGIC; --system clock
Reset_n : IN STD_LOGIC; --active low reinitializes lcd
LCD_Enable : IN STD_LOGIC; --latches data into lcd controller
LCD_Bus : IN STD_LOGIC_VECTOR(9 DOWNTO 0); --data and control signals
Busy : OUT STD_LOGIC := '1'; --lcd controller busy/idle feedback
RW, RS, E : OUT STD_LOGIC; --read/write, setup/data, and enable for lcd
LCD_Data : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --data signals for lcd
end Component;
Signal Key : STD_LOGIC_VECTOR(16 Downto 1);
Signal KBState : STD_LOGIC_VECTOR(1 Downto 0);
Signal InvalidKey : STD_LOGIC := '0';
Signal LEDRow1, LEDRow2 : STD_LOGIC_VECTOR(7 Downto 0) := "00000000";
Signal LEDRow : STD_LOGIC_VECTOR(7 Downto 0) := "00000001";
Signal BuzOut : STD_LOGIC := '0';
Signal ICBinary : STD_LOGIC_VECTOR(7 Downto 0) := "00000000";
Signal PCBinary : STD_LOGIC_VECTOR(7 Downto 0) := "00000000";
Signal ICTens, ICOnes, PCTens, PCOnes : STD_LOGIC_VECTOR(3 Downto 0) := "0010";
Signal ICSeg1, ICSeg2, PCSeg1, PCSeg2 : STD_LOGIC_VECTOR(7 Downto 0) := "00000000";
Signal Kb_DE : STD_LOGIC_VECTOR(3 Downto 1) := "000";
Signal LCD_Enable : STD_LOGIC;
Signal LCD_Busy : STD_LOGIC;
Signal LCD_Bus : STD_LOGIC_VECTOR(9 Downto 0);
Signal CurrentLCDLine : STD_LOGIC := '0';
------
Signal BCReset, BCRunMode, BCStart, BCStep : std_logic := '0';
Signal BCRunDelay : std_logic_vector(2 Downto 0);
Signal BCState : std_logic_vector(2 Downto 0);
Signal INPR_In : std_logic_vector(7 Downto 0);
Signal Ins : std_logic_vector(15 Downto 0);
Signal AC, DR, IR, TR, Mem : std_logic_vector(15 Downto 0);
Signal AR, PC : std_logic_vector(11 Downto 0);
Signal INPR, OUTR : std_logic_vector(7 Downto 0);
Signal I, S, E, R, IEN, FGI, FGO : std_logic;
------
Signal LCDCounter : Integer range 0 to 32 := 0;
Signal LCDWrite : std_logic := '0';
-- Type LCD_Memory is Array(1 to 208) of std_logic_vector(7 Downto 0);
-- Constant LCDMemory : LCD_Memory :=
--
-- ("01010000", "01010010", "01001111", "01000111", "01010010", "01000001", "01001101", "00100000", -- Line_PK - 1
-- "10110000", "00100000", "01001011", "01000101", "01011001", "00100000", "00111010", "00100000",
--
-- "01000101", "01001110", "01010100", "01000101", "01010010", "00100000", "01010010", "01010101", -- Line_GM - 17
-- "01001110", "00100000", "01001101", "01001111", "01000100", "01000101", "00100000", "00111010",
--
-- "01000101", "01001110", "01010100", "01000101", "01010010", "00100000", "01010010", "01010101", -- Line_GD - 33
-- "01001110", "00100000", "01000100", "01000101", "01001100", "01000001", "01011001", "00111010",
--
-- "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
Begin
BC : Base_Com Port Map(Clock, BCReset, INPR_In, Ins, BCRunMode, BCRunDelay, MemAddr, BCStart, BCStep, BCState,
AC, DR, IR, TR, AR, PC, INPR, OUTR, Mem, I, S, E, R, IEN, FGI, FGO);
LEDRow1 <= Key(16 Downto 9);
LEDRow2 <= Key(8 Downto 1);
KB : Keyboard Port Map(Clock, '0', BCState, Kb_RK, Kb_DE, InvalidKey, ICBinary, PCBinary,
KBState, Key, Ins, BCRunMode, BCRunDelay, BCStart, BCStep, BCReset);
ICTens <= ICBinary(7 Downto 4);
ICOnes <= ICBinary(3 Downto 0);
PCTens <= PCBinary(7 Downto 4);
PCOnes <= PCBinary(3 Downto 0);
LM : LEDMatrix Port Map(Clock, LEDRow1, LEDRow2, LED_Row, LED_Col);
BZ : Buzzer Generic Map(15465)
Port Map(Clock, BuzOut);
LCD : LCD_Controller Port Map(Clock, '1', LCD_Enable, LCD_Bus, LCD_Busy, LCD_RW, LCD_RS, LCD_EN, LCD_Data);
-- MLCD : MUX_LCD Port Map(Clock, LCDSelector, BCState, KBState, BCRunMode, BCRunDelay, Key, Mem, AC, DR, IR, TR,
-- AR, INPR, OUTR, I, S, E, R, IEN, FGI, FGO, LCDText1);
with ICTens Select
ICSeg1 <= "00000110" when "0001", "00111111" when others;
with ICOnes Select
ICSeg2 <= "00000110" when "0001", "01011011" when "0010", "01001111" when "0011", "01100110" when "0100",
"01101101" when "0101", "01111101" when "0110", "00100111" when "0111", "01111111" when "1000",
"01101111" when "1001", "00111111" when others;
with PCTens Select
PCSeg1 <= "00000110" when "0001", "01011011" when "0010", "01001111" when "0011", "01100110" when "0100",
"01101101" when "0101", "01111101" when "0110", "00100111" when "0111", "01111111" when "1000",
"01101111" when "1001", "00111111" when others;
with PCOnes Select
PCSeg2 <= "00000110" when "0001", "01011011" when "0010", "01001111" when "0011", "01100110" when "0100",
"01101101" when "0101", "01111101" when "0110", "00100111" when "0111", "01111111" when "1000",
"01101111" when "1001", "00111111" when others;
DE <= Kb_DE;
with Kb_DE Select
Seg_Out <= ICSeg1 when "000", ICSeg2 when "001", PCSeg1 when "100", PCSeg2 when "101", (others => '0') when others;
Process(InvalidKey, BuzOut)
begin
if (InvalidKey = '1') then
Buz_Out <= BuzOut;
else
Buz_Out <= '0';
end if;
end Process;
-- Process(BCState, BCRunMode, BCRunDelay, KBState, Key, MemAddr, Mem, AC, DR, IR, TR, AR, INPR, OUTR, I, S, E, R, IEN, FGI, FGO)
-- begin
-- LCDWrite <= '1';
-- end Process;
Process(Clock)
begin
if (Clock'Event and Clock = '1') then
-- if LCDWrite = '1' then
if (LCD_Busy = '0' and LCD_Enable = '0') then
LCD_Enable <= '1';
LCDCounter <= LCDCounter + 1;
if (LCDCounter = 17) and (CurrentLCDLine = '0') then
LCD_Bus <= "0011000000";
LCDCounter <= 16;
CurrentLCDLine <= '1';
else
case KBState is
when "00" => -- Program
case LCDCounter is
when 1 =>
LCD_Bus <= "10" & CharArray(25);
when 2 =>
LCD_Bus <= "10" & CharArray(27);
when 3 =>
LCD_Bus <= "10" & CharArray(24);
when 4 =>
LCD_Bus <= "10" & CharArray(16);
when 5 =>
LCD_Bus <= "10" & CharArray(27);
when 6 =>
LCD_Bus <= "10" & CharArray(10);
when 7 =>
LCD_Bus <= "10" & CharArray(22);
when 8 =>
LCD_Bus <= "10" & CharArray(37);
when 9 =>
LCD_Bus <= "10" & CharArray(38);
when 10 =>
LCD_Bus <= "10" & CharArray(37);
when 11 =>
LCD_Bus <= "10" & CharArray(20);
when 12 =>
LCD_Bus <= "10" & CharArray(14);
when 13 =>
LCD_Bus <= "10" & CharArray(34);
when 14 =>
LCD_Bus <= "10" & CharArray(37);
when 15 =>
LCD_Bus <= "10" & CharArray(36);
when 16 =>
LCD_Bus <= "10" & CharArray(37);
when others =>
LCD_Bus <= "10" & CharArray(to_integer(unsigned'("" & Key(LCDCounter - 16))));
end case; -- counter case
when "01" => -- GetMode
case LCDCounter is
when 1 =>
LCD_Bus <= "10" & CharArray(14);
when 2 =>
LCD_Bus <= "10" & CharArray(13);
when 3 =>
LCD_Bus <= "10" & CharArray(29);
when 4 =>
LCD_Bus <= "10" & CharArray(14);
when 5 =>
LCD_Bus <= "10" & CharArray(27);
when 6 =>
LCD_Bus <= "10" & CharArray(37);
when 7 =>
LCD_Bus <= "10" & CharArray(27);
when 8 =>
LCD_Bus <= "10" & CharArray(30);
when 9 =>
LCD_Bus <= "10" & CharArray(23);
when 10 =>
LCD_Bus <= "10" & CharArray(37);
when 11 =>
LCD_Bus <= "10" & CharArray(22);
when 12 =>
LCD_Bus <= "10" & CharArray(24);
when 13 =>
LCD_Bus <= "10" & CharArray(13);
when 14 =>
LCD_Bus <= "10" & CharArray(14);
when 15 =>
LCD_Bus <= "10" & CharArray(37);
when 16 =>
LCD_Bus <= "10" & CharArray(36);
when others =>
if LCDCounter = 17 then
LCD_Bus <= "10" & CharArray(to_integer(unsigned'("" & BCRunMode)));
else
LCD_Bus <= "10" & CharArray(37);
end if;
end case; -- counter case
when "10" => -- GetDelay
case LCDCounter is
when 1 =>
LCD_Bus <= "10" & CharArray(14);
when 2 =>
LCD_Bus <= "10" & CharArray(13);
when 3 =>
LCD_Bus <= "10" & CharArray(29);
when 4 =>
LCD_Bus <= "10" & CharArray(14);
when 5 =>
LCD_Bus <= "10" & CharArray(27);
when 6 =>
LCD_Bus <= "10" & CharArray(37);
when 7 =>
LCD_Bus <= "10" & CharArray(27);
when 8 =>
LCD_Bus <= "10" & CharArray(30);
when 9 =>
LCD_Bus <= "10" & CharArray(23);
when 10 =>
LCD_Bus <= "10" & CharArray(37);
when 11 =>
LCD_Bus <= "10" & CharArray(22);
when 12 =>
LCD_Bus <= "10" & CharArray(24);
when 13 =>
LCD_Bus <= "10" & CharArray(13);
when 14 =>
LCD_Bus <= "10" & CharArray(14);
when 15 =>
LCD_Bus <= "10" & CharArray(37);
when 16 =>
LCD_Bus <= "10" & CharArray(36);
when others =>
if LCDCounter = 17 then
LCD_Bus <= "10" & CharArray(to_integer(unsigned(BCRunDelay)));
else
LCD_Bus <= "10" & CharArray(37);
end if;
end case; -- counter case
when others =>
case LCDCounter is
when 1 =>
if BCState = "110" then
LCD_Bus <= "10" & CharArray(13);
else
LCD_Bus <= "10" & CharArray(27);
end if;
when 2 =>
if BCState = "110" then
LCD_Bus <= "10" & CharArray(24);
else
LCD_Bus <= "10" & CharArray(30);
end if;
when 3 =>
LCD_Bus <= "10" & CharArray(23);
when 4 =>
if BCState = "110" then
LCD_Bus <= "10" & CharArray(14);
else
LCD_Bus <= "10" & CharArray(38);
end if;
when 5 =>
if BCState = "110" then
LCD_Bus <= "10" & CharArray(37);
else
if BCRunMode = '1' then
LCD_Bus <= "10" & CharArray(13);
else
LCD_Bus <= "10" & CharArray(23);
end if;
end if;
when 6|7|8 =>
LCD_Bus <= "10" & CharArray(37);
when others =>
case LCDSelector is
when "0000" => -- Memory
case LCDCounter is
when 9 =>
LCD_Bus <= "10" & CharArray(22);
when 10 =>
LCD_Bus <= "10" & CharArray(14);
when 11 =>
LCD_Bus <= "10" & CharArray(22);
when 12 =>
LCD_Bus <= "10" & CharArray(24);
when 13 =>
LCD_Bus <= "10" & CharArray(27);
when 14 =>
LCD_Bus <= "10" & CharArray(34);
when 15 =>
LCD_Bus <= "10" & CharArray(37);
when 16 =>
LCD_Bus <= "10" & CharArray(36);
when others =>
LCD_Bus <= "10" & CharArray(to_integer(unsigned'("" & Mem(32 - LCDCounter))));
end case;
when "0001" => -- AC
case LCDCounter is
when 9 =>
LCD_Bus <= "10" & CharArray(10);
when 10 =>
LCD_Bus <= "10" & CharArray(12);
when 11 =>
LCD_Bus <= "10" & CharArray(37);
when 12 =>
LCD_Bus <= "10" & CharArray(36);
when 13|14|15|16 =>
LCD_Bus <= "10" & CharArray(37);
when others =>
LCD_Bus <= "10" & CharArray(to_integer(unsigned'("" & AC(32 - LCDCounter))));
end case;
when "0010" => -- DR
case LCDCounter is
when 9 =>
LCD_Bus <= "10" & CharArray(13);
when 10 =>
LCD_Bus <= "10" & CharArray(27);
when 11 =>
LCD_Bus <= "10" & CharArray(37);
when 12 =>
LCD_Bus <= "10" & CharArray(36);
when 13|14|15|16 =>
LCD_Bus <= "10" & CharArray(37);
when others =>
LCD_Bus <= "10" & CharArray(to_integer(unsigned'("" & DR(32 - LCDCounter))));
end case;
when "0011" => -- IR
case LCDCounter is
when 9 =>
LCD_Bus <= "10" & CharArray(18);
when 10 =>
LCD_Bus <= "10" & CharArray(27);
when 11 =>
LCD_Bus <= "10" & CharArray(37);
when 12 =>
LCD_Bus <= "10" & CharArray(36);
when 13|14|15|16 =>
LCD_Bus <= "10" & CharArray(37);
when others =>
LCD_Bus <= "10" & CharArray(to_integer(unsigned'("" & IR(32 - LCDCounter))));
end case;
when "0100" => -- TR
case LCDCounter is
when 9 =>
LCD_Bus <= "10" & CharArray(29);
when 10 =>
LCD_Bus <= "10" & CharArray(27);
when 11 =>
LCD_Bus <= "10" & CharArray(37);
when 12 =>
LCD_Bus <= "10" & CharArray(36);
when 13|14|15|16 =>
LCD_Bus <= "10" & CharArray(37);
when others =>
LCD_Bus <= "10" & CharArray(to_integer(unsigned'("" & TR(32 - LCDCounter))));
end case;
when "0101" => -- AR
case LCDCounter is
when 9 =>
LCD_Bus <= "10" & CharArray(10);
when 10 =>
LCD_Bus <= "10" & CharArray(27);
when 11 =>
LCD_Bus <= "10" & CharArray(37);
when 12 =>
LCD_Bus <= "10" & CharArray(36);
when 13|14|15|16 =>
LCD_Bus <= "10" & CharArray(37);
when others =>
if LCDCounter < 29 then
LCD_Bus <= "10" & CharArray(to_integer(unsigned'("" & AR(32 - LCDCounter - 4))));
else
LCD_Bus <= "10" & CharArray(37);
end if;
end case;
when "0110" => -- INPR
case LCDCounter is
when 9 =>
LCD_Bus <= "10" & CharArray(18);
when 10 =>
LCD_Bus <= "10" & CharArray(23);
when 11 =>
LCD_Bus <= "10" & CharArray(25);
when 12 =>
LCD_Bus <= "10" & CharArray(27);
when 13 =>
LCD_Bus <= "10" & CharArray(37);
when 14 =>
LCD_Bus <= "10" & CharArray(36);
when 15|16 =>
LCD_Bus <= "10" & CharArray(37);
when others =>
if LCDCounter < 25 then
LCD_Bus <= "10" & CharArray(to_integer(unsigned'("" & INPR(32 - LCDCounter - 8))));
else
LCD_Bus <= "10" & CharArray(37);
end if;
end case;
when "0111" => -- OUTR
case LCDCounter is
when 9 =>
LCD_Bus <= "10" & CharArray(24);
when 10 =>
LCD_Bus <= "10" & CharArray(30);
when 11 =>
LCD_Bus <= "10" & CharArray(29);
when 12 =>
LCD_Bus <= "10" & CharArray(27);
when 13 =>
LCD_Bus <= "10" & CharArray(37);
when 14 =>
LCD_Bus <= "10" & CharArray(36);
when 15|16 =>
LCD_Bus <= "10" & CharArray(37);
when others =>
if LCDCounter < 25 then
LCD_Bus <= "10" & CharArray(to_integer(unsigned'("" & OUTR(32 - LCDCounter - 8))));
else
LCD_Bus <= "10" & CharArray(37);
end if;
end case;
when "1000" => -- I
case LCDCounter is
when 9 =>
LCD_Bus <= "10" & CharArray(18);
when 10 =>
LCD_Bus <= "10" & CharArray(37);
when 11 =>
LCD_Bus <= "10" & CharArray(36);
when others =>
if LCDCounter = 17 then
LCD_Bus <= "10" & CharArray(to_integer(unsigned'("" & I)));
else
LCD_Bus <= "10" & CharArray(37);
end if;
end case;
when "1001" => -- S
case LCDCounter is
when 9 =>
LCD_Bus <= "10" & CharArray(28);
when 10 =>
LCD_Bus <= "10" & CharArray(37);
when 11 =>
LCD_Bus <= "10" & CharArray(36);
when others =>
if LCDCounter = 17 then
LCD_Bus <= "10" & CharArray(to_integer(unsigned'("" & S)));
else
LCD_Bus <= "10" & CharArray(37);
end if;
end case;
when "1010" => -- E
case LCDCounter is
when 9 =>
LCD_Bus <= "10" & CharArray(14);
when 10 =>
LCD_Bus <= "10" & CharArray(37);
when 11 =>
LCD_Bus <= "10" & CharArray(36);
when others =>
if LCDCounter = 17 then
LCD_Bus <= "10" & CharArray(to_integer(unsigned'("" & E)));
else
LCD_Bus <= "10" & CharArray(37);
end if;
end case;
when "1011" => -- R
case LCDCounter is
when 9 =>
LCD_Bus <= "10" & CharArray(27);
when 10 =>
LCD_Bus <= "10" & CharArray(37);
when 11 =>
LCD_Bus <= "10" & CharArray(36);
when others =>
if LCDCounter = 17 then
LCD_Bus <= "10" & CharArray(to_integer(unsigned'("" & R)));
else
LCD_Bus <= "10" & CharArray(37);
end if;
end case;
when "1100" => -- IEN
case LCDCounter is
when 9 =>
LCD_Bus <= "10" & CharArray(18);
when 10 =>
LCD_Bus <= "10" & CharArray(14);
when 11 =>
LCD_Bus <= "10" & CharArray(23);
when 12 =>
LCD_Bus <= "10" & CharArray(37);
when 13 =>
LCD_Bus <= "10" & CharArray(36);
when others =>
if LCDCounter = 17 then
LCD_Bus <= "10" & CharArray(to_integer(unsigned'("" & IEN)));
else
LCD_Bus <= "10" & CharArray(37);
end if;
end case;
when "1101" => -- FGI
case LCDCounter is
when 9 =>
LCD_Bus <= "10" & CharArray(15);
when 10 =>
LCD_Bus <= "10" & CharArray(16);
when 11 =>
LCD_Bus <= "10" & CharArray(18);
when 12 =>
LCD_Bus <= "10" & CharArray(37);
when 13 =>
LCD_Bus <= "10" & CharArray(36);
when others =>
if LCDCounter = 17 then
LCD_Bus <= "10" & CharArray(to_integer(unsigned'("" & FGI)));
else
LCD_Bus <= "10" & CharArray(37);
end if;
end case;
when "1110" => -- FGO
case LCDCounter is
when 9 =>
LCD_Bus <= "10" & CharArray(15);
when 10 =>
LCD_Bus <= "10" & CharArray(16);
when 11 =>
LCD_Bus <= "10" & CharArray(24);
when 12 =>
LCD_Bus <= "10" & CharArray(37);
when 13 =>
LCD_Bus <= "10" & CharArray(36);
when others =>
if LCDCounter = 17 then
LCD_Bus <= "10" & CharArray(to_integer(unsigned'("" & FGO)));
else
LCD_Bus <= "10" & CharArray(37);
end if;
end case;
when others =>
null;
end case;
end case;
end case;
if LCDCounter = 32 then
LCDCounter <= 0;
CurrentLCDLine <= '0';
end if;
else
LCD_Enable <= '0';
end if;
-- else
-- LCD_Enable <= '0';
-- end if;
end if;
end Process;
End Structure;
I declared an array as Memory for LCD characters, but it increased LUTs !, then I changed Process to make LCD character changing sequential but no chance to decrease used LUTs.
How I can declare an array that uses BlockRam instead of LUTs ?
Best Answer
Put your character data into BlockRAM instead of using LUTs as distributed RAM.