Давненько ничего не было про 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?

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

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

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

Последние комментарии
  • Загрузка...
Счетчик
Яндекс.Метрика