Содержание
Урок 1. Первый проект
Урок 2. Управление кнопками
Урок 3. Подключение LCD
Урок 4. Использование ШИМ
Урок 5. Таймеры
Урок 6.1. Статическая индикация
Урок 6.2. Динамическая индикация
Урок 7.1. Генерация звука
Урок 7.2. Генерация звука. Продолжение
Урок 8.1. Передача данных через UART
Урок 8.2. Передача данных через UART. Продолжение»
Урок 9. Передача данных через SPI
Урок 10. Изучение АЦП. Простой вольтметр
Урок 11. Получение синуса при помощи ШИМ
Урок 12. Измерение температуры
Урок 13. Внешние прерывания.
Урок 14. Использование отладчика
Урок 15.1. Управление инкрементальным энкодером
Урок 15.2. Управление громкостью, при помощи энкодера
Урок 16. Управление RGB светодиодом
Урок 17. Использование ИК
Урок 18.1. Знакомство с графическим дисплеем
Урок 18.2 Вывод изображения на графический дисплей
Урок 18.3 Вывод русскоязычного текста
Урок 19. Формирование сигнала, при помощи ЦАП (R2R)
Урок 20. Опрос матричной клавиатуры
Урок 21. Сторожевой таймер
Урок 22.1 Воспроизведение wav. Введение.
Урок 22.2 Воспроизведение wav. Продолжение.
Урок 23.1 Работа с внешней памятью
Урок 23.2 Работа с файловой системой Fat

Давненько ничего не было про FPGA. Лень поборола меня окончательно 🙂

Надо сказать, что про плисины не забываю, не сказать что много им времени уделяю, но периодически экпериментировал. Каждый раз мои эксперименты упирались в железо, точнее в лень. Хоть на руках и имеется de-0 nano, но все на штырьках, хоть и кажется что их много, на деле это не так. Это каждый раз нужно, отсоединить, схему собрать, разобрать — геморой.

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

В итоге долго размышляя, решил я себе запилить платку. Свою, такую какую хочу. Без излишеств, для быстрой проверки. Запилил туда VGA разъем, семисегментник, usb-uart, разъем под символьный дисплей, пару светодиодов, резисторный цап с выходом на наушники, пару кнопок, атмегу8 (просто потому что у меня их много и может в паре с плис какие интерфейсы поотлаживать).
demo_board

В качестве камня выбрал cpld emp540, по цене/количеству логических элементов мне он показался оптимальным. Я долго думал стоит ли ставить какую нибудь трушную плисину, в итоге решил что если мне такая понадобится, то сделаю отдельную плату более ядреную.

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

Здесь же оставлю простенький пример динамической индикации. Вывод символов «FPGA». Может кому пригодится.

module demo_board(clk, digit, ind1, ind2, ind3, ind4);

input clk;
output reg [3:0]digit;

reg [15:0]count = 1'b0;
reg [1:0]dynamic_temp = 1'b0;

output reg [7:0]ind1 = 8'b11111110;
output reg [7:0]ind2 = 8'b11111110;
output reg [7:0]ind3 = 8'b11111110;
output reg [7:0]ind4 = 8'b11111110;

always @ (posedge clk) begin
  
  count <= count + 1'b1;           //задаем частоту переключения между индикаторами   
  if(count == 0)                   //по входной тактовой частоте
  begin
    dynamic_temp <= dynamic_temp + 1'b1; //переключаемся между индикаторами
  end
  
  case(dynamic_temp)
    2'b00 :  
    begin
     ind1 = 8'b10001110;  //выводим символ 'f'
     digit = 4'b1110;     //Зажигаем первый индикатор
    end
	 
    2'b01 :  
    begin
     ind2 = 8'b10001100;  //выводим символ 'p'
     digit = 4'b1101;     //Зажигаем второй индикатор
    end 
    
    2'b10 :  
    begin
     ind3 = 8'b01000010;  //выводим символ 'g'
     digit = 4'b1011;     //Зажигаем третий индикатор
    end
	 
    2'b11 : 
    begin
     ind4 = 8'b10001000;  //выводим символ 'a'
     digit = 4'b0111;     //Зажигаем четвертый индикатор
    end
  endcase

end 


endmodule

Немного о том как это работает. Вначале нужно задать частоту переключения между индикаторами. Создаем 16 битную переменную count и каждый такт увеличиваем ее, когда она достигнет максимума, то на следующем такте обнулится. Для экономии логических элементов, лучше проверять равен ли результат нулю.

Какую выбрать частоту переключений? Тут есть несколько важных критериев, частота делится относительно входного клока clk, который идет от генератора. Чем на меньшее число вы делите, тем больше экономите логических элементов, тем выше частота, чем выше частота, тем тухлее светят индикаторы. Если сделать маленькую частоту обновления, то будет мерцать. Я чуток поэкспериментировал, на мой взгляд от 60 до 800Гц наиболее подходящий диапазон.

В моем случае, на плате стоит генератор на 27МГц, если поделить на count = 2^16 и так как индикатора 4, то обновление будет ~100Гц, вполне нормально.

В общем то, логика проста каждые 2^16 тактов переключается переменная dynamic_temp. Дальше идет обычный switch, который переключает индикаторы digit. Число или знак который нужно вывести на индикатор задается в ind1, ind2, ind3, ind4.

demo_fpga

2 комментария: ПЛИС. Динамическая индикация

  • Илья:

    Здравствуйте! Не очень понял почему используется 2 переменных ind1 и ind2? Почему нельзя использовать одну ind?

  • admin:

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Счетчик
Яндекс.Метрика