Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> VHDL

Контроллер двойного 7-сегментного дисплея VHDL для твердотельного накопителя Pmod — простая интеграция с FPGA

В этой статье я представлю модуль VHDL, способный отображать двузначное число на SSD Pmod:Seven-Segment Display от Digilent. Двойной 7-сегментный дисплей совместим с интерфейсом Pmod, что означает, что вы можете использовать его без пайки. Он подходит к разъему Pmod, который является стандартным для многих плат разработки FPGA.

Чтобы протестировать реализацию VHDL, я использую Lattice iCEstick, недорогую плату разработки FPGA с разъемом Pmod. В дополнение к iCEstick вам понадобится кабель-разветвитель Pmod с 2 × 6-контактными разъемами на двойной 6-контактный для преобразования параллельного разъема Pmod на iCEstick в последовательную версию вилки, которую ожидает 7-сегментный дисплей. Наконец, я рекомендую приобрести удлинительный кабель USB типа A, поскольку подключать iCEstick напрямую к USB-порту компьютера нецелесообразно.

Как работают 7-сегментные дисплеи

На рынке представлено множество различных 7-сегментных дисплеев. Количество цифр у них разное, равно как и физический интерфейс и распиновка. Общее решение, охватывающее все возможные 7-сегментные дисплеи, с которыми вы можете столкнуться, вероятно, не будет очень удобным для пользователя. Однако вы можете взять за основу код, представленный в этой статье, и изменить его под свои нужды.

Изображение выше взято из таблицы данных модуля Digilent Pmod. Он показывает, как 7-сегментный дисплей подключается к контактам Pmod. Эти контакты напрямую доступны для FPGA на iCEstick.

Семь контактов управляют одним сегментом дисплея. При подаче на такой вывод высокого логического значения на дисплее загорится соответствующий сегмент. Но на этом дисплее две цифры, и мы можем управлять одновременно только одной. Контакт P4/C разъема J2 выбирает ту или иную цифру. Когда логическое напряжение на этом выводе равно '0' , загорается правая цифра, если это '1' , активируется левая цифра.

Десятичная точка «DP» не подключена и недоступна.

Сущность

Код ниже показывает сущность нашего модуля VHDL seg7. У сущности есть общий порт с константой с именем clk_cnt_bits. . Он определяет длину внутреннего счетчика, который контролирует частоту обновления дисплея, частоту чередования левой и правой цифр.

Точная частота не имеет существенного значения. Выбирайте длину счетчика, лежащую в диапазоне от 50 до пары сотен Герц. Формула, определяющая частоту обновления:refresh_hz =2clk_cnt_bits / clk_hz. .

entity seg7 is
 generic (
 -- refresh_hz = (2 ** clk_cnt_bits) / clk_hz
 clk_cnt_bits : integer
 );
 port (
 clk : in std_logic;
 rst : in std_logic;
 value : in integer range 0 to 99;
 segments : out std_logic_vector(6 downto 0);
 digit_sel : out std_logic
 );
end seg7;

Помимо часов и сброса, у сущности есть один входной сигнал:значение, отображаемое на 7-сегментном дисплее. value сигнал — это целочисленный тип, ограниченный диапазоном от 0 до 99, поскольку это единственные числовые значения, которые можно отобразить, используя только две цифры.

Выходными сигналами являются семь сегментов в виде вектора и сигнал выбора цифры для выбора левой или правой цифры для подсветки.

Представление двоично-десятичного числа

Для представления цифр, отображаемых на дисплее, мы будем использовать формат, известный как двоично-десятичный формат (BCD). Хотя двоичное представление является наиболее эффективным способом хранения десятичного числа, мы сталкиваемся с проблемами при попытке разделить его на левую и правую цифры для отображения на дисплее. Мы не можем отличить десятичные цифры, просто разрезав вектор, используемый для хранения числа.

subtype digit_type is integer range 0 to 9;
type digits_type is array (1 downto 0) of digit_type;
signal digit : digit_type;
signal digits : digits_type;

Как показано в приведенном выше коде, мы объявляем подтип целого числа в диапазоне от 0 до 9 для описания значения, которое может быть представлено одной десятичной цифрой. Затем мы объявляем новый тип массива, который может содержать два таких значения BCD. digit Сигнал содержит номер, отображаемый в данный момент либо в левой, либо в правой части дисплея. С другой стороны, digits Сигнал содержит отдельные десятичные символы для двух цифр, какими они будут отображаться для человека, просматривающего экран.

Преобразовать десятичное число в BCD

Входные данные этого модуля:value. , — целое число в диапазоне от 0 до 99, двоичное представление числа. Нам нужно преобразовать это единственное целое число в два целых числа в диапазоне от 0 до 9, BCD.

Стандартным алгоритмом для этого является Double Dabble, также известный как shift-and-add-3. алгоритм. Хотя это нормально, в нашем случае я выберу более короткое решение, поскольку нам нужно разделить только две цифры.

digits(1) <= value / 10;
digits(0) <= value - ((value / 10) * 10);

Используя целочисленное деление, как показано в приведенном выше коде, мы можем выделить наиболее значимую десятичную цифру и присвоить ее digits(1). сигнал. Чтобы получить младшую значащую цифру, мы можем вычесть старшую значащую цифру из value. сигнал, оставляя нам только номер, который нужно присвоить digits(0) сигнал.

Подсчет тактов

Задержка времени в FPGA — это просто вопрос подсчета тактов. Период тактов — единственный предсказуемый временной интервал, на который вы можете положиться в своем коде VHDL. Код ниже показывает clk_count. сигнал, который мы используем для подсчета тактов. clk_cnt_bits Generic определяет, сколько бит зарезервировать для этого беззнакового сигнала.

signal clk_cnt : unsigned(clk_cnt_bits - 1 downto 0);

Точная частота обновления дисплея имеет меньшее значение, поэтому я выбрал здесь беззнаковый тип. Это позволяет нам использовать самоперенос беззнакового сигнала. Все, что нам нужно сделать, это увеличивать счетчик по каждому нарастающему фронту тактового сигнала. Код ниже показывает синхронный процесс со сбросом, который решает эту проблему.

COUNT_PROC : process(clk)
begin
 if rising_edge(clk) then
 if rst = '1' then
 clk_cnt <= (others => '0');
 
 else
 clk_cnt <= clk_cnt + 1;
 
 end if;
 end if;
end process;

Чередование цифр

Теперь, когда у нас работает автономный счетчик, мы можем использовать старший бит (MSB) сигнала беззнакового счетчика для переключения между двумя разрядами. Старший бит чередуется с '0'. и '1' с рабочим циклом 50%. Первая строка кода ниже устанавливает digit_sel сигнал на основе значения старшего бита. Вторая строка реализует мультиплексор, в котором старший разряд используется в качестве селектора. Он пересылает значение активной цифры из digits. массив в digit сигнал.

digit_sel <= clk_cnt(clk_cnt'high);
digit <= digits(0) when clk_cnt(clk_cnt'high) = '0' else digits(1);

BCD в 7-сегментный кодер


Последним шагом модуля seg7 является преобразование BCD, хранящегося в digit. сигнал к визуальному представлению на 7-сегментном дисплее. В приведенном ниже коде показан процесс, который достигает этого с помощью оператора case.

Позиция в векторе каждого битового литерала соответствует одному сегменту на дисплее. Индекс 0 соответствует сегменту A, индекс 1 – B и т. д. вплоть до индекса 6, который управляет сегментом G. Сопоставления сегментов с векторными индексами взяты из таблицы данных для 7-сегментного дисплея Digilent.

ENCODER_PROC : process(digit)
begin
 case digit is
 
 when 0 => segments <= "0111111";
 when 1 => segments <= "0000110";
 when 2 => segments <= "1011011";
 when 3 => segments <= "1001111";
 when 4 => segments <= "1100110";
 when 5 => segments <= "1101101";
 when 6 => segments <= "1111101";
 when 7 => segments <= "0000111";
 when 8 => segments <= "1111111";
 when 9 => segments <= "1101111";
 
 end case;
end process;

Вывод

Модуль VHDL seg7 будет отображать на дисплее все, что вы назначите value. входной сигнал. В тестовом стенде мы увеличиваем value. сигнал раз в секунду. Затем мы моделируем чуть более 100 секунд, чтобы можно было наблюдать точку переноса value. счетчик.

Форма сигнала выше взята из ModelSim. Он показывает первую часть моделирования, где значение рассчитывается от 0 до 15. Мы видим, что числа в digits массив также учитывается. Те самые (0) подсчитываются каждый раз, когда value сигнал меняется, а десятки (1) увеличивается на каждое десятое число.

Вы можете скачать проект ModelSim, включая тестовый стенд, используя форму ниже.

Если вы реализуете модуль seg7 в качестве верхнего модуля FPGA, на дисплее, скорее всего, будет отображаться стабильное «00». Это потому, что '0' — наиболее распространенное значение по умолчанию, присваиваемое неинициализированным сигналам в FPGA. Когда value сигнал будет установлен на все нули, на дисплее отобразится именно это.

Чтобы перебрать все возможные входные числа, я создал модуль-оболочку VHDL, который увеличивает value. сигнал десять раз в секунду. Затем я создал экземпляр модуля seg7 в оболочке, прежде чем реализовать дизайн на Lattice iCEstick. Зацикленное видео в формате Gif ниже показывает, как реализованный дизайн выглядит на 7-сегментном дисплее.

Покупка твердотельного накопителя Pmod:семисегментный дисплей

7-сегментный дисплей, используемый в этой статье, разработан компанией Digilent. Вы можете приобрести модуль Pmod в интернет-магазине Digilent или получить его у одного из многочисленных реселлеров. В приведенном ниже списке я дал ссылку на страницу продукта для показа в нескольких интернет-магазинах электроники, где этот товар продается.

Обратите внимание:если вы хотите использовать 7-сегментный дисплей Digilent с Lattice iCEstick , или любой другой платы разработки FPGA, имеющей 6x2-контактный разъем Pmod, вам также понадобится кабель-разветвитель. Кабель можно приобрести в компании Digilent. , Цифровой ключ , Маузер и RS Electronics .

Кроме того, все компоненты можно приобрести у различных продавцов на Amazon и eBay.

Курс VHDL с использованием 7-сегментного дисплея Digilent

Я запустил новый курс VHDL и FPGA для начинающих. В курсе я использую 7-сегментный дисплей от Digilent и плату разработки Lattice iCEstick FPGA для обучения VHDL. Нажмите на ссылку ниже, чтобы узнать больше о курсе!

Ускоренное внедрение FPGA и VHDL:

Практическое руководство для начинающих

Вы знакомы с программированием, но плохо знакомы с VHDL?

Вам нужно краткое введение в эту незнакомую тему?

Ваше расписание занято и времени на учебу не осталось?

Разберитесь с основами разработки FPGA с использованием VHDL за несколько вечеров! Этот курс предназначен для ИТ-специалистов и студентов, которым необходимо быстро освоить предмет. С помощью этого курса и недорогой платы разработки Lattice iCEstick вы сможете разработать настоящее оборудование за считанные часы.

Нажмите здесь, чтобы узнать больше и зарегистрироваться:
Ускоренный подход к FPGA и VHDL:практическое руководство для начинающих


VHDL

  1. Подписанный и неподписанный в VHDL
  2. Как использовать процедуру в процессе в VHDL
  3. Базовая викторина VHDL — часть 3
  4. Как создать кольцевой буфер FIFO в VHDL
  5. Как использовать условные операторы в VHDL:If-Then-Elsif-Else
  6. Как использовать константы и общую карту в VHDL
  7. Как использовать процедуру в VHDL
  8. Начало работы с VUnit
  9. Как создать эффект дышащего светодиода, используя синусоиду, хранящуюся в оперативной памяти блока
  10. Как создать таймер в VHDL