Урок 3 Работа с ЖКИ На плате EP3C10 DevBoard , кроме светодиодов, в качестве устройства вывода информации, имеется также семисегментный знакосинтезирующий ЖКИ. Цель этого урока – освоить работу с устройством, для того, чтобы в дальнейшем использовать его для вывода данных, которые могут быть полезны в процессе отладки сложных схем. Тип установленного индикатора S2X1C50, с документацией на него можно ознакомиться здесь http://www.lumex.com/specs/LCD-S2X1C50TR.pdf Информация о подключение к выводам ПЛИС сведена в таблицу. Расположение сегментов показано на рисунке Итак, это семисегментный, 2.5 цифровой индикатор со статическим управлением. Он позволяет отображать цифры от 0 до 199 а также две буквы из ряда A, b, C, d, E. Теория гласит: для того, чтобы сегмент ЖКИ «сработал», то есть переключился в непрозрачное состояние, нужно приложить между ним и подложкой переменное напряжение величиной 3-5 Вольт и частотой 60 Герц. БОльшая частота может вызвать паразитную подсветку ближайших сегментов, меньшая частота может сделать мигание сегмента видимым для глаза. Это может показаться странным, но на плату не приходит специальное переменное напряжение для работы с дисплеем, отсутствуют какие-либо цепи для его формирования, дисплей просто подключен к выводам ПЛИС напрямую. Так как же будет происходить управление сегментами согласно теории ? Все очень просто. На подложку дисплея, которая является общей для всех сегментов (вывод COM), будет подано напряжение логического уровня с соответствующего вывода ПЛИС, с частотой 60 Герц и скважностью 1 (меандр). На все сегменты дисплея будет также подан точно такой же сигнал как и на подложку и синхронизированный с ним с точностью до фазы. Разность потенциалов между подложкой и сегментами будет равна практически нулю и индикации не будет. Но как только, напряжение на интересующем нас сегменте изменит фазу на 180 градусов, то есть в тот момент где был 0 станет 1 и наоборот, разница напряжений составит искомые 3 Вольта нужной частоты. Подробнее на рисунке. Для начала, попробуем «засветить» все имеющиеся сегменты индикатора. Добавим в список переменных основного модуля новые выходы для подключения к выводам ЖКИ // Модуль Мигание светодиодами module LED_Blinking ( input [4:0] Buttons, output reg [12:0] Port_LED, input PLL1_in, output COM, LCD_1, output [6:0]LCD_2, LCD_3 ); Чтобы не утруждать себя описанием каждого сегмента, зададим для второй и третьей цифры две шины, шириной 7 бит каждая, договоримся, что младший бит будет сегментом A а старший G. После компиляции проекта, нужно назначить выводы ПЛИС соответствующим выводам ЖКИ. AssigmentsPin planner. Создадим в нашем проекте новый модуль с названием LCD module LCD (clk_10kHz, dig_1, dig_2, dig_3 , COM, LCD_1,LCD_2, LCD_3) input clk_10kHz; input dig_1; input [3:0] dig_2; input [3:0] dig_3; output reg COM; output reg LCD_1; output reg [3:0] LCD_2; output reg [3:0] LCD_3; // Код модуля endmodule Три сигнала являются входными для модуля, clk_10kHz для синхронизации, dig_1, dig_2 и dig_3 будут указывать модулю какие символы нужно отобразить в соответствующем знакоместе. Выходные сигналы COM, LCD_1, LCD_2 и LCD_3 – это подключение к сегментам индикатора через выводы ПЛИС. Напишем следующий код для нашего нового модуля // Код модуля reg [15:0] cnt; always @(posedge clk_10kHz) begin if (cnt == 160) begin cnt <= cnt + 1; // COM <= 0; LCD_1 <= 1; LCD_2 <= 7'b1111111; LCD_3 <= 7'b1111111; end else if (cnt == 320) begin cnt <= 0; // COM <= ~COM; LCD_1 <= ~LCD_1; LCD_2 <= ~LCD_2; LCD_3 <= ~LCD_3; end else cnt <= cnt + 1; Код достаточно простой, через равные промежутки времени, примерно соответствующие полупериоду частоты 60Герц, схема устаналивает поочередно логическую 1 на всех сегментах, либо инвертирует уровни относительно подложки COM. Чтобы испытать код, подключим его к основному модулю. // reg dig_1; reg [3:0] dig_2, dig_3; LCD (clk_10kHz, dig_1, dig_2, dig_3, COM, LCD_1, LCD_2, LCD_3); Скомпилировав проект и прошив плату, можно убедиться что все сегменты индикатора исправно работают. Теперь нужно написать код знакосинтезатора, который позволял бы отображать символы, заданные модулю через переменные dig_1, dig_2, dig_3. В модуле LCD… // Код модуля reg [15:0] cnt; always @(posedge clk_10kHz) begin if (cnt == 160) begin cnt <= cnt + 1; // COM <= 0; LCD_1 <= dig_1; case (dig_2) 0:LCD_2 <= 7'b 0111111; 1:LCD_2 <= 7'b 0000110; 2:LCD_2 <= 7'b 1011011; 3:LCD_2 <= 7'b 1001111; 4:LCD_2 <= 7'b 1100110; 5:LCD_2 <= 7'b 1101101; 6:LCD_2 <= 7'b 1111101; 7:LCD_2 <= 7'b 0000111; 8:LCD_2 <= 7'b 1111111; 9:LCD_2 <= 7'b 1101111; 10:LCD_2 <= 7'b 1110111; 11:LCD_2 <= 7'b 1111100; 12:LCD_2 <= 7'b 0111001; 13:LCD_2 <= 7'b 1011110; 14:LCD_2 <= 7'b 1111001; 15:LCD_2 <= 7'b 1110001; endcase case (dig_3) 0:LCD_3 <= 7'b 0111111; 1:LCD_3 <= 7'b 0000110; 2:LCD_3 <= 7'b 1011011; 3:LCD_3 <= 7'b 1001111; 4:LCD_3 <= 7'b 1100110; 5:LCD_3 <= 7'b 1101101; 6:LCD_3 <= 7'b 1111101; 7:LCD_3 <= 7'b 0000111; 8:LCD_3 <= 7'b 1111111; 9:LCD_3 <= 7'b 1101111; 10:LCD_3 <= 7'b 1110111; 11:LCD_3 <= 7'b 1111100; 12:LCD_3 <= 7'b 0111001; 13:LCD_3 <= 7'b 1011110; 14:LCD_3 <= 7'b 1111001; 15:LCD_3 <= 7'b 1110001; endcase end else if (cnt == 320) begin cnt <= 0; // COM <= ~COM; LCD_1 <= ~LCD_1; LCD_2 <= ~LCD_2; LCD_3 <= ~LCD_3; end else cnt <= cnt + 1; end Код работает очень просто, каждому значению входной переменной присваивается нужная комбинация из включенных сегментов. Теперь можно пользоваться новой возможностью и отображать на дисплее полезную информацию. Весь модуль целесообразно перенести в отдельный файл, как было показано во втором уроке. Сделаем так, что бы при переключении эффектов кнопками, на индикаторе показывался бы его номер. Добавим одну строку в код основного модуля, после определения нажатой кнопки always @(posedge clk_10kHz) begin if (Btn != 0) blink <= Btn; dig_3 <= blink; // Номер нажатой кнопки для третьей цифры // case (blink) В соответствии с нажатой кнопкой, на дисплее будет появляться ее номер и можно будет определить какой эффект работает в данный момент. Всего за три урока, мы прошли путь от основ работы со средой Quartus до разработки функционального устройства, использующего основные возможности для ввода-вывода информации, предлагаемые платой разработчика EP3C10 DevBoard. Это лишь старт, простейший пример, один из огромного множества того, что можно реализовать с помощью этой платы. Исходный код проекта LED_Blinking можно скачать здесь http://sdr-deluxe.com/downloads/LED_Blinking.rar Большое количество проектов для ПЛИС можно найти здесь http://marsohod.org А также здесь http://we.easyelectronics.ru/blog/plis и здесь http://opencores.org/projects