2013-10-24 1 views
0

Я нашел этот код, который управляет ЖК-дисплей с FPGA, но он не может видеть, чтобы понять некоторые из кода, в частности, эта частьУправление ЖК в VHDL на спартанский 6

type LCD_CMDS_T is array(integer range <>) of std_logic_vector(9 downto 0); 
    constant LCD_CMDS : LCD_CMDS_T := (0 => "00"&X"3C",   --Function Set 
         1 => "00"&X"0C",    --Display ON, Cursor OFF, Blink OFF 
         2 => "00"&X"01",    --Clear Display 
         3 => "00"&X"02",   --return home 

         4 => "10"&X"48",   --H 
         5 => "10"&X"65",   --e 
         6 => "10"&X"6C",   --l 
         7 => "10"&X"6C",   --l 
         8 => "10"&X"6F",   --o 
         9 => "10"&X"20",   --blank 
         10 => "10"&X"46",   --F 
         11 => "10"&X"72",   --r 
         12 => "10"&X"6F",   --o 
         13 => "10"&X"6D",   --m 

         14 => "10"&X"20",   --blank 

         15 => "10"&X"44",   --D 
         16 => "10"&X"69",   --i 
         17 => "10"&X"67",   --g 
         18 => "10"&X"69",   --i 
         19 => "10"&X"6C",   --l 
         20 => "10"&X"65",   --e 
         21 => "10"&X"6E",   --n 
         22 => "10"&X"74",   --t 
         23 => "00"&X"18");   --Shift left 


signal lcd_cmd_ptr : integer range 0 to LCD_CMDS'HIGH + 1 := 0; 

Я понимаю, что был создан массив для хранения значений символов, отображаемых на дисплее. но я не понимаю эту строку.

signal lcd_cmd_ptr : integer range 0 to LCD_CMDS'HIGH + 1 := 0; 

Может кто-нибудь помочь мне понять, Что сделано здесь

ответ

2

Этот сигнал создается для индекса в строку, которая была создана. Постоянный LCD_CMDS - это массив, который необходимо индексировать. Сигнал lcd_cmd_ptr индексируется в эту константу для управления дисплеем. В этом случае это целое число, которое может быть от 0 до 23.

Держу пари, где есть линия, которая имеет: LCD_CMDS (lcd_cmd_ptr)

+0

Да, есть: 'JB (4) <= LCD_CMDS (lcd_cmd_ptr) (9); \t \t JB (5) <= LCD_CMDS (lcd_cmd_ptr) (8); \t \t JA <= LCD_CMDS (lcd_cmd_ptr) (7 downto 0); ' как эта работа тогда JA получила значение бит 9, также означает, что «LCD_CMDS« высокий »означает, что немного запутано на этом – user1175889

+0

Так lcd_cmd_ptr действует как среднее, чтобы пройти через строку массивов, точно так же, как, например, int i, for (i = 0, i <10, i ++) '' i 'будет использоваться для прохождения цикла "for"? – user1175889

+0

Я не уверен, что JA и JB используются для чего-то с ЖК-дисплеем. Tick ​​High (высокий) является атрибутом VHDL. Вот список всех атрибутов VHDL: http://www.csee.umbc.edu/portal/help/VHDL/attribute.html. Он используется для получения максимального значения и вставляет его в код. Да к вашему второму вопросу, это точно так же, как цикл for в C. – Russell

1
signal lcd_cmd_ptr : integer range 0 to LCD_CMDS'HIGH + 1 := 0; 

Этот код определяет сигнал, который может варьироваться от 0 до «независимо самый высокий показатель в массиве LCD_CMDS равен + 1».

Атрибуты 'tick' в VHDL очень полезны для написания общего кода. Для того, чтобы быть полностью универсален, линия выше должна быть:

signal lcd_cmd_ptr : integer range LCD_CMDS'low to LCD_CMDS'HIGH + 1; 

тогда, если кто-то удалил запись для элемента 0 в массиве, то сигнал будет иметь более ограниченный диапазон. Обратите внимание, что явно не инициализируется «0» в исходном случае и LCD_CMDS'LOW в самом общем случае. Спецификация VHDL гарантирует, что целые числа всегда инициализируются наименьшим значением, которое им разрешено иметь.

Если сигнал выше, только нужно идти до самого высокого значения в массиве, вы могли бы написать более сжато:

signal lcd_cmd_ptr : integer range LCD_CMDS'range; 

Опять же, не требуется никакая явная инициализации.

+0

Спасибо за это объяснение. – user1175889

Смежные вопросы